Demo 2D dengan data mainan akan digunakan untuk menjelaskan apa yang terjadi untuk pemisahan sempurna pada regresi logistik dengan dan tanpa regularisasi. Percobaan dimulai dengan kumpulan data yang tumpang tindih dan kami secara bertahap memisahkan dua kelas. Kontur fungsi objektif dan optima (kerugian logistik) akan ditampilkan pada sub gambar kanan. Data dan batas keputusan linier diplot dalam sub gambar kiri.
Pertama kami mencoba regresi logistik tanpa regularisasi.
- Seperti yang dapat kita lihat dengan data yang bergerak terpisah, fungsi objektif (kehilangan logistik) berubah secara dramatis, dan optimasinya bergerak menjauh ke nilai yang lebih besar .
- Ketika kami telah menyelesaikan operasi, kontur tidak akan menjadi "bentuk tertutup". Pada saat ini, fungsi objektif akan selalu lebih kecil ketika solusi bergerak ke sudut kanan atas.
Selanjutnya kita mencoba regresi logistik dengan regularisasi L2 (L1 serupa).
Dengan pengaturan yang sama, menambahkan regularisasi L2 yang sangat kecil akan mengubah perubahan fungsi tujuan sehubungan dengan pemisahan data.
Dalam hal ini, kita akan selalu memiliki tujuan "cembung". Tidak peduli berapa banyak pemisahan yang dimiliki data.
kode (saya juga menggunakan kode yang sama untuk jawaban ini: Metode pengaturan untuk regresi logistik )
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)