Es fácil encontrar un paquete que calcule el área bajo ROC, pero ¿existe algún paquete que calcule el área bajo la curva precisión-recuerdo?
Respuestas
¿Demasiados anuncios?A partir de julio de 2016, el paquete PRROC funciona muy bien para calcular tanto el AUC ROC como el AUC PR.
Suponiendo que ya dispone de un vector de probabilidades (denominado probs
) calculadas con su modelo y las etiquetas de clase verdaderas están en su marco de datos como df$label
(0 y 1) este código debería funcionar:
install.packages("PRROC")
require(PRROC)
fg <- probs[df$label == 1]
bg <- probs[df$label == 0]
# ROC Curve
roc <- roc.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(roc)
# PR Curve
pr <- pr.curve(scores.class0 = fg, scores.class1 = bg, curve = T)
plot(pr)
PD: Lo único desconcertante es que utilices scores.class0 = fg
cuando fg
se calcula para la etiqueta 1 y no para la 0.
A continuación se muestran las curvas ROC y PR de ejemplo con las áreas bajo ellas:
Las barras de la derecha son las probabilidades umbral a las que se obtiene un punto en la curva.
Obsérvese que para un clasificador aleatorio, el AUC del ROC se aproximará a 0,5 independientemente del desequilibrio de clases. Sin embargo, el AUC de PR es delicado (véase ¿Qué es la "línea de base" en la curva de precisión y recuperación? ).
AUPRC()
es una función en PerfMeas
que es mucho mejor que el paquete pr.curve()
función en PRROC
cuando los datos son muy voluminosos. pr.curve()
es una pesadilla y tarda una eternidad en terminar cuando tienes vectores con millones de entradas. PerfMeas
tarda segundos en comparación. PRROC
se escribe en R y PerfMeas
está escrito en C.
Una vez que tenga una curva de precisión y recuperación de qpPrecisionRecall
por ejemplo:
pr <- qpPrecisionRecall(measurements, goldstandard)
puede calcular su AUC de la siguiente manera:
f <- approxfun(pr[, 1:2])
auc <- integrate(f, 0, 1)$value
la página de ayuda de qpPrecisionRecall
te da detalles sobre qué estructura de datos espera en sus argumentos.