R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法
Posted
技术标签:
【中文标题】R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法【英文标题】:R understanding caret train(tuneLength = ) and SVM methods from kernlabR 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法 【发布时间】:2016-12-16 00:41:43 【问题描述】:试图更好地了解train(tuneLength = )
在caret
中的工作原理。当我试图从kernlab
了解 SVM 方法之间的一些差异时,我感到困惑,我查看了文档 (here) 和插入符号培训页面 (here)。
我的玩具示例是使用 iris
数据集创建五个模型。结果是here,可重现代码是here(它们比较长,所以我没有将它们复制并粘贴到帖子中)。
来自caret
文档:
tuneLength 一个整数,表示调整参数网格中的粒度。默认情况下,此参数是应该由 train 生成的每个调整参数的级别数。如果 trainControl 具有选项 search = "random",则这是随机搜索将生成的调整参数组合的最大数量。 (注意:如果给定,这个参数必须命名。)
在this example、trainControl(search = "random")
和train(tuneLength = 30)
,但似乎有 67 个结果,而不是 30 个(调整参数组合的最大数量)?我试着四处看看是否有 30 个独特的 ROC
值,甚至 ydim
值,但据我计算,它们不是。
对于玩具示例,我创建了下表:
有没有办法查看“幕后”发生的事情?例如,M1
(svmRadial
) 和 M3
(svmRadialSigma
) 都采用并给出相同的调整参数,但基于调用 $results
似乎以不同的方式使用它们?
我对@987654342@ 的理解是,两个模型都会产生sigma
和C
的结果,每个9 values, 9 times
因为9
是每个调整参数的级别数(随机搜索除外)?同样,M4
将是 9^3
,因为 train(tuneLength = 9)
并且有 3
调整参数?
迈克尔
【问题讨论】:
【参考方案1】:我需要更多地更新软件包文档,但详细信息已在package web page for random search 上拼写:
“唯一组合的总数由
tuneLength
选项指定到train
。”
但是,使用 RBF 内核的 SVM 尤其混乱。这是一个破败:
svmRadial
调整成本并基于kern lab
的sigest
函数使用sigma
的单个值。对于网格搜索,tuneLength
是要测试的成本值的数量,对于随机搜索,它是要评估的 (cost, sigma
) 对的总数。
svmRadialCost
与 svmRadial
相同,但 sigest
在每个重采样循环内运行。对于随机搜索,它不会调整 sigma
。
svmRadialSigma
使用网格搜索调整成本和sigma
。在认知性能欠佳的时刻,我将其设置为在网格搜索期间最多尝试 6 个 sigma
值,因为我觉得成本空间需要更大的范围。对于随机搜索,它与svmRadial
的作用相同。
svmRadialWeight
与 svmRadial
相同,但也考虑了类权重,仅适用于 2 类问题。
至于网页上的 SOM 示例,那是一个错误。我对 SOM 参数空间进行了过度采样,因为需要为 xdim <= ydim & xdim*ydim < nrow(x)
提供一个过滤器。这个错误来自我没有保留正确数量的参数。
【讨论】:
嗨,Max,非常感谢您快速详细的回复。这很有帮助。在课堂上使用 APM 以及 ESL、PDSwR 和 Elder's Ensemble Methods - 这是一篇很棒的文章。迈克尔 @topeposvmRadialWeight
是否通过 train
接受 weights
参数?以上是关于R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法的主要内容,如果未能解决你的问题,请参考以下文章
r:来自 glmnet 和 caret 的系数对于相同的 lambda 是不同的
R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用