我想用自定义内核构建svm
。
通常我会使用R包kernlab
。
因为,我想尝试不同的内核并调整超参数,我想使用漂亮的包mlr
。但是,据我所知,它并不支持内核类型选项" matrix"将自定义内核传递给ksvm学习器(" classif.ksvm")。
有人知道是否有计划解决这个问题?或者,如果有另一个包允许自定义内核和很好的包装器来调整参数和重新采样方法。据我所知,插入符号包也没有采用自定义内核。
答案 0 :(得分:3)
我们没有任何计划支持这一点。您可以定义一个自定义学习器来轻松支持这一点。据我所知,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, ...)
}
这假设您在任务中传递的数据定义了自定义内核,这有点笨拙......