Một bản demo 2D với dữ liệu đồ chơi sẽ được sử dụng để giải thích những gì đang xảy ra để phân tách hoàn hảo về hồi quy logistic có và không có quy tắc. Các thí nghiệm bắt đầu với một tập dữ liệu chồng chéo và chúng tôi dần dần tách hai lớp ra. Đường viền hàm mục tiêu và tối ưu (mất logistic) sẽ được hiển thị trong hình bên phải. Dữ liệu và ranh giới quyết định tuyến tính được vẽ trong hình phụ bên trái.
Đầu tiên chúng ta thử hồi quy logistic mà không cần chính quy.
- Như chúng ta có thể thấy với dữ liệu di chuyển xa nhau, hàm mục tiêu (mất logistic) đang thay đổi đáng kể và tối ưu hóa đang chuyển sang một giá trị lớn hơn .
- Khi chúng tôi đã hoàn thành thao tác, đường viền sẽ không phải là "hình dạng đóng". Tại thời điểm này, hàm mục tiêu sẽ luôn nhỏ hơn khi giải pháp di chuyển đến phía trên bên phải.
Tiếp theo, chúng tôi thử hồi quy logistic với chính quy L2 (L1 là tương tự).
Với cùng một thiết lập, việc thêm một chính quy L2 rất nhỏ sẽ thay đổi hàm mục tiêu thay đổi liên quan đến việc tách dữ liệu.
Trong trường hợp này, chúng ta sẽ luôn có mục tiêu "lồi". Không có vấn đề bao nhiêu tách dữ liệu.
mã (Tôi cũng sử dụng cùng một mã cho câu trả lời này: Các phương thức chính quy cho hồi quy logistic )
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)