regresion - Obtención de valores de umbral a partir de una curva ROC
curvas roc ppt (3)
2 soluciones basadas en los paquetes ROCR
y pROC
:
threshold1 <- function(predict, response) {
perf <- ROCR::performance(ROCR::prediction(predict, response), "sens", "spec")
df <- data.frame(cut = [email protected][[1]], sens = [email protected][[1]], spec = [email protected][[1]])
df[which.max(df$sens + df$spec), "cut"]
}
threshold2 <- function(predict, response) {
r <- pROC::roc(response, predict)
r$thresholds[which.max(r$sensitivities + r$specificities)]
}
data(ROCR.simple, package = "ROCR")
threshold1(ROCR.simple$predictions, ROCR.simple$labels)
#> [1] 0.5014893
threshold2(ROCR.simple$predictions, ROCR.simple$labels)
#> [1] 0.5006387
Consulte también el paquete OptimalCutpoints
, que proporciona muchos algoritmos para encontrar umbrales óptimos.
Tengo algunos modelos, utilizando el paquete ROCR
en un vector de los porcentajes de clase previstos, tengo un objeto de rendimiento. Al trazar el objeto de rendimiento con las especificaciones "tpr", "fpr" me da una curva ROC.
Estoy comparando modelos en ciertos umbrales de tasa de falsos positivos (x). Espero obtener el valor de la verdadera tasa positiva (y) fuera del objeto de rendimiento. Aún más, me gustaría obtener el umbral de porcentaje de clase que se utilizó para generar ese punto.
el número de índice de la tasa de falsos positivos ( x-value
) que está más cerca del umbral sin estar por encima de él, debería proporcionarme el número de índice de la tasa positiva verdadera apropiada ( y-value
). No estoy exactamente seguro de cómo obtener ese valor de índice.
Y más al punto, ¿cómo obtengo el umbral de probabilidades de clase que se usó para hacer ese punto?
El paquete pROC
incluye funciones coords
para calcular el mejor umbral:
library(pROC)
my_roc <- roc(my_response, my_predictor)
coords(my_roc, "best", ret = "threshold")
Es por esto que str
es mi función R favorita:
library(ROCR)
data(ROCR.simple)
pred <- prediction( ROCR.simple$predictions, ROCR.simple$labels)
perf <- performance(pred,"tpr","fpr")
plot(perf)
> str(perf)
Formal class ''performance'' [package "ROCR"] with 6 slots
..@ x.name : chr "False positive rate"
..@ y.name : chr "True positive rate"
..@ alpha.name : chr "Cutoff"
..@ x.values :List of 1
.. ..$ : num [1:201] 0 0 0 0 0.00935 ...
..@ y.values :List of 1
.. ..$ : num [1:201] 0 0.0108 0.0215 0.0323 0.0323 ...
..@ alpha.values:List of 1
.. ..$ : num [1:201] Inf 0.991 0.985 0.985 0.983 ...
¡Ah ah! Es una clase S4 , por lo que podemos usar @
para acceder a las ranuras. Así es como haces un data.frame
:
cutoffs <- data.frame([email protected][[1]], [email protected][[1]],
[email protected][[1]])
> head(cutoffs)
cut fpr tpr
1 Inf 0.000000000 0.00000000
2 0.9910964 0.000000000 0.01075269
3 0.9846673 0.000000000 0.02150538
4 0.9845992 0.000000000 0.03225806
5 0.9834944 0.009345794 0.03225806
6 0.9706413 0.009345794 0.04301075
Si tiene un umbral de fpr que desea alcanzar, puede data.frame
este data.frame
para encontrar el máximo de tpr por debajo de este umbral de fpr:
cutoffs <- cutoffs[order(cutoffs$tpr, decreasing=TRUE),]
> head(subset(cutoffs, fpr < 0.2))
cut fpr tpr
96 0.5014893 0.1495327 0.8494624
97 0.4997881 0.1588785 0.8494624
98 0.4965132 0.1682243 0.8494624
99 0.4925969 0.1775701 0.8494624
100 0.4917356 0.1869159 0.8494624
101 0.4901199 0.1962617 0.8494624