2017-10-23 196 views
3

Caretの5倍交差検証で、トレーニングセットとテストセットのROCカーブを折り畳みごとに別々に設定できますか?トレーニングセットのROCカーブとCaretのクロスバリデーションの各フォールドのテストセット

私は次の操作を行うことができますが、それはFold1のトレーニングセットまたはテストセットのためのROCを返した場合、私は知らない
library(caret) 
train_control <- trainControl(method="cv", number=5,savePredictions = TRUE,classProbs = TRUE) 
output <- train(Species~., data=iris, trControl=train_control, method="rf") 

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

答えて

3

documentationがまったくに関する明確でないことは事実でありますrfmodel$predの内容 - 私は含まれている予測がテストセットとして使用される折りたたみのものであると確信していますが、私はドキュメントのいかなる証拠も指摘することはできません。それにもかかわらず、これに関係なく、あなたはROCを手に入れようとしている途中でまだいくつかの点を欠いています。

まずは、簡単に処理するための独立したデータフレームにrfmodel$predを隔離してみましょう:

dd <- rfmodel$pred 

nrow(dd) 
# 450 

なぜ450行?あなたは(あなたのケースでmtryためだけの3つの異なった値)を3種類のパラメータセットを試してみましたので、それはです:X 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行= 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は、真の値
  • 含まれてい3列setosaversicolor、及びvirginicaはがクラスごとに算出された各確率を含み、それらは行ごとに1にまとめる
  • predを挙げる3つの列から最大確率を持つクラス、すなわち、最終的な予測が含まれています

以上、これは全体的な話だった場合は、ROCプロットのあなたの方法、すなわち、OKのようになります。

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

しかし、これは全体の世紀ではありませんory(単に150の代わりに450行が存在するだけでヒントが得られたはずです):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計算が正しくない理由究極の理由です。私は、私が最初に言ったように

-

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

:それは複数のモデルを「集約」以来、そうでない場合ROCは、どんな意味がない、mtryの特定の選択をも含むべきですrfmodel$predの予測はテストセットとしてのフォルダのものだと確信しています。確かに、精度を手動で計算すると、テスト(恐らく、それぞれの訓練精度は1.0です)として使用されているフォルダに対して、上記のrfmodel$results(3つの設定すべてで0.96)で報告された値と一致します。

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 
関連する問題