R 包 mlr:classif.ksvm 中自定义内核的选项
R package mlr: option for custom kernels in classif.ksvm
我想用自定义内核构建一个 svm
。
通常我为此使用 R 包 kernlab
。
因为,我想尝试不同的内核并调整超参数,所以我想使用 nice 包 mlr
。但是,据我所知,它不支持内核类型选项 "matrix" 将自定义内核传递给 ksvm 学习器 ("classif.ksvm")。
有人知道是否有解决这个问题的计划吗?或者如果有另一个包允许自定义内核和用于调整参数和重采样方法的漂亮包装器。据我所知,插入符号包也不采用自定义内核。
我们没有任何支持它的计划。不过,您可以很容易地定义一个自定义学习器来支持这一点。据我所知(未经测试)classif.ksvm
有两个更改。
首先,允许内核参数的新参数值:
makeDiscreteLearnerParam(id = "kernel", default = "rbfdot",
values = c("vanilladot", "polydot", "rbfdot", "tanhdot", "laplacedot", "besseldot", "anovadot", "splinedot", "matrix"))
然后,更改训练函数以考虑新内核:
trainLearner.classif.ksvm = function(.learner, .task, .subset, .weights = NULL, degree, offset, scale, sigma, order, length, lambda, normalized, ...) {
kpar = learnerArgsToControl(list, degree, offset, scale, sigma, order, length, lambda, normalized)
f = getTaskFormula(.task)
pm = .learner$predict.type == "prob"
parlist = list(...)
if (base::length(kpar) > 0L)
kernlab::ksvm(f, data = getTaskData(.task, .subset), kpar = kpar, prob.model = pm, ...)
else if (parlist$kernel == "matrix")
kernlab::ksvm(kernlab::as.kernelMatrix(getTaskData(.task, .subset)), data = getTaskData(.task, .subset), prob.model = pm, ...)
else
kernlab::ksvm(f, data = getTaskData(.task, .subset), prob.model = pm, ...)
}
这是假设您在任务中传递的数据定义了自定义内核,这有点笨拙...
我想用自定义内核构建一个 svm
。
通常我为此使用 R 包 kernlab
。
因为,我想尝试不同的内核并调整超参数,所以我想使用 nice 包 mlr
。但是,据我所知,它不支持内核类型选项 "matrix" 将自定义内核传递给 ksvm 学习器 ("classif.ksvm")。
有人知道是否有解决这个问题的计划吗?或者如果有另一个包允许自定义内核和用于调整参数和重采样方法的漂亮包装器。据我所知,插入符号包也不采用自定义内核。
我们没有任何支持它的计划。不过,您可以很容易地定义一个自定义学习器来支持这一点。据我所知(未经测试)classif.ksvm
有两个更改。
首先,允许内核参数的新参数值:
makeDiscreteLearnerParam(id = "kernel", default = "rbfdot",
values = c("vanilladot", "polydot", "rbfdot", "tanhdot", "laplacedot", "besseldot", "anovadot", "splinedot", "matrix"))
然后,更改训练函数以考虑新内核:
trainLearner.classif.ksvm = function(.learner, .task, .subset, .weights = NULL, degree, offset, scale, sigma, order, length, lambda, normalized, ...) {
kpar = learnerArgsToControl(list, degree, offset, scale, sigma, order, length, lambda, normalized)
f = getTaskFormula(.task)
pm = .learner$predict.type == "prob"
parlist = list(...)
if (base::length(kpar) > 0L)
kernlab::ksvm(f, data = getTaskData(.task, .subset), kpar = kpar, prob.model = pm, ...)
else if (parlist$kernel == "matrix")
kernlab::ksvm(kernlab::as.kernelMatrix(getTaskData(.task, .subset)), data = getTaskData(.task, .subset), prob.model = pm, ...)
else
kernlab::ksvm(f, data = getTaskData(.task, .subset), prob.model = pm, ...)
}
这是假设您在任务中传递的数据定义了自定义内核,这有点笨拙...