Кривая ROC из данных обучения в каретке

Используя каретку R-пакета, как я могу создать кривую ROC на основе результатов перекрестной проверки функции train()?

Скажем, я делаю следующее:

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

Функция обучения проходит через диапазон параметров mtry и вычисляет AUC ROC. Я хотел бы видеть связанную кривую ROC - как это сделать?

Примечание: если метод, используемый для выборки, является LOOCV, то rfFit будет содержать ненулевой фрейм данных в слоте rfFit$pred, который, кажется, именно то, что мне нужно. Тем не менее, мне нужно это для метода "cv" (k-fold validation), а не LOO.

Также: no, roc функция, которая раньше включалась в прежние версии каретки, не является ответом - это низкоуровневая функция, вы не можете ее использовать, если у вас нет вероятности прогноза для каждый перекрестно проверенный образец.

Ответы

Ответ 1

В 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 всегда оценивает несколько разные значения AUC, чем plot.roc и pROC::auc (абсолютная разница < 0,005), хотя twoClassSummary использует pROC::auc для оценки AUC. Изменить: Я предполагаю, что это происходит потому, что ROC из train является средним значением AUC с использованием отдельных CV-наборов, и здесь мы вычисляем AUC по всем повторным выборкам одновременно, чтобы получить общую AUC.

Обновить. Поскольку это получает немного внимания, здесь используется решение plotROC::geom_roc() для ggplot2:

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

Ответ 2

Здесь я изменяю сюжет @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)))

введите описание изображения здесь