Una demo 2D con i dati dei giocattoli verrà utilizzata per spiegare cosa stava succedendo per una separazione perfetta sulla regressione logistica con e senza regolarizzazione. Gli esperimenti sono iniziati con un set di dati sovrapposti e gradualmente ci separiamo di due classi. Il contorno della funzione obiettivo e optima (perdita logistica) saranno mostrati nella figura secondaria destra. I dati e il limite di decisione lineare sono tracciati nella figura secondaria sinistra.
Innanzitutto proviamo la regressione logistica senza regolarizzazione.
- Come possiamo vedere con i dati che si allontanano, la funzione oggettiva (perdita logistica) sta cambiando radicalmente e l' ottimizzazione si sta spostando su un valore più grande .
- Quando avremo completato l'operazione, il contorno non sarà una "forma chiusa". In questo momento, la funzione obiettivo sarà sempre più piccola quando la soluzione si sposta in alto a destra.
Quindi proviamo la regressione logistica con la regolarizzazione L2 (L1 è simile).
Con la stessa configurazione, l'aggiunta di una piccolissima regolarizzazione L2 cambierà le modifiche alla funzione obiettivo rispetto alla separazione dei dati.
In questo caso, avremo sempre l'obiettivo "convesso". Non importa quanta separazione abbiano i dati.
codice (utilizzo anche lo stesso codice per questa risposta: metodi di regolarizzazione per la regressione logistica )
set.seed(0)
d=mlbench::mlbench.2dnormals(100, 2, r=1)
x = d$x
y = ifelse(d$classes==1, 1, 0)
logistic_loss <- function(w){
p = plogis(x %*% w)
L = -y*log(p) - (1-y)*log(1-p)
LwR2 = sum(L) + lambda*t(w) %*% w
return(c(LwR2))
}
logistic_loss_gr <- function(w){
p = plogis(x %*% w)
v = t(x) %*% (p - y)
return(c(v) + 2*lambda*w)
}
w_grid_v = seq(-10, 10, 0.1)
w_grid = expand.grid(w_grid_v, w_grid_v)
lambda = 0
opt1 = optimx::optimx(c(1,1), fn=logistic_loss, gr=logistic_loss_gr, method="BFGS")
z1 = matrix(apply(w_grid,1,logistic_loss), ncol=length(w_grid_v))
lambda = 5
opt2 = optimx::optimx(c(1,1), fn=logistic_loss, method="BFGS")
z2 = matrix(apply(w_grid,1,logistic_loss), ncol=length(w_grid_v))
plot(d, xlim=c(-3,3), ylim=c(-3,3))
abline(0, -opt1$p2/opt1$p1, col='blue', lwd=2)
abline(0, -opt2$p2/opt2$p1, col='black', lwd=2)
contour(w_grid_v, w_grid_v, z1, col='blue', lwd=2, nlevels=8)
contour(w_grid_v, w_grid_v, z2, col='black', lwd=2, nlevels=8, add=T)
points(opt1$p1, opt1$p2, col='blue', pch=19)
points(opt2$p1, opt2$p2, col='black', pch=19)