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 似乎以不同的方式使用它们?

我对@9​​87654342@ 的理解是,两个模型都会产生sigmaC 的结果,每个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 labsigest 函数使用sigma 的单个值。对于网格搜索,tuneLength 是要测试的成本值的数量,对于随机搜索,它是要评估的 (cost, sigma) 对的总数。 svmRadialCostsvmRadial 相同,但 sigest 在每个重采样循环内运行。对于随机搜索,它不会调整 sigmasvmRadialSigma 使用网格搜索调整成本和sigma。在认知性能欠佳的时刻,我将其设置为在网格搜索期间最多尝试 6 个 sigma 值,因为我觉得成本空间需要更大的范围。对于随机搜索,它与svmRadial 的作用相同。 svmRadialWeightsvmRadial 相同,但也考虑了类权重,仅适用于 2 类问题。

至于网页上的 SOM 示例,那是一个错误。我对 SOM 参数空间进行了过度采样,因为需要为 xdim <= ydim & xdim*ydim < nrow(x) 提供一个过滤器。这个错误来自我没有保留正确数量的参数。

【讨论】:

嗨,Max,非常感谢您快速详细的回复。这很有帮助。在课堂上使用 APM 以及 ESL、PDSwR 和 Elder's Ensemble Methods - 这是一篇很棒的文章。迈克尔 @topepo svmRadialWeight 是否通过 train 接受 weights 参数?

以上是关于R 理解来自 kernlab 的 caret train(tuneLength = ) 和 SVM 方法的主要内容,如果未能解决你的问题,请参考以下文章

r:来自 glmnet 和 caret 的系数对于相同的 lambda 是不同的

在 R ~ Caret 包中设置树的数量

R中的简单决策树--来自Caret包的奇怪结果

R:使用自定义内核(用户定义内核)的 SVM 性能在 kernlab 中不起作用

帮助在 R 中对 kernlab 的 SVM 使用 predict()?

在内核k-means(R中的kernlab包)中将新数据点分配给集群?