FPRTPRACC
TPR=∑True positive∑Positive cases
FPR=∑False positive∑Negative cases
ACC=TPR⋅∑Positive cases+(1−FPR)⋅∑Negative cases∑Positive cases+∑Negative cases
Entonces, ACCTPRFPR
ACC=TPR+1−FPR2
N−≫N+
ACC(N−≫N+)≈1−FPR
ACCFPR
Vea este ejemplo, los negativos superan a los positivos 1000: 1.
data = c(rnorm(10L), rnorm(10000L)+1)
lab = c(rep(1, 10L), rep(-1, 10000L))
plot(data, lab, col = lab + 3)
tresh = c(-10, data[lab == 1], 10)
do.call(function(x) abline(v = x, col = "gray"), list(tresh))
pred = lapply(tresh, function (x) ifelse(data <= x, 1, -1))
res = data.frame(
acc = sapply(pred, function(x) sum(x == lab)/length(lab)),
tpr = sapply(pred, function(x) sum(lab == x & x == 1)/sum(lab == 1)),
fpr = sapply(pred, function(x) sum(lab != x & x == 1)/sum(lab != 1))
)
res[order(res$acc),]
#> res[order(res$acc),]
# acc tpr fpr
#12 0.000999001 1.0 1.0000
#11 0.189110889 1.0 0.8117
#9 0.500099900 0.9 0.5003
#2 0.757742258 0.8 0.2423
#5 0.763136863 0.7 0.2368
#4 0.792007992 0.6 0.2078
#10 0.807292707 0.5 0.1924
#3 0.884215784 0.4 0.1153
#7 0.890709291 0.3 0.1087
#6 0.903096903 0.2 0.0962
#8 0.971428571 0.1 0.0277
#1 0.999000999 0.0 0.0000
Ver, cuando fpr
es 0 acc
es máximo.
Y aquí está el ROC, con precisión anotada.
plot(sort(res$fpr), sort(res$tpr), type = "S", ylab = "TPR", xlab = "FPR")
text(sort(res$fpr), sort(res$tpr), pos = 4L, lab = round(res$acc[order(res$fpr)], 3L))
abline(a = 0, b = 1)
abline(a = 1, b = -1)
AUC es
1-sum(res$fpr[-12]*0.1)
#[1] 0.74608
La conclusión es que puede optimizar la precisión de una manera que resulte en un modelo falso ( tpr
= 0 en mi ejemplo). Esto se debe a que la precisión no es una buena métrica, la dicotomización del resultado debe dejarse en manos del responsable de la toma de decisiones.
Se dice que el umbral óptimo es el TPR=1−FPR porque de esa manera ambos errores tienen el mismo peso, incluso si la precisión no es óptima.
Cuando tiene clases desequilibradas, la optimización de la precisión puede ser trivial (por ejemplo, predecir a todos como la clase mayoritaria).
AUC
Y lo más importante de todo: ¿por qué AUC es más alto para un clasificador que es menos preciso que para uno que es más preciso?