想象你正要出差一周,面前摊开一个 20 寸的行李箱,桌上摆着各种物品:西装、运动鞋、Kindle、吹风机、三根数据线……你当然想把它们全塞进去,但航空公司有“限重”规定。L1 惩罚就像一位严格的断舍离管家:每件物品都要按“体积绝对值”交税,带得越多税越重。于是你会果断把 Kindle、吹风机留在家里——它们的携带量被精确清零。而 L2 惩罚更像“超重费”:东西全带上,但每件都压缩到最小,谁也没被彻底抛弃。Lasso(L1 惩罚)的厉害之处,正是它逼你在“行李预算”内做硬性取舍:不重要的特征权重精确变成 0,实现自动特征选择。这篇文章,就把这位“断舍离管家”的算盘(数学原理)和干活流程(算法与代码)彻底讲明白。
掌握 L1 Lasso,你将在高维数据建模中拥有“一键断舍离”的能力:自动剔除无关特征、提升模型可解释性。这是数据科学面试与实战中出场率最高的正则化技能之一。
目录
可视化演示
展示L1正则化的几何约束区域、稀疏权重生成过程和特征选择效果,切换模式对比L1与L2正则化的差异。
本节配有交互动效(进入视口后自动加载,约 3KB)。
L1几何约束 L1约束区域为菱形,角点落在坐标轴上 min L(θ) + λ|θ| 优化解倾向于落在坐标轴交点,使部分权重精确为零
正则化起源:给行李箱定“限重税”
想象你收拾行李准备出差。如果箱子无限大,你会把整个衣柜都塞进去——西装、沙滩裤、健身弹力带、三副墨镜……结果箱子重得根本拎不动,到了酒店才发现真正常用的东西被压在最底层。这就是过拟合:模型把训练数据里所有细节(甚至噪声)都背下来了,换个新场景立刻失灵。
机器学习里的“行李限重”叫正则化(Regularization)。我们在原本的拟合损失里加一项“重量税”,让模型在拟合数据和保持简单之间做权衡。数学上写成通式:损失 + λ × 惩罚。λ 就是“限重管理员”,λ 越大,惩罚越狠,模型越简单。
岭回归(Ridge)是最早流行的“限重税”——税基是所有权重的平方和,相当于“超重费”:每件物品都交钱,但大件交得多、小件交得少,结果谁都没被扔掉,只是整体变小。先介绍它,是因为 Lasso 是它“换了收税方式”的亲戚,两者放在一起对比,才能凸显 L1 的“狠”。
当你理解了“限重税”的框架,L1 和 L2 的区别就只剩一个关键问题:税是怎么收的?按平方收,还是按绝对值收?下一节,我们看看“断舍离管家”按绝对值收税,会带来怎样意想不到的效果。
- 全局最优化目标等号左边是“最终要找的那组权重”,读作“使得花括号里整体目标最小的那组 w”。
- 拟合误差项真实值与预测值之差的平方和,衡量模型在训练数据上“背得熟不熟”。
- 惩罚强度λ 是“限重管理员”,越大惩罚越狠,权重整体被压得越小。
- L2 惩罚项所有权重平方之和,平方让大权重受罚更重、小权重受罚更轻。
L1范数本质:绝对值之税
假设行李箱规则改成“每件物品按体积绝对值交一笔固定税”:Kindle 占 1 个单位、吹风机占 2 个单位,税就是体积本身。这时候你会立刻发现:那些“可用可不用”的东西交的税和必需品一样实在,干脆不带!
这套“绝对值之税”就是 L1 范数惩罚。把岭回归的平方项改成绝对值,就得到 Lasso(Least Absolute Shrinkage and Selection Operator,最小绝对值收缩与选择算子)。名字里藏着两个功能:收缩(把权重往 0 压)和选择(把某些权重直接压成 0 丢掉)。
关键在于 $|w|$ 在 $w=0$ 处有一个“尖角”(不可导点)。拟合时如果想轻微移动权重来改善损失,L1 的税立刻线性增加。这个尖角的存在,让 $w=0$ 常常成为全局最优;而 L2 的平方项在 0 附近是平滑抛物线,移动一点权重税几乎不变,所以它更愿意“留着小步磨蹭”(保留微小非零值)。L1 则是“要么交税过关,要么干脆退回原点”。
回到行李比喻:L1 管家不会跟任何一件物品“讨价还价”,它只问一句:“这东西真的值这个税吗?”不值得,直接清零放回衣柜——这就是“稀疏”的由来。
- Lasso 权重解整体目标仍是“损失 + 惩罚”,只是惩罚形式换成了绝对值。
- 平均化因子$\frac{1}{2n}$ 让目标与样本量解耦,方便与 sklearn 等库的实现对齐。
- 绝对值罚项对每个权重按绝对值收“线性税”,惩罚不因权重大小而“打折”。
- 截距免罚注意罚项中 $j$ 从 1 开始,$w_0$(截距,即“什么都不带”的基线)不参与惩罚。
几何直觉:菱形箱子与角点解
为什么 L1 能把权重压成精确的 0,而 L2 不能?光看公式不直观,画出来就一目了然。把罚项改写成约束形式:我要在“所有物品重量之和不超过预算 t”的前提下,让旅途遗憾最小。t 变小,等于 λ 变大。
这个约束条件在二维平面上画出来:L1 是顶点落在坐标轴上的菱形,L2 是圆。损失函数的等高线是一圈圈围绕最优点的椭圆。约束下的最优解,就是“等高线最先碰到约束区域”的那个点。
椭圆第一次碰上圆,通常碰在圆弧上——两个坐标都非零;但椭圆第一次碰上菱形,常常撞在尖角上——角点恰好落在坐标轴上,意味着某个权重精确等于 0。特征再多时,高维空间里 L1 约束多面体的顶点密密麻麻,解落在“角点”的概率大大增加。
类比:圆形行李箱怎么塞都是“圆鼓鼓”,每件都塞一点;菱形行李箱有犄角,东西顺着角一码,其他东西自然没地方放。L1 的“角点解”,就是现实世界里断舍离的数学化身。
- 矩阵化损失把 n 个样本的残差写成向量二范数的平方,展开就是各残差平方和。
- L1 预算约束所有权重的绝对值之和不能超过 t,相当于“箱子限重”。
- 两种写法等价同一个解既可以写成罚项形式,也可以写成约束形式,只是参数 λ 和 t 的对应关系不同。
Lasso求解:坐标下降与软阈值
数学上明确了 L1 想把物品清零,但怎么“劝”它执行?梯度下降在这里碰了钉子:$|w|$ 在 0 处没有导数,梯度下降到 0 附近就不知道该往哪走。于是人们换了个思路——坐标下降。
坐标下降像整理行李箱:一次只处理一件物品,其他物品先固定不动。对每件物品单独计算“在当前背包状态下它还能贡献多少”,然后决策:贡献值超过税就留下,否则清零。
这个“决策阀”叫软阈值算子:把候选值 $z$ 的绝对值减去 λ,结果小于 0 就置 0,否则保留符号并收缩 λ。注意“软”字——它不像“硬阈值”那样直接一刀切,而是“先扣税再决定去留”。
软阈值就像行李箱整理师的“三秒决断”:拿起一件物品,看一眼价值 z,减去税 λ,还有剩就带,没剩就扔。把所有物品轮一遍、再轮一遍,直到箱子稳定下来。sklearn 的 Lasso 内部核心正是这一套(配合坐标循环与稀疏优化技巧);而 λ 的取值则由交叉验证来决定——试一排限重标准,挑验证集表现最好的那个。
- 符号函数sign(z) 只留下 +1、-1 或 0,用来“保留方向”。
- 扣税净价值把 $|z|$ 减去 λ,负数就归 0,得到“交完税还剩多少”。
- 合并效果候选值落在 $(-\lambda, \lambda)$ 内直接输出 0,落在外面则向 0 收缩 λ。
特征选择:自动断舍离
传统上做特征选择像面试官筛简历:先凭经验判断哪些变量大概有用,再逐步回归一个个试,费时费力还可能出错。Lasso 把这件事自动化了:认认真真训练一次,那些“无用物品”的权重直接变 0,模型自己完成了选择。
这在“高维数据”(特征数 p 远大于样本数 n)场景尤其珍贵:基因芯片数据动辄上万基因,样本却只有几十个。Lasso 在这类数据上会自动挑出少数关键基因,而且数学上有一个重要保证——非零权重的个数不会超过样本数。
除了自动选择,稀疏解还带来可解释性:一个风控模型如果有 200 个特征,业务人员根本没法跟合规部门解释;Lasso 把模型瘦身到 8 个关键特征,每个系数的含义就能讲清楚“为什么这个变量影响违约率”。
回到行李箱:断舍离大师的成果是你能在 30 秒内找到护照和充电器,因为箱子里只剩必需品。稀疏模型同理——它让你的模型“箱子”一目了然,随时可以向任何人解释带了什么、为什么带。
- 零范数定义统计非零系数的个数,是衡量“稀疏度”的天然度量。
- 样本量上限当 $p > n$ 时,Lasso 最多只能选出 n 个非零特征。
- 特征数上限非零个数当然不会超过特征总数,两者取小即得最终上界。
实战应用:从理论到代码
理论完备,回到“装行李现场”。第一步是标准化:如果不把每件物品按统一规格打包,大件物品(量纲大的特征)天然“显得重要”,税就收得不公平。所以使用 Lasso 前,习惯上先对特征做标准化(sklearn 中可用 StandardScaler 或放进 Pipeline)。
然后就是 λ 的选择——对应“限重的松紧”。λ 太小相当于不限重,模型退化成普通线性回归;λ 太大相当于只让带一件“万能工具”,模型欠拟合。工程上常用交叉验证:把数据切几份,逐一试 λ,选验证误差最小的。sklearn 的 LassoCV 直接完成了整条“正则化路径”的扫描。标准化空间中的目标函数写法如下:
解读结果时抓住一条原则:系数非零的特征 = 被留下的物品。把非零系数按绝对值从大到小排序,那就是模型眼里的“重要性排行榜”;排行榜之外的项目,都可以放心地从采集管道中移除,省下真金白银的数据存储与计算成本。至此,“断舍离管家”的完整工作流已经清晰:统一规格打包(标准化)→ 定限重标准(交叉验证选 λ)→ 逐件决断(坐标下降 + 软阈值)→ 交付清爽行李箱(稀疏模型)。
- 标准化后的特征每个特征减去均值、除以标准差,统一到同一尺度,让税公平。
- 标准化空间的新权重在标准化空间里求解 Lasso,得到的系数可直接横向比较。
- 还原原始系数若业务上需要原始量纲的系数,按标准化比例换算回去即可。
AI 应用场景
基因表达与疾病诊断
阶段:特征工程(特征选择)
解决的问题:传统上医生凭经验手工挑选少数基因,容易遗漏关键交互信息;而基因芯片数据常有 2 万个特征、只有几十个样本,全量建模必然过拟合且无法解释。Lasso 自动筛出 10~30 个与疾病强相关的基因,既提升预测稳定性,又给出可验证的生物标记物。
具体案例:某癌症研究团队用 Lasso 在 2 万个基因中筛出 23 个标记基因,构建的判别模型在独立验证集上 AUC 达 0.91;随后的文献检索确认其中 17 个已有报道支持,其余成为新研究假设。
信贷风控评分卡
阶段:模型可解释性(特征精简)
解决的问题:银行风控模型必须通过监管审查,200 多个原始变量无法向合规部门解释;传统逐步回归反复试错且不稳定。Lasso 把变量压到 15 个,非零系数直接构成“评分卡”,每个属性的加减分一目了然。
具体案例:某消费金融公司用 Lasso 构建申请评分卡,坏账率下降 18%,模型上线前的合规审查周期从 3 个月缩短到 3 周。
点击率预估特征预筛
阶段:特征工程流水线(前置筛选)
解决的问题:CTR 模型特征动辄上亿维,直接进入深度学习模型内存爆炸。把 Lasso 当作“预筛器”跑在前端,先砍掉 90% 无关特征,保留的信号再送入后续模型,训练成本大幅下降。
具体案例:某广告平台对原始 user/item 交叉特征先跑一轮 Lasso,特征从 800 万压到 50 万,DeepFM 训练时间从 3 天降到 8 小时,线上 AUC 基本持平。
Python 演示
import numpy as npfrom sklearn.datasets import make_regressionfrom sklearn.linear_model import Lassofrom sklearn.preprocessing import StandardScaler def soft_threshold(a, lam): """软阈值算子: |a| 减去 lam, 负了就归 0, 符号保留""" return np.sign(a) * max(abs(a) - lam, 0.0) def lasso_coordinate_descent(X, y, lam, iters=300): """用坐标下降求解 Lasso: 一次只更新一个权重""" n, p = X.shape norms = np.sqrt((X ** 2).sum(axis=0)) Xn = X / norms w = np.zeros(p) for _ in range(iters): for j in range(p): r = y - Xn @ w rho = Xn[:, j] @ (r + Xn[:, j] * w[j]) w[j] = soft_threshold(rho, lam) return w / norms if __name__ == "__main__": X, y = make_regression(n_samples=100, n_features=20, n_informative=5, noise=2.0, random_state=42) Xs = StandardScaler().fit_transform(X) ys = y - y.mean() lam = 40.0 w_my = lasso_coordinate_descent(Xs, ys, lam) model = Lasso(alpha=lam / Xs.shape[0], max_iter=5000) model.fit(Xs, ys) nz_my = sum(abs(w_my) > 1e-6) nz_sk = sum(abs(model.coef_) > 1e-6) print("my nonzero:", nz_my, "sklearn nonzero:", nz_sk) print("max diff:", np.abs(w_my - model.coef_).max())
def soft_threshold(a, lam):软阈值算子是整个算法的“心脏”,负责“扣税后决定去留”。return np.sign(a) * max(abs(a) - lam, 0.0)方向保留、绝对值扣税、负数归零,一步完成。norms = np.sqrt((X ** 2).sum(axis=0))计算每列的二范数,用于列归一化。Xn = X / norms把每个特征缩放到单位长度,让坐标更新的闭式解不再需要额外除法。r = y - Xn @ w计算当前全模型的残差向量,这是所有坐标更新的共享输入。rho = Xn[:, j] @ (r + Xn[:, j] * w[j])先“剔除”第 j 列自己的贡献,再求它和新残差的相关度。w[j] = soft_threshold(rho, lam)对候选相关度执行软阈值,一次“三秒决断”。w_my = lasso_coordinate_descent(Xs, ys, lam)手写实现跑出权重向量。model = Lasso(alpha=lam / Xs.shape[0], max_iter=5000)注意 sklearn 的目标函数带 1/(2n),所以 alpha 要除以样本数才能对齐。print("my nonzero:", nz_my, "sklearn nonzero:", nz_sk)两边的非零系数个数一致,说明稀疏解也对上了。
常见误区
误区平方比绝对值大,惩罚力度更强,那 L2 应该更容易把权重清零才对。
正解恰好相反。看它们在 0 附近的行为:当 $0 < |w| < 1$ 时,$|w| > w^2$,L1 对小权重收的税其实比 L2 更重;而且 L1 在 0 处有尖角,把权重推向精确的 0 是它的“本能”。L2 的平方项在 0 附近非常平缓,权重只是被按比例缩小,理论上永远不会恰好等于 0(除非初始就是 0)。
为何常见:直觉上拿“全局大小”比较平方与绝对值,忽略了“0 附近”这一决定稀疏性的关键局部形状。
误区既然惩罚能防过拟合,那把 λ 调到最大,所有特征都清掉,模型一定最稳。
正解λ 过大连真正重要的特征也一起清零,模型变成“空箱子”,预测值恒为常数,严重欠拟合。λ=0 是普通回归(过拟合风险高),λ→∞ 是空模型,正确的 λ 在中间某处。工程上应沿“正则化路径”做交叉验证,选验证误差最小的点。
为何常见:把正则化理解为“越使劲越好”,忽略了偏差与方差需要平衡——限重过严,出差要用的东西也没了。
误区模型训练完,非零系数按绝对值排个序,前几名就是最重要的特征。
正解系数大小受特征尺度影响(必须先标准化才能横向比较);同时 Lasso 系数是带收缩偏差的估计量,对高度相关的特征还会“随机二选一”。更稳健的做法是结合多次重采样(统计某个特征被选中的频率)、稳定性选择或领域知识综合判断。
为何常见:Lasso 的“自动选择”能力给了人“排名即重要性”的错觉,忽略了惩罚带来的有偏估计和特征间的替代性。
误区|w| 在 0 处没有导数,梯度下降用不了,Lasso 是不是根本上不了台面?
正解不可导不意味着无法优化。主流做法是用软阈值算子配合坐标下降:每个坐标都有闭式解,迭代非常快,这也是 sklearn 的默认内核。恰恰是那个不可导的尖角,才保证了稀疏解的存在——如果处处光滑,反而压不出精确的 0。
为何常见:把“可导性”当成“可优化性”的必要条件,忽略了凸优化里大量处理不可导项的成熟工具。
面试题
Q1. Lasso(L1 正则化)的惩罚项在数学上是什么形式?
- A.所有权重的绝对值之和← 正确答案
- B.所有权重的平方之和
- C.所有权重的立方之和
- D.所有权重的指数之和
答案:A。Lasso 的惩罚项是 $\sum |w_j|$,即绝对值之和。平方和是岭回归(L2),立方与指数都不是标准正则化形式。记住“L1 绝对值、L2 平方”这对搭档即可。
Q2. L1 正则化产生稀疏解的根本几何原因是?
- A.损失函数等高线是圆形的
- B.菱形约束域的顶点位于坐标轴上← 正确答案
- C.数据集经过了标准化处理
- D.损失函数本身是凸光滑的
答案:B。L1 约束域 $|w_1|+|w_2| \le t$ 是菱形,角点恰好在坐标轴上,损失等高线扩张时最先撞上角点,对应某个权重正好为 0。圆形约束是 L2 的特征;标准化与光滑性都不是稀疏的几何根源。
Q3. 使用 Lasso 前,对特征进行标准化的主要原因是?
- A.让特征均值都等于零
- B.让特征量纲统一惩罚公平← 正确答案
- C.让模型训练速度变慢
- D.让目标值呈正态分布
答案:B。惩罚项直接对权重幅度收税,量纲大的特征天然系数小、量纲小的特征系数大,不标准化税就收得不公平。均值归零只是标准化的附带效果;训练速度与目标分布都不是标准化要解决的核心问题。
Q4. 求解 Lasso 的标准算法坐标下降中,单步更新依赖的核心算子是?
- A.梯度裁剪规则
- B.坐标软阈值算子← 正确答案
- C.批量归一化算子
- D.随机掩码规则
答案:B。坐标下降固定其他维度,对单个坐标求带 L1 惩罚的极值,闭式解正是软阈值 $S(z,\lambda)=\mathrm{sign}(z)\max(|z|-\lambda,0)$。梯度裁剪、批量归一化、掩码都与 Lasso 的坐标更新无关。
Q5. 当正则化参数 λ 从 0 逐渐增大时,Lasso 的权重会怎样变化?
- A.所有权重同比例线性放大
- B.权重整体收缩,小权重先归零← 正确答案
- C.权重保持不变直到某阈值
- D.所有权重同时变为负数
答案:B。λ 增大意味着“税”加重,解沿正则化路径移动:次要特征的系数先到 0 并被“钉住”,主要特征继续收缩。这一路径是逐段线性的。放大、不变、变负都与 Lasso 的性质矛盾。
Q6. 在特征高度相关的一簇变量中,Lasso 通常会如何表现?
- A.保留簇内全部变量
- B.随机只挑一个或少数几个← 正确答案
- C.对每个变量平均分配权重
- D.强制所有系数变为相等
答案:B。相关特征间存在很强的替代性,L1 惩罚会让解落在“代价面”的某个角点上,相当于随机挑选簇里的一个代表变量。这正是 ElasticNet 引入 L2 项的原因——让整簇变量一起被收缩而不是心不甘情不愿地二选一。
Q7. 关于 Lasso 与岭回归的区别,下列说法正确的是?
- A.岭回归约束域是菱形,Lasso 是圆形
- B.Lasso 能产生精确零权重的稀疏解← 正确答案
- C.岭回归一定会把所有特征系数清零
- D.Lasso 的解必须是全局唯一的
答案:B。L1 的菱形角点带来稀疏解,L2 的圆形只会按比例收缩,不会精确清零。A 把二者说反了;C 与岭回归性质矛盾;D 在特征高度相关时 Lasso 解可能不唯一。
Q8. 下列哪些陈述符合 L1 正则化的特性?
- A.惩罚项使用权重绝对值之和← 正确答案
- B.解常落在约束域的角点上← 正确答案
- C.权重会被精确收缩到零← 正确答案
- D.惩罚项使用权重平方之和
答案:ABC。A 是 L1 的定义;B 是菱形约束产生角点解的几何表现;C 是稀疏性的直接含义。D 说的是 L2 正则化,故不选。这题考察对 L1 与 L2 “形与果”的整体把握。
Q9. Lasso 在实际应用中常见的注意事项有哪些?
- A.特征需要先做标准化← 正确答案
- B.λ 应通过交叉验证来选取← 正确答案
- C.对强相关特征可能只随机选一个← 正确答案
- D.高维时非零系数可以超过样本数
答案:ABC。标准化保证惩罚公平;交叉验证在正则化路径上平衡偏差与方差;相关特征之间 Lasso 有“二选一”倾向。D 错误——理论保证非零系数个数不超过 $\min(n,p)$,高维下就是不超过样本数 n。
Q10. 当特征维度远大于样本量(p≫n)时,Lasso 的非零系数个数理论上限是?
- A.最多不超过样本数 n← 正确答案
- B.可以接近特征数 p
- C.并没有任何理论限制
- D.必须恰好等于样本数 n
答案:A。Lasso 的 KKT 条件与线性方程组可解性给出 $\|w\|_0 \le \min(n,p)$,p≫n 时即不超过 n。B 违背该上界;C 否认理论保证的存在;D 错在“必须等于”——上界是“不超过”而非“恰好等于”。