是否有任何直观的解释为什么逻辑回归不适用于完美的分离情况?为什么添加正则化会解决它?

机器算法验证 物流 广义线性模型 优化 直觉 分离
2022-01-20 09:12:51

我们对逻辑回归中的完美分离进行了很多很好的讨论。例如,R 中的逻辑回归导致完美分离(Hauck-Donner 现象)。怎么办?Logistic 回归模型不收敛

我个人仍然觉得为什么它会成为一个问题以及为什么添加正则化会解决它并不直观。我制作了一些动画,并认为它会有所帮助。所以发布他的问题并自己回答以与社区分享。

1个回答

将使用带有玩具数据的 2D 演示来解释使用和不使用正则化的逻辑回归的完美分离发生了什么。实验从重叠的数据集开始,我们逐渐将两个类分开。目标函数轮廓和最优值(逻辑损失)将显示在右侧子图中。数据和线性决策边界绘制在左子图中。

首先,我们尝试不进行正则化的逻辑回归。

  • 正如我们所看到的,随着数据的分离,目标函数(逻辑损失)正在发生巨大变化,而优化值正在向更大的值移动
  • 当我们完成操作后,轮廓就不会是“闭合形状”了。此时,当解移动到右上角时,目标函数总是会变小。

在此处输入图像描述

接下来我们尝试使用 L2 正则化的逻辑回归(L1 类似)。

  • 在相同的设置下,添加一个非常小的 L2 正则化将改变关于数据分离的目标函数。

  • 在这种情况下,我们总是有“凸”的目标。无论数据有多少分离。

在此处输入图像描述

代码(我也使用相同的代码来回答这个问题:Regularization methods for Logistic regression

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)