una - Curva ROC a partir de datos de entrenamiento en caret
especificidad en r (2)
Usando el paquete R caret, ¿cómo puedo generar una curva ROC basada en los resultados de validación cruzada de la función train ()?
Di, yo hago lo siguiente:
data(Sonar)
ctrl <- trainControl(method="cv",
summaryFunction=twoClassSummary,
classProbs=T)
rfFit <- train(Class ~ ., data=Sonar,
method="rf", preProc=c("center", "scale"),
trControl=ctrl)
La función de entrenamiento abarca un rango de parámetros mínimos y calcula el AUC de ROC. Me gustaría ver la curva ROC asociada. ¿Cómo hago eso?
Nota: si el método utilizado para el muestreo es LOOCV, rfFit
contendrá un marco de datos que no sea nulo en el rfFit$pred
, que parece ser exactamente lo que necesito. Sin embargo, necesito eso para el método "cv" (validación k-fold) en lugar de LOO.
Además: no, la función roc
que solía estar incluida en versiones anteriores de caret no es una respuesta; esta es una función de bajo nivel, no puede usarla si no tiene las probabilidades de predicción para cada muestra con validación cruzada .
Aquí, estoy modificando la trama de @ thei1e que otros pueden encontrar útiles.
Modelo de tren y hacer predicciones.
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
Diagrama de curva ROC actualizado
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)))
Solo falta el argumento savePredictions = TRUE
en ctrl
(esto también funciona para otros métodos de remuestreo):
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])
Tal vez me esté faltando algo, pero una pequeña preocupación es que el train
siempre calcula valores de AUC ligeramente diferentes a los de plot.roc
y pROC::auc
(diferencia absoluta <0.005), aunque twoClassSummary
usa pROC::auc
para estimar el AUC. Edición: supongo que esto ocurre porque la ROC del train
es el promedio de las AUC que utilizan los conjuntos de CV por separado y aquí estamos calculando la AUC sobre todas las remuestras simultáneamente para obtener la AUC general.
Actualización Dado que esto está recibiendo un poco de atención, aquí hay una solución que utiliza plotROC::geom_roc()
para 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()