Une démo 2D avec des données de jouets sera utilisée pour expliquer ce qui se passait pour une séparation parfaite lors de la régression logistique avec et sans régularisation. Les expériences ont commencé avec un ensemble de données qui se chevauchent et nous séparons progressivement deux classes. Le contour et les optima de la fonction objective (perte logistique) seront indiqués dans la sous-figure de droite. Les données et la frontière de décision linéaire sont tracées dans la sous-figure de gauche.
Nous essayons d'abord la régression logistique sans régularisation.
- Comme nous pouvons le voir avec les données qui s'écartent, la fonction objectif (perte logistique) change radicalement et l' optim s'éloigne vers une valeur plus grande .
- Une fois l'opération terminée, le contour ne sera plus une "forme fermée". À ce moment, la fonction objectif sera toujours plus petite lorsque la solution se déplace vers l'angle supérieur droit.
Ensuite, nous essayons la régression logistique avec régularisation L2 (L1 est similaire).
Avec la même configuration, l'ajout d'une très petite régularisation L2 changera les changements de fonction objectif par rapport à la séparation des données.
Dans ce cas, nous aurons toujours l'objectif "convexe". Quelle que soit la séparation des données.
code (j'utilise également le même code pour cette réponse: méthodes de régularisation pour la régression logistique )
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)