R пакет mlr: опция для пользовательских ядер в classif.ksvm
Я хочу построить svm
с кастомным ядром. Обычно я использую пакет R kernlab
для этого. Поскольку я хочу опробовать разные ядра и настроить гиперпараметры, я хотел использовать красивый пакет mlr
, Однако, насколько я вижу, он не поддерживает опцию типа ядра "матрица" для передачи пользовательского ядра ученику ksvm ("classif.ksvm").
Кто-нибудь знает, есть ли план исправить это? Или, если есть другой пакет, который позволяет использовать собственные ядра и красивые оболочки для настройки параметров и методов передискретизации. Насколько мне известно, пакет caret также не принимает пользовательских ядер.
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, ...)
}
Это предполагает, что данные, которые вы передаете в задаче, определяют пользовательское ядро, что немного глупо...