1

我想svm用自定义内核构建一个。通常我为此使用 R 包kernlab。因为,我想尝试不同的内核并调整超参数,所以我想使用 nice 包mlr。但是,据我所知,它不支持内核类型选项“矩阵”将自定义内核传递给 ksvm 学习器(“classif.ksvm”)。

有人知道是否有计划解决这个问题吗?或者,如果有另一个包允许自定义内核和漂亮的包装器来调整参数和重采样方法。据我所知,插入符号包也没有采用自定义内核。

4

1 回答 1

3

我们没有任何计划来支持它。不过,您可以定义一个自定义学习器来支持这一点。classif.ksvm据我所知,有两个变化(未经测试)。

首先,允许内核参数的新参数值:

makeDiscreteLearnerParam(id = "kernel", default = "rbfdot",
    values = c("vanilladot", "polydot", "rbfdot", "tanhdot", "laplacedot", "besseldot", "anovadot", "splinedot", "matrix"))

然后,更改 train 函数以将新内核考虑在内:

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, ...)
}

这是假设您在任务中传递的数据定义了自定义内核,这有点笨拙......

于 2017-01-13T18:00:47.270 回答