Кривая 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)))
![введите описание изображения здесь]()