Auc

Más sobre la relación entre la dispersión de las probabilidades y el AUC en modelos bien calibrados

Esta entrada está relacionada —aunque no es estrictamente una continuación— de la que escribí hace una semana sobre el mismo asunto.

Se vuelve a partir de lo siguiente: un modelo de clasificación binaria bien calibrado. Eso significa que si el modelo predice $p$ para el sujeto $i$, entonces $Y_i \sim B(p)$.

Supongamos que tenemos una población dada, aplicamos el modelo y obtenemos una distribución $f(p)$ para las probabilidades predichas. Entonces, la distribución de:

Una serie de apuntes sobre modelos estadísticos

Andrew Gelman se pregunta periódicamente por la obsesión generalizada en involucrar a Jesucristo con los modelos lineales. Versión corta: si el año se modela tal cual (p.e., 2025), el término independiente nos aporta información sobre el hipotético estado de las cosas en el año en el que nació. En general, es conveniente parametrizar las variables de manera que el término independiente de un GLM tenga un mínimo contenido informativo.

Un artículo muy raro de Manuel Hidalgo en NadaEsGratis que incluye todas las palabras que hacen que dejes de leer algo: cuántico, entropía, desorden (como sinónimo de incertidumbre), etc. Lo relevante de la cosa no parece ser tanto lo que cuenta (ya sabemos que hay incertidumbre en el mundo, ya sabemos que nuestra visión del mundo está marcada por la incertidumbre, etc.) sino poder constatar que a ciertos segmentos de la población hay que recordarles estas cuestiones y que puede que incluso se sorprendan cuando se las cuentan.

Sobre la relación entre la dispersión de las probabilidades y el AUC en modelos bien calibrados

Supongamos que estamos construyendo un modelo de clasificación binaria. Supongamos que está bien calibrado, es decir, que cuando predice una probabilidad $p$ de éxito para un sujeto $i$, entonces es cierto que $Y_i \sim \text{Bernoulli(p)}$.

Por otro lado, pensemos en el AUC, que es muchas cosas, pero entre ellas,

$$ AUC=Pr(p_i >p_j | Y_i =1,Y_j =0),$$

es decir la probabilidad de que, tomando dos sujetos al azar, uno positivo, el $i$ y otro negativo, el $j$, $p_i > p_j$.

Matrices de confusión, sensibilidad, especificidad, curva ROC, AUC y todas esas cosas

Esta entrada es una breve introducción a los conceptos indicados en el título. Está motivada por una pregunta que se formuló en Twitter acerca de la existencia o no de lo que voy a escribir en español y a que ninguna de las respuestas aportadas me satisfizo.

Todos esos conceptos hacen referencia al estudio de la bondad de un modelo de clasificación (es decir, un modelo que trata de predecir una etiqueta (o una variable categórica, si se quiere) a partir de ciertos datos). Comenzaré por una descripción exenta de esos conceptos y terminaré con una discusión desde la perspectiva de su aplicación práctica que, espero, sirva para ponerlos en su lugar.

Cotas superiores para el AUC

El AUC tiene una cota superior de 1. Concedido. Pero alguien se quejó de que el AUC = 0.71 que aparece aquí era bajo.

Se ve que ignora esto. Donde está todo tan bien contado que no merece la pena tratar de reproducirlo o resumirlo aquí.

AUC = Wilcoxon

Construyo unos datos,

n <- 30
si <- data.frame(res = "si",
    score = rnorm(n, 1, 1))
no <- data.frame(res = "no",
    score = rnorm(n, 0, 1))
dat <- rbind(si, no)

que simulan los scorings de un modelo hipótetico en el que comparo unos casos positivos y otros negativos.

Comparo con el test de Wilcoxon el scoring según la etiqueta y normalizo (adecuadamente):

test <- wilcox.test(score ~ res, data = dat)$statistic
test / n^2

Por otro lado calculo el AUC:

library(pROC)
my_roc <- roc(dat$res, dat$score)
auc(my_roc)

¡Lo mismo!

Motivo: ambas expresiones dan la probabilidad de que el scoring de un sí elegido al azar sea superior al de un no elegido también al azar. Cosa que está superdocumentada en el ancho mundo.

El AUC es la probabilidad de que...

Voy a constuir unos datos artificiales y un modelo de clasificación binaria,

library(mgcv)
library(ggplot2)
library(pROC)

n <- 10000
dat <- gamSim(1, n=n, dist="binary", scale=.33)

lr.fit <- gam(y ~ s(x0, bs="cr") +
    s(x1, bs="cr") + s(x2, bs="cr") +
    s(x3, bs="cr"),
    family=binomial, data=dat,
    method="REML")

y luego (mal hecho: debería hacerlo sobre un conjunto de validación distinto) a obtener las predicciones para las observaciones

res <- data.frame(real = factor(dat$y),
    prob = predict(lr.fit, type = "response"))

que

ggplot(res, aes(x=prob, fill=real)) +
    geom_density(alpha=.3)

representa así:

predicciones_gam

Me pregunto si el clasificador construido es bueno. Para lo cual voy a construir la curva ROC con