web-dev-qa-db-ja.com

キャレットのトレーニングデータからのROC曲線

Rパッケージキャレットを使用して、train()関数の相互検証結果に基づいてROC曲線を生成するにはどうすればよいですか?

次のことを行います。

data(Sonar)
ctrl <- trainControl(method="cv", 
  summaryFunction=twoClassSummary, 
  classProbs=T)
rfFit <- train(Class ~ ., data=Sonar, 
  method="rf", preProc=c("center", "scale"), 
  trControl=ctrl)

トレーニング関数は、mtryパラメーターの範囲を超えてROC AUCを計算します。関連するROC曲線を確認したいのですが、どうすればよいですか?

注:サンプリングに使用されるメソッドがLOOCVの場合、rfFitにはrfFit$predスロットにnull以外のデータフレームが含まれます。これはまさに必要なものと思われます。ただし、LOOではなく「cv」メソッド(k-fold validation)の場合に必要です。

また、いいえ、以前のバージョンのキャレットに含まれていたroc関数は答えではありません-これは低レベルの関数であり、予測確率がない場合は使用できません相互検証された各サンプル。

23
January

ctrlから欠落している_savePredictions = TRUE_引数のみがあります(他のリサンプリングメソッドでも機能します)。

_library(caret)
library(mlbench)
data(Sonar)
ctrl <- trainControl(method="cv", 
                     summaryFunction=twoClassSummary, 
                     classProbs=T,
                     savePredictions = T)
rfFit <- train(Class ~ ., data=Sonar, 
               method="rf", preProc=c("center", "scale"), 
               trControl=ctrl)
library(pROC)
# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2
# Plot:
plot.roc(rfFit$pred$obs[selectedIndices],
         rfFit$pred$M[selectedIndices])
_

ROC

たぶん何かが欠けているかもしれませんが、trainは常に_plot.roc_および_pROC::auc_(絶対差<0.005)とは少し異なるAUC値を推定しますが、twoClassSummary _pROC::auc_を使用してAUCを推定します。 編集:これは、trainからのROCが個別のCVセットを使用したAUCの平均であるために発生すると想定しています。すべてのリサンプルのAUCを同時に計算して、全体のAUCを取得します。

Updateこれは少し注目されているので、_ggplot2_にplotROC::geom_roc()を使用するソリューションを次に示します。

_library(ggplot2)
library(plotROC)
ggplot(rfFit$pred[selectedIndices, ], 
       aes(m = M, d = factor(obs, levels = c("R", "M")))) + 
    geom_roc(hjust = -0.4, vjust = 1.5) + coord_equal()
_

ggplot_roc

33
thie1e

ここでは、他の人が役立つと思われる@ thei1eのプロットを変更しています。

モデルのトレーニングと予測の作成

library(caret)
library(ggplot2)
library(mlbench)
library(plotROC)

data(Sonar)

ctrl <- trainControl(method="cv", summaryFunction=twoClassSummary, classProbs=T,
                     savePredictions = T)

rfFit <- train(Class ~ ., data=Sonar, method="rf", preProc=c("center", "scale"), 
               trControl=ctrl)

# Select a parameter setting
selectedIndices <- rfFit$pred$mtry == 2

ROC曲線プロットを更新

g <- ggplot(rfFit$pred[selectedIndices, ], aes(m=M, d=factor(obs, levels = c("R", "M")))) + 
  geom_roc(n.cuts=0) + 
  coord_equal() +
  style_roc()

g + annotate("text", x=0.75, y=0.25, label=paste("AUC =", round((calc_auc(g))$AUC, 4)))

enter image description here

12
Megatron