Düzenleme ile ve regülasyon olmadan lojistik regresyonda mükemmel bir ayrılma için neler olduğunu açıklamak için oyuncak verileri içeren bir 2D demo kullanılacaktır. Deneyler örtüşen bir veri seti ile başladı ve yavaş yavaş iki sınıfı birbirinden ayırıyoruz. Objektif fonksiyon konturu ve optima (lojistik kayıp) sağ alt şekilde gösterilecektir. Veriler ve doğrusal karar sınırı sol alt şekilde çizilmiştir.
Önce lojistik regresyonu düzenli olmadan deniyoruz.
- Verilerin birbirinden uzaklaştıkça görebildiğimiz gibi, objektif fonksiyon (lojistik kayıp) önemli ölçüde değişiyor ve optim daha büyük bir değere doğru kayıyor .
- İşlemi tamamladığımızda, kontur "kapalı bir şekil" olmayacaktır. Şu anda, çözüm sağ üst köşeye hareket ettiğinde objektif fonksiyon her zaman daha küçük olacaktır.
Daha sonra L2 düzenlenmesi ile lojistik regresyonu deneriz (L1 benzerdir).
Aynı kurulumla, çok küçük bir L2 düzeninin eklenmesi, verilerin ayrılmasına göre objektif işlev değişikliklerini değiştirecektir.
Bu durumda, her zaman "dışbükey" hedefimiz olacaktır. Verilerin ayrımı ne olursa olsun.
kodu (Ben de bu cevap için aynı kodu kullanın: Lojistik regresyon için düzenlileştirme yöntemleri )
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)