utilizados una son qué para hacer especificidad dibujar datos curvas curva como análisis analisis accuracy r r-caret roc

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()