【问题标题】:R package mlr: option for custom kernels in classif.ksvmR 包 mlr:classif.ksvm 中自定义内核的选项
【发布时间】:2017-05-29 03:16:36
【问题描述】:

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

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

【问题讨论】:

  • 对于类似情况,mlr 有configureMlr(on.par.out.of.bounds = "quiet")。但在这种情况下,参数kernel = "matrix"改变了行为,你必须像@Lars Kotthoff 那样改变学习者。

标签: r svm r-caret kernlab mlr


【解决方案1】:

我们没有任何计划来支持它。不过,您可以定义一个自定义学习器来支持这一点。据我所知,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, ...)
}

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

【讨论】:

  • 谢谢拉尔斯。我会试试看!
  • 你能提供一个关于如何在svm中调用jaccard内核的教程吗?
  • AFAIK 这没有在 R 中实现。
猜你喜欢
  • 2019-07-05
  • 1970-01-01
  • 1970-01-01
  • 2017-07-26
  • 2021-12-03
  • 2015-10-23
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多