在 R 中设置 SVM 分类的参数
Posted
技术标签:
【中文标题】在 R 中设置 SVM 分类的参数【英文标题】:Setting the parameters for SVM Classification in R 【发布时间】:2021-06-02 23:22:52 【问题描述】:说明:
-
对于数据集,我想通过使用径向基函数 (
RBF
) 内核和 Weston, Watkins native multi-class
来应用 SVM
。
rbf 内核参数sigma
必须调整,我想使用k-folds cross validation
来执行此操作。我认为是固定的C
。
解决方案:
看来我可以使用漂亮的包mlr 来做到这一点!因此,使用CV
对MSVM
分类调整rbf
参数sigma
,(使用此tutorial)
#While C is fix = 3, define a range to search sigma over it. Search between [10^-6, 10^6]
num_ps = makeParamSet(
makeDiscreteParam("C", values = 3),
makeNumericParam("sigma", lower = -6, upper = 6, trafo = function(x) 10^x)
)
#Define the Grid search method
ctrl = makeTuneControlGrid()
#Apply the k-folds CV
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
)?
如果这是不可能的,那么如何定义一个满足我所有要求的新学习者?
【问题讨论】:
【参考方案1】:您必须在学习器中设置固定参数。因此,您首先必须创建它:
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)
【讨论】:
非常感谢您的回答。我只是还有一个问题!通常,当使用其他包(如 caret)使用 k-folds CV 调整参数 sigma 时,我们只使用训练集。这里使用 mlr 包,我只需要提供训练集还是像我的示例一样,我提供整个集合“IRIS”,函数 tuneParams() 将处理这个并划分集合? 我的意思是 tuneParams() 会在整个 IRIS 集合上调整 sigma 还是先划分集合然后只在训练中调整 sigma? 它将根据rdesc
对整个数据进行拆分(因此此处为 3 倍 cv)。这将为您提供“最佳”参数。如果您对调整性能的无偏估计感兴趣,则必须使用 makeTuneWrapper
进行嵌套重采样。以上是关于在 R 中设置 SVM 分类的参数的主要内容,如果未能解决你的问题,请参考以下文章
译:支持向量机(SVM)及其参数调整的简单教程(Python和R)