我在做特征筛选时,遇到过这样一个情况:同一份数据,同一套候选特征,Lasso回归跑五折交叉验证,每一折选出来的特征名单都对不上,有的折里选了A没选B,有的折里正好反过来;换成弹性网络回归(Elastic Net)之后,特征名单第一次稳定了下来,而且预测误差还更低。这个差异不是玄学,而是两种方法对惩罚项的设计本质不同。很多人把Lasso回归和弹性网络回归放在一起比较,但真正问起区别,往往只记得"一个用L1,一个用L1+L2",至于这两个惩罚项在数学上带来什么、在数据上表现成什么、业务里该怎么选,又说不清了。这篇文章就把这些问题讲透,给出可复现的对比实验和调参经验,适合正在做特征选择、线性建模和模型可解释性工作的同学参考。
1. 从最小二乘到正则化:为什么非要有Lasso和Elastic Net
1.1 普通最小二乘在特征变多之后的"翻车"
要理解Lasso和Elastic Net的区别,得先回到它们的共同对手——普通最小二乘(OLS)。OLS的目标是让残差平方和最小,解是:
text复制w = (X^T X)^(-1) X^T y
这个公式看起来简单,但一旦特征数量变多,或者特征之间存在较强相关性,X^T X 就会出问题。最典型的就是多重共线性:两个特征高度相关时,X^T X 接近奇异,求逆之后系数会被放大到离谱的程度。我见过一个实际案例,两个业务指标相关系数0.97,OLS拟合出来的系数一个+8000,一个-7900,方向完全反直觉,模型在训练集上却照样拟合得很好——这种"虚假拟合"对新数据没有任何泛化能力。
更麻烦的是高维场景。当特征数p大于样本数n时,X^T X 根本不可逆,OLS连唯一解都没有。这时候你就面临两个选择:要么手动砍特征,要么引入正则化。手动砍特征看起来很直接,但实际工作里,业务方给过来的候选特征动辄几百个,谁和谁相关、谁对预测真正有用,靠肉眼和业务经验根本判断不完。正则化就是在这个背景下被推到前台的。
1.2 岭回归:稳住系数,但没法做特征筛选
岭回归(Ridge)是正则化思路的第一站。它在OLS损失后面加一个L2惩罚项:
text复制min (1 / (2n)) * ||y - Xw||^2 + alpha * ||w||^2
L2惩罚的本质是让系数尽量小,而不是非要等于0。X^T X 里加上 alpha * I 之后,矩阵变得可逆,系数估计的方差也被压了下来。相比OLS,岭回归在共线性数据上表现好很多,系数不再乱跳,预测稳定性明显提升。
但岭回归有个让人头疼的地方:它给出一堆接近0但又不是0的系数。假设你有300个特征,岭回归跑完,300个系数全非零,你要做特征筛选时还得自己再设个阈值去裁。这个阈值怎么定?按绝对值大小?按业务优先级?每次手动处理都像是拍脑袋。而且ridge的惩罚让所有特征都参与预测,你没法得到一份干净的"入选名单"。这时候Lasso出现,用一个数学上更"狠"的惩罚项,把稀疏性直接写进了目标函数里。
1.3 Lasso和Elastic Net出现在同一个对比里的真正原因
Lasso把惩罚项从L2换成了L1,目标函数长这样:
text复制min (1 / (2n)) * ||y - Xw||^2 + alpha * ||w||_1
L1惩罚会把一部分系数精确压成0,一步完成"系数估计+特征选择"。这听起来比岭回归完美,但实际用下来会发现另一个坑:当特征之间存在高度相关时,Lasso的选特征结果很不稳定——它对相关特征组里的变量几乎是"随机点名",这次选A,下次选B,模型系数的路径还会出现跳变。
Elastic Net就是为了修复这个问题的。它把L1和L2惩罚混合在一起,目标函数里同时包含两项。乍看像是"Lasso的改良版",但它不是简单地在Lasso上叠一层岭回归,而是在数学上产生了一个新的行为——把相关特征作为一组整体来处理。搞清楚了这层关系,你才能真正理解"区别"体现在哪,也才能在实战中做对选择。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Lasso回归的两面性:稀疏性怎么来,又会在哪里卡住
2.1 从几何到软阈值:L1惩罚为什么能把系数精确压到0
Lasso能把系数压成0,这个行为最直观的理解是几何层面的。在二维平面上,带L1惩罚的等式约束是一个菱形(rotated square),带L2惩罚的是圆形。最小化损失函数时,你要在约束边界上找使损失最小的点。圆形边界和损失等高线的切点,大概率落在坐标轴之外;而菱形边界有四个"尖角",这些角恰好落在坐标轴上,等高线一旦碰到角上,对应的另一个系数就正好是0。
落到算法实现上,坐标下降法里Lasso的更新公式是一个软阈值操作。单个系数更新时,先算它在当前残差下的最小二乘解z,然后做一次收缩:
text复制w_j = sign(z) * max(|z| - alpha, 0)
这个公式很直白:如果z的绝对值小于alpha,整个系数直接归零;如果大于alpha,向0
