描述:
- 对于一个数据集,我想使用径向基函数(
RBF
)核函数和Weston, Watkins 原生多类
方法应用SVM
分类。 - 必须调整rbf核函数参数
sigma
,我想使用k折交叉验证
来完成这一步。我考虑固定C
的值。
解决方案:
似乎我可以使用mlr这个很棒的包来完成!所以,要为MSVM
分类使用CV
来调整rbf
参数sigma
,(使用这个教程)
#当C固定为3时,定义一个范围来搜索sigma。搜索范围为[10^{-6}, 10^{6}]num_ps = makeParamSet( makeDiscreteParam("C", values = 3), makeNumericParam("sigma", lower = -6, upper = 6, trafo = function(x) 10^x))#定义网格搜索方法ctrl = makeTuneControlGrid()#应用k折交叉验证rdesc = makeResampleDesc("CV", iters = 3L)res = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc, par.set = num_ps, control = ctrl)
问题:
对于这一部分
res = tuneParams("classif.ksvm", task = iris.task, resampling = rdesc, par.set = num_ps, control = ctrl)
根据文档,使用集成的学习器classif.ksvm,我请求应用在包ksvm中定义的多类分类方法。
我如何知道使用了哪种方法和核类型?我是说,如何强制学习器classif.ksvm
使用ksvm
中已经定义的分类类型(kbb-svc
)和核函数(rbfdot
)?
如果这不可能,那么如何定义一个符合所有我要求的新学习器?
回答:
你必须在学习器中设置固定的参数。因此,你首先需要创建它:
library(mlr)lrn = makeLearner("classif.ksvm", par.vals = list(C = 3, type = "kbb-svc", kernel = "rbfdot"))
然后你只需在ParamSet中定义你想要更改的参数
num_ps = makeParamSet( makeNumericParam("sigma", lower = -6, upper = 6, trafo = function(x) 10^x))
然后你可以像在你的例子中一样进行调优
ctrl = makeTuneControlGrid()rdesc = makeResampleDesc("CV", iters = 3L)res = tuneParams(lrn, task = iris.task, resampling = rdesc, par.set = num_ps, control = ctrl)