calibración de las puntuaciones del clasificador: regresión isotónica

Aug 19 2020

Estoy investigando el enfoque de regresión isotónica para calibrar las puntuaciones de un clasificador.

Si entiendo correctamente, hacemos lo siguiente. Primero, obtenemos la gráfica de calibración (o curva de confiabilidad), que es la media de los valores predichos frente a la fracción de positivos. Luego, queremos que la "fracción de positivos" sea una función no decreciente de los "valores medios predichos", que se realiza mediante regresión isotónica.

Aquí está mi confusión: ¿cómo es que en algunos casos "fracción de positivos" no es una función no decreciente? Por ejemplo, aquí: el caso calibrado no es función creciente. La trama está tomada de

https://www.svds.com/classifiers2/

Se pueden encontrar otros ejemplos con el mismo problema. He leído el documento original

B. Zadrozny y C. Elkan. Transformar las puntuaciones del clasificador en estimaciones de probabilidad multiclase precisas.

En sus resultados, la función calibrada es monótona.

Respuestas

1 SextusEmpiricus Aug 21 2020 at 15:13

Puede obtener discrepancias como estas cuando el modelo utilizado para el ajuste no captura el modelo real con precisión.

Por ejemplo, cuando ajusta datos que siguen una relación cuadrática con una curva lineal, obtendrá que un gráfico de los residuos muestra alguna tendencia de variación en exceso / subestimación. Algo similar puede suceder con un gráfico de probabilidades (que es una especie de gráfico residual de gráfico predicho versus observado).

Luego, queremos que la "fracción de positivos" sea una función no decreciente de los "valores medios predichos", que se realiza mediante regresión isotónica.

Ésta no es una representación correcta de la regresión isotónica.

En su caso, regresión isotónica, tampoco hay garantía de que los residuos sigan una tendencia monótona. Es el valor de probabilidad ajustado que es una función monótona creciente / decreciente (como función de algún parámetro predictor).

Los datos y ninguno de los residuos deben ser monótonos en aumento / disminución. Además, lo observado como función de ajuste no tiene por qué ser una función monótona.

Por ejemplo, si tiene una disminución de $p$ hacia el final, entonces la regresión monótona podría estar sobrestimando esos últimos valores (porque causará un error menor para los otros valores), y obtendrá una disminución en la gráfica de observado versus predicho.

(o imagina cómo la regresión monótona encajaría en una curva sinusoidal)


Podríamos ilustrar este comportamiento con un ejemplo claro.

Digamos que tenemos datos distribuidos de Bernoulli donde el logit de la probabilidad es una función cuadrática. Y digamos que ajustamos este logit con una función lineal en lugar de una función cuadrática.

Puede imaginar que la curva lineal variará sobreestimando y subestimando el parámetro de probabilidad.

Para el ejemplo del código siguiente

$$p_{true} = \text{logistic}(8+6x+x^2) = \frac{1}{1+e^{-8-6x-x^2}} $$

se verá así cuando muestreemos 10k puntos con $-4<x<4$:

Aquí puede ver el patrón variable de sobre / subestimación cuando ajustamos una curva cuadrática con una línea recta.

No parece que encajemos con una línea recta porque es la función logística aplicada a una línea recta. Entonces aquí graficamos el logit de las probabilidades:

También podemos trazar una curva del parámetro de probabilidad pronosticado frente al verdadero.

El gráfico anterior no es el mismo que el suyo, no son datos agrupados, pero muestra que la curva no puede ser decreciente.

En el caso de los datos observados agrupados, que son estocásticos, es posible que obtenga variaciones / ruido adicionales, lo que puede hacer que la curva no disminuya.

### logistic function
flogistic <- function(x) {
  1/(1+exp(-x))
}

### generate bernoulli distributed data
### the probability is modeled with a QUADRATIC funcion
set.seed(1)
x <- runif(10^3,-4,4)
p <- flogistic((x+4)*(x+2))
y <- rbinom(10^3,size = 1, prob=p)

### fit with LINEAR function
mod <- glm(y~x, family = binomial(link = "logit"))
mod

### plotting observations
xs <- seq(-4,4,0.001)
plot(x,y, pch = 21, col = rgb(0,0,0,0.2), bg = rgb(0,0,0,0.2), cex = 0.7, ylab = "p" )
### this is the true model
lines(xs,flogistic((xs+4)*(xs+2)))
### this is the fitted model
lines(xs,flogistic(mod$coefficients[1]+mod$coefficients[2]*xs), lty = 2)
legend(-4,0.9, c("data","true model", "fitted model"),
       lty = c(NA,1,2), pch = c(21,NA,NA), col = 1, pt.bg=rgb(0,0,0,0.2))

### plotting logit
xs <- seq(-4,4,0.001)
plot(-100,-100, pch = 21, col = rgb(0,0,0,0.2), bg = rgb(0,0,0,0.2), cex = 0.7,
     xlim = c(-4,4), ylim = c(-4,4), xlab = "x", ylab = "logit(p)")
### this is the true model
lines(xs,(xs+4)*(xs+2))
### this is the fitted model
lines(xs,(mod$coefficients[1]+mod$coefficients[2]*xs), lty = 2)
legend(-4,4, c("logit(p) true model", "logit(p) fitted model"),
       lty = c(1,2), pch = c(NA,NA), col = 1, pt.bg=rgb(0,0,0,0.2))

### 
plot(flogistic(mod$coefficients[1]+mod$coefficients[2]*xs),flogistic((xs+4)*(xs+2)),
     type = "l", xlab = "predicted p", ylab = "true p",
     xlim = c(0,1),ylim=c(0,1))
lines(c(0,1),c(0,1), lty = 2)