在 R 中使用插入符号进行交叉验证的 SVM

Posted

技术标签:

【中文标题】在 R 中使用插入符号进行交叉验证的 SVM【英文标题】:SVM with cross validation in R using caret 【发布时间】:2013-12-26 00:32:15 【问题描述】:

有人告诉我使用 caret 包,以便在我拥有的数据集上执行支持向量机回归和 10 倍交叉验证。我正在根据 151 个变量绘制我的响应变量。我做了以下事情:-

> ctrl <- trainControl(method = "repeatedcv", repeats = 10)
> set.seed(1500)
> mod <- train(RT..seconds.~., data=cadets, method = "svmLinear", trControl = ctrl)

我得到了

C    RMSE  Rsquared  RMSE SD  Rsquared SD
  0.2  50    0.8       20       0.1        
  0.5  60    0.7       20       0.2        
  1    60    0.7       20       0.2   

但我希望能够查看我的褶皱,以及每个褶皱的预测值与实际值的接近程度。我该如何看待这个?

另外,它说:-

RMSE was used to select the optimal model using  the smallest value.
The final value used for the model was C = 0.

我只是想知道这意味着什么以及上表中的 C 代表什么?

RT (seconds)    76_TI2  114_DECC    120_Lop 212_PCD 236_X3Av
38  4.086   1.2 2.322   0   0.195
40  2.732   0.815   1.837   1.113   0.13
41  4.049   1.153   2.117   2.354   0.094
41  4.049   1.153   2.117   3.838   0.117
42  4.56    1.224   2.128   2.38    0.246
42  2.96    0.909   1.686   0.972   0.138
42  3.237   0.96    1.922   1.202   0.143
44  2.989   0.8 1.761   2.034   0.11
44  1.993   0.5 1.5 0   0.102
44  2.957   0.8 1.761   0.988   0.141
44  2.597   0.889   1.888   1.916   0.114
44  2.428   0.691   1.436   1.848   0.089

这是我的数据集的片段。我正在尝试针对 151 个变量设定 RT 秒数。

谢谢

【问题讨论】:

【参考方案1】:

您必须通过 trainControl 对象中的“savePred”选项保存您的 CV 预测。我不确定您的“学员”数据来自哪个包,但这里有一个使用 iris 的简单示例:

> library(caret)
> ctrl <- trainControl(method = "cv", savePred=T, classProb=T)
> mod <- train(Species~., data=iris, method = "svmLinear", trControl = ctrl)
> head(mod$pred)
        pred        obs      setosa  versicolor   virginica rowIndex   .C Resample
1     setosa     setosa 0.982533940 0.009013592 0.008452468       11 0.25   Fold01
2     setosa     setosa 0.955755054 0.032289120 0.011955826       35 0.25   Fold01
3     setosa     setosa 0.941292675 0.044903583 0.013803742       46 0.25   Fold01
4     setosa     setosa 0.983559919 0.008310323 0.008129757       49 0.25   Fold01
5     setosa     setosa 0.972285699 0.018109218 0.009605083       50 0.25   Fold01
6 versicolor versicolor 0.007223973 0.971168170 0.021607858       59 0.25   Fold01

编辑:“C”是 SVM 的调优参数之一。查看 kernlab 包中ksvm 函数的帮助以获取更多详细信息。

EDIT2:简单回归示例

> library(caret)
> ctrl <- trainControl(method = "cv", savePred=T)
> mod <- train(Sepal.Length~., data=iris, method = "svmLinear", trControl = ctrl)
> head(mod$pred)
      pred obs rowIndex   .C Resample
1 4.756119 4.8       13 0.25   Fold01
2 4.910948 4.8       31 0.25   Fold01
3 5.094275 4.9       38 0.25   Fold01
4 4.728503 4.8       46 0.25   Fold01
5 5.192965 5.3       49 0.25   Fold01
6 5.969479 5.9       62 0.25   Fold01

【讨论】:

您好,感谢您的回复。我已将 trainControl 中的位更改为该位,并且包含了我正在查看的数据集的一部分(学员数据集)。我不知道如何修改 head(mod$pred) 位,以便我可以查看从我刚刚创建的模型预测的 RT(秒),因为我正在针对 151 个描述符变量对 RT 秒进行建模。在这种情况下我该怎么做?我希望这是有道理的 您不必修改mod$pred 部分。您的“mod”对象是您的插入符号模型,它是一个列表,其中包含一个名为“pred”的元素,其中包含您的 CV 预测。 我每次尝试这样做时都会得到 NULL 的回报。 mod$pred 不是用来分类的吗?我正在尝试进行回归,这可以解释为什么会发生这种情况 不,如果您得到 NULL,那么您的 trainControl 对象中没有包含 savePred=T。我添加了一个编辑,通过回归示例演示了这一点。

以上是关于在 R 中使用插入符号进行交叉验证的 SVM的主要内容,如果未能解决你的问题,请参考以下文章

当 classProbs=TRUE 时,在 R 中使用插入符号的 SVM 的不同结果

如何进行交叉验证 SVM 分类器

使用 R 的 CMA Bioconductor 包时,解决 SVM 分类交叉验证中的“模型空”错误

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

R语言使用e1071包中的svm函数构建支持向量机SVM模型使用tune.svm函数基于网格搜索(10折交叉验证)对RBF核函数的gamma参数和cost参数进行参数寻优使用最优参数构建最终模型

使用 Joaquim 的 SVM 光进行 3 折交叉验证