2D демонстрація з даними про іграшки буде використана для пояснення того, що відбувається для ідеального роз'єднання на логістичній регресії з регуляризацією та без неї. Експерименти почалися з набору даних, що перекриваються, і ми поступово переміщуємо два класи один від одного. Контур та оптимізація об'єктивної функції (логістичні втрати) будуть показані на правій підрис. Дані та межа лінійного рішення нанесені на лівій під фігурі.
Спочатку ми випробуємо логістичну регресію без регуляризації.
- Як ми бачимо, коли дані розсуваються, цільова функція (логістичні втрати) різко змінюється, а оптимізм відходить до більшого значення .
- Коли ми закінчимо операцію, контур не буде «закритої форми». У цей час цільова функція завжди буде меншою, коли рішення переміститься у верхній правий верх.
Далі ми спробуємо логістичну регресію з регуляризацією L2 (L1 схожа).
З тією ж установкою, додавання дуже малої регуляризації L2 змінить цільову зміну функції щодо поділу даних.
У цьому випадку у нас завжди буде мета "опукла". Не важливо, скільки розділення мають дані.
код (я також використовую той самий код для цієї відповіді: методи регуляризації для логістичної регресії )
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)