Caret中交叉验证的每个折叠的训练集和测试集的r-ROC曲线



在Caret中进行5次交叉验证时,是否可以将训练集和测试集的ROC曲线分别用于每个折叠?

library(caret)
train_control <- trainControl(method="cv", number=5,savePredictions =  TRUE,classProbs = TRUE)
output <- train(Species~., data=iris, trControl=train_control, method="rf")

我可以做以下操作,但我不知道它是否返回Fold1训练集或测试集的ROC:

library(pROC) 
selectedIndices <- rfmodel$pred$Resample == "Fold1"
plot.roc(rfmodel$pred$obs[selectedIndices],rfmodel$pred$setosa[selectedIndices])

确实,文档中对rfmodel$pred的内容一点也不清楚——我敢打赌,所包含的预测是针对用作测试集的折叠,但我无法指出文档中的任何证据;然而,不管怎样,你在争取中华民国的过程中仍然遗漏了一些要点。

首先,让我们将rfmodel$pred隔离在一个单独的数据帧中以便于处理:

dd <- rfmodel$pred
nrow(dd)
# 450

为什么是450行?这是因为您尝试了3个不同的参数集(在您的情况下,mtry只有3个不同值):

rfmodel$results
# output:
mtry Accuracy Kappa AccuracySD    KappaSD
1    2     0.96  0.94 0.04346135 0.06519202
2    3     0.96  0.94 0.04346135 0.06519202
3    4     0.96  0.94 0.04346135 0.06519202

以及150行X3设置=450。

让我们仔细看看rfmodel$pred:的内容

head(dd)
# result:
pred    obs setosa versicolor virginica rowIndex mtry Resample
1 setosa setosa  1.000      0.000         0        2    2    Fold1
2 setosa setosa  1.000      0.000         0        3    2    Fold1
3 setosa setosa  1.000      0.000         0        6    2    Fold1
4 setosa setosa  0.998      0.002         0       24    2    Fold1
5 setosa setosa  1.000      0.000         0       33    2    Fold1
6 setosa setosa  1.000      0.000         0       38    2    Fold1
  • obs包含真值
  • 三列setosaversicolorvirginica分别包含为每个类计算的概率,并且每行的概率总和为1
  • pred包含最终预测,即上述三列中具有最大概率的类

如果这就是整个故事,你绘制ROC的方式是可以的,即:

selectedIndices <- rfmodel$pred$Resample == "Fold1"
plot.roc(rfmodel$pred$obs[selectedIndices],rfmodel$pred$setosa[selectedIndices])

但这并不是故事的全部(450行而不是150行的存在应该已经给出了一个提示):注意一个名为mtry的列的存在;实际上,rfmodel$pred包括所有交叉验证运行(即所有参数设置)的结果:

tail(dd)
# result:
pred       obs setosa versicolor virginica rowIndex mtry Resample
445 virginica virginica      0      0.004     0.996      112    4    Fold5
446 virginica virginica      0      0.000     1.000      113    4    Fold5
447 virginica virginica      0      0.020     0.980      115    4    Fold5
448 virginica virginica      0      0.000     1.000      118    4    Fold5
449 virginica virginica      0      0.394     0.606      135    4    Fold5
450 virginica virginica      0      0.000     1.000      140    4    Fold5

这就是您的selectedIndices计算不正确的最终原因;它还应该包括mtry的具体选择,否则ROC就没有任何意义,因为它"聚合"了不止一个模型:

selectedIndices <- rfmodel$pred$Resample == "Fold1" & rfmodel$pred$mtry == 2

--

正如我在开头所说,我打赌rfmodel$pred中的预测是针对作为测试集的文件夹;事实上,如果我们手动计算精度,它们与上面显示的rfmodel$results中报告的精度一致(所有3个设置为0.96),我们知道这是用于测试的文件夹(可以说,相应的训练精度为1.0):

for (i in 2:4) {  # mtry values in {2, 3, 4}
acc = (length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold1'))/30 +
length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold2'))/30 +
length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold3'))/30 +
length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold4'))/30 +
length(which(dd$pred == dd$obs & dd$mtry==i & dd$Resample=='Fold5'))/30
)/5
print(acc) 
}
# result:
[1] 0.96
[1] 0.96
[1] 0.96

最新更新