Lasso的L1惩罚可使系数精确为零,因其目标函数在βⱼ=0处不可导,需用次梯度分析;当最小二乘损失在原点梯度绝对值≤alpha时,βⱼ=0满足KKT条件成为最优解。

Lasso的L1惩罚项在数学上允许零解
关键不是“会不会变零”,而是“为什么能精确为零”——这源于目标函数中 |βⱼ| 这一项在 βⱼ = 0 处不可导,必须用次梯度分析。当最小二乘损失函数在原点处的梯度绝对值 ≤ 正则化强度 alpha 时,βⱼ = 0 就满足KKT最优性条件,直接成为合法解。
这不是近似归零,是优化器主动选中的精确解。Ridge 的 βⱼ² 在原点可导、梯度连续,只能让系数无限趋近于零,但永远不会停在那里。
sklearn中Lasso的alpha值决定压缩力度
alpha 越大,L1惩罚越强,系数被压到零的概率越高;alpha 过小则几乎不筛选特征,和普通线性回归差别不大。
- 常见错误:直接用默认
alpha=1.0,结果所有系数都为0——尤其在高维稀疏数据或样本量小时极易发生 - 正确做法:用
LassoCV自动搜参,比如LassoCV(cv=5, max_iter=10000) - 注意
normalize=True已被弃用,新版应先对X手动标准化(StandardScaler),否则不同量纲特征受惩罚不公
系数为0不等于特征无用,可能暴露共线性或数据问题
如果跑完 Lasso 发现所有系数都是0,别急着换模型,先检查:
- 是否
alpha设置过大?用lasso_cv.alpha_看交叉验证选出的最优值 - 特征之间是否存在强共线性?比如两列高度相关,Lasso 可能随机压掉其中一个,反复运行可能结果不一致
- 目标变量
y是否基本无变异?例如全为常数或方差极小,导致任何线性关系都无法建立 - 样本量
n是否远小于特征数p?此时 Lasso 本身不稳定,需配合降维或领域知识预筛
可视化系数路径能帮你判断alpha是否合理
画出不同 alpha 下各系数的变化轨迹,是调试 Lasso 最直观的方式:
import numpy as np
from sklearn.linear_model import Lasso
alphas = np.logspace(-4, 1, 50)
coefs = []
for a in alphas:
lasso = Lasso(alpha=a, max_iter=10000)
lasso.fit(X_train, y_train)
coefs.append(lasso.coef_)
plt.plot(alphas, coefs)
plt.xscale('log')
理想曲线应呈现阶梯状下降:部分系数从某 alpha 开始就稳定为0,其余缓慢收缩。若整条线“塌缩过早”,说明正则太猛;若几乎没变化,说明 alpha 不够力。
真正容易被忽略的是:Lasso 的零系数不是黑箱判定,它依赖于你传入数据的尺度、共线结构和样本信息量——调参只是表象,理解这些约束才能避免把“筛选失败”误认为“特征无价值”。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











