我试图针对一个分类任务优化SVM,这个方法在许多其他模型上都有效。然而,当我在基于模型的优化函数中使用SVM时,它返回了一个错误:“错误在checkStuff(fun, design, learner, control) : 提供的学习器不支持因子参数。”
附件是相关的代码。在我的训练任务中,所有自变量都是数值型的,唯一的一个因子是我感兴趣的结果变量。
library(mlr)library(mlrMBO)library(dplyr)library(PRROC)library(ggplot2)library(DiceKriging)traindf <- read.csv("/Users/njr/Google Drive/HMS IR Research/NSQIP Research/Endovascular/randomtraining.csv")testdf <- read.csv("/Users/njr/Google Drive/HMS IR Research/NSQIP Research/Endovascular/randomtesting.csv")traindf$Amputation<-as.factor(traindf$Amputation)testdf$Amputation <- as.factor(testdf$Amputation)trn.task = makeClassifTask(data = traindf, target = "Amputation", positive = "2")test.task = makeClassifTask(data = testdf, target = "Amputation", positive = "2")set.seed(9)svmlrn = makeLearner("classif.svm", predict.type = "prob")svm_model <- mlr::train(svmlrn, task = trn.task)res = makeResampleDesc("CV", iters = 10, stratify = TRUE)par5 = makeParamSet( makeDiscreteParam("kernel", values = c("radial", "polynomial", "linear")), makeNumericParam("cost", -15, 15, trafo = function(x) 2^x), makeNumericParam("gamma", -15, 15, trafo = function(x) 2^x, requires = quote(kernel == "radial")), makeIntegerParam("degree", lower = 1, upper = 4, requires = quote(kernel == "polynomial")))mbo.ctrl = makeMBOControl()mbo.ctrl = setMBOControlInfill(mbo.ctrl, crit = crit.ei)mbo.ctrl = setMBOControlTermination(mbo.ctrl, iters = 35, max.evals = 25)design.mat = generateRandomDesign(n = 50, par.set = par5)surrogate.lrn = makeLearner("regr.km", predict.type = "se")ctrl = mlr::makeTuneControlMBO(learner = surrogate.lrn, mbo.control = mbo.ctrl, mbo.design = design.mat)parallelStartMulticore(cpus = 8L)res.mbo = tuneParams(makeLearner("classif.svm"), trn.task, resampling = res, par.set = par5, control = ctrl, show.info = TRUE, measures = auc)parallelStop()
这是错误的跟踪代码:
6.stop("Provided learner does not support factor parameters.")5.checkStuff(fun, design, learner, control)4.initOptProblem(fun = fun, design = design, learner = learner, control = control, show.info = show.info, more.args = more.args)3.mlrMBO::mbo(tff, design = control$mbo.design, learner = control$learner, control = mbo.control, show.info = FALSE)2.sel.func(learner, task, resampling, measures, par.set, control, opt.path, show.info, resample.fun)1.tuneParams(makeLearner("classif.svm"), trn.task, resampling = res, par.set = par5, control = ctrl, show.info = TRUE, measures = auc)
回答:
问题在于你的参数集中有一个分类参数(kernel),而你使用的代理模型(regr.km)不支持这个。你可以尝试使用随机森林作为代理模型来替代。