calibrazione dei punteggi del classificatore: regressione isotonica
Sto studiando l'approccio della regressione isotonica per calibrare i punteggi da un classificatore.
Se ho capito bene, facciamo quanto segue. Innanzitutto, otteniamo il grafico di calibrazione (o curva di affidabilità), che è la media dei valori previsti rispetto alla frazione di positivi. Quindi, vogliamo che la "frazione di positivi" sia una funzione non decrescente dei "valori predetti medi", che viene eseguita mediante regressione isotonica.
Ecco la mia confusione: come mai in alcuni casi la "frazione di positivi" non è una funzione non decrescente? Ad esempio, qui: il caso calibrato non è funzione crescente. La trama è tratta da
https://www.svds.com/classifiers2/
Si possono trovare altri esempi con lo stesso problema. Ho letto il documento originale
B. Zadrozny e C. Elkan. Trasformare i punteggi dei classificatori in accurate stime di probabilità multiclasse.
Nei loro risultati la funzione calibrata è monotona.

Risposte
Potresti ottenere discrepanze come queste quando il modello utilizzato per l'adattamento non cattura il modello reale in modo accurato.
Ad esempio, quando si adattano i dati che seguono una relazione quadratica con una curva lineare, si otterrà che un grafico dei residui mostra una tendenza al variare sopra / sottovalutare. Qualcosa di simile può accadere con un diagramma delle probabilità (che è una specie di diagramma residuo del diagramma previsto rispetto a quello osservato).
Quindi, vogliamo che la "frazione di positivi" sia una funzione non decrescente dei "valori predetti medi", che viene eseguita mediante regressione isotonica.
Questa non è una rappresentazione corretta della regressione isotonica.
Nel tuo caso, regressione isotonica, non c'è ugualmente alcuna garanzia che i residui stiano seguendo una tendenza monotona. È il valore di probabilità adattato che è una funzione crescente / decrescente monotona (come funzione di un parametro predittore).
I dati e nemmeno i residui devono essere monotoni in aumento / diminuzione. Anche l'osservato come funzione di adattato non deve essere una funzione monotona.
Ad esempio, se hai una diminuzione di $p$ verso la fine, la regressione monotona potrebbe sovrastimare quegli ultimi valori (perché causerà un errore inferiore per gli altri valori) e si otterrà una diminuzione nel grafico tra osservati e predetti.
(o immagina come la regressione monotonica si adatterebbe a una curva sinusoidale)
Potremmo illustrare questo comportamento con un chiaro esempio.
Supponiamo di avere dati distribuiti di Bernoulli in cui il logit della probabilità è una funzione quadratica. E diciamo che adattiamo questo logit con una funzione lineare invece di una funzione quadratica.
Potete immaginare che la curva lineare varierà sovrastimando e sottostimando il parametro di probabilità.
Per l'esempio dal codice sottostante
$$p_{true} = \text{logistic}(8+6x+x^2) = \frac{1}{1+e^{-8-6x-x^2}} $$
sarà simile a questo quando campioniamo 10k punti con $-4<x<4$:

Qui puoi vedere il modello variabile di sopra / sottovalutazione quando adattiamo una curva quadratica con una linea retta.
Non sembra che ci troviamo con una linea retta perché è la funzione logistica applicata a una linea retta. Quindi qui tracciamo il logit delle probabilità:

Possiamo anche tracciare una curva del parametro di probabilità previsto rispetto al reale.

Il grafico sopra non è uguale al tuo, non è un dato cestinato, ma mostra che la curva può essere non decrescente.
Nel caso di dati osservati in bin, che sono stocastici, è possibile che si ottengano ulteriori variazioni / rumore, che possono far sì che la curva non sia decrescente.
### 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)