共计 2629 个字符,预计需要花费 7 分钟才能阅读完成。
背景痛点:为什么需要 Lasso 回归?
当我们在处理包含大量特征的数据集时,传统线性回归往往会遇到两个典型问题:

- 多重共线性:当特征之间存在高度相关性时,模型估计的系数会变得极不稳定,表现为微小的数据变动可能导致系数值发生显著变化
- 过拟合风险:随着特征数量增加,模型复杂度急剧上升,在样本量有限时容易记住噪声而非真实规律
举个例子,在房价预测场景中,如果我们同时使用 ” 卧室数量 ”、” 卫生间数量 ” 和 ” 房屋面积 ” 作为特征,这些变量之间往往存在相关性(大房子通常卧室和卫生间也多),这时传统最小二乘估计就可能给出违反直觉的系数(比如出现负的卧室系数)。
技术对比:Lasso vs 岭回归
1996 年 Tibshirani 提出的 Lasso 回归通过引入 L1 正则化项,完美解决了上述问题。我们先看数学形式的差异:
-
岭回归(L2 正则化):
$$\min_{\beta} \left| y – X\beta \right|_2^2 + \alpha \left| \beta \right|_2^2$$ -
Lasso 回归(L1 正则化):
$$\min_{\beta} \left| y – X\beta \right|_2^2 + \alpha \left| \beta \right|_1$$
关键区别在于正则项的形状:
- L2 正则化(岭回归)的惩罚项是系数的平方和,会使所有系数均匀缩小,但很少会精确为零
- L1 正则化(Lasso)的惩罚项是系数的绝对值之和,具有产生稀疏解的特性——它会将不重要特征的系数直接压缩到零
这就像收拾行李时的两种策略:岭回归是把所有物品都缩小一点体积塞进行李箱;而 Lasso 是直接扔掉不重要的物品,保留最关键的几件。
核心实现:scikit-learn 实战
基础流程代码示例
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
import numpy as np
# 数据标准化(关键步骤!)scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2)
# 创建 Lasso 模型(初始 alpha=1.0)lasso = Lasso(alpha=1.0)
lasso.fit(X_train, y_train)
# 查看系数
print("非零系数数量:", np.sum(lasso.coef_ != 0))
print("模型 R2 分数:", lasso.score(X_test, y_test))
交叉验证调参
选择合适的正则化强度 alpha 至关重要:
from sklearn.linear_model import LassoCV
# 自动选择最佳 alpha(内置 5 折交叉验证)lasso_cv = LassoCV(alphas=np.logspace(-3, 1, 50), cv=5)
lasso_cv.fit(X_scaled, y)
print("最佳 alpha:", lasso_cv.alpha_)
print("最优模型非零系数:", np.sum(lasso_cv.coef_ != 0))
性能考量与优化
计算复杂度分析
Lasso 的求解通常使用坐标下降法,其复杂度主要取决于:
- 特征数量 p
- 要求的精度
- 数据矩阵的稀疏性
对于超大规模特征(p > 10,000),建议:
- 使用
sklearn.linear_model.Lasso的selection='random'参数 - 考虑增量学习或在线学习方法
- 利用稀疏矩阵格式存储数据
特征相关性处理
当存在高度相关特征时,Lasso 可能随机选择其中一个而丢弃其他。解决方案:
- 先进行聚类分析,合并相似特征
- 使用弹性网络(ElasticNet)结合 L1 和 L2 正则化
- 基于业务知识手动选择代表性特征
避坑指南
必须标准化数据
由于 L1 正则化对系数大小敏感,务必在建模前进行标准化:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
系数解释陷阱
注意:被压缩为零的特征不一定不重要!可能因为:
- alpha 值设置过大
- 该特征与其他重要特征高度相关
建议通过以下方法验证特征重要性:
- 逐步减小 alpha 值观察系数变化曲线
- 使用 bootstrap 采样评估系数稳定性
- 结合领域知识判断
实战挑战:观察 alpha 的影响
使用波士顿房价数据集完成以下实验:
from sklearn.datasets import load_boston
import matplotlib.pyplot as plt
boston = load_boston()
X, y = boston.data, boston.target
# 标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
alphas = np.logspace(-3, 2, 50)
coefs = []
for a in alphas:
lasso = Lasso(alpha=a)
lasso.fit(X_scaled, y)
coefs.append(lasso.coef_)
# 绘制系数变化轨迹
plt.figure(figsize=(10,6))
plt.plot(alphas, coefs)
plt.xscale('log')
plt.xlabel('alpha')
plt.ylabel('coefficients')
plt.title('Lasso 系数随 alpha 变化轨迹')
plt.show()
观察任务:
- 哪个特征最顽强(最后才被压缩为零)?
- 当 alpha 为多少时,保留的特征数量与数据集的真实重要特征数量最接近?
- 哪些特征的系数变化轨迹呈现 ” 全有或全无 ” 的特点?
总结
Lasso 回归通过简洁优雅的数学形式,实现了特征选择和正则化的双重目标。在实践中记住三个关键点:
- 永远先标准化你的数据
- 使用交叉验证选择 alpha 参数
- 结合多种方法验证特征重要性
这种『精确制导』的特征选择能力,使其成为高维数据分析的利器。下次当你面对数百个特征却只有几十个样本时,不妨试试 Lasso 这把智能剪刀,它能帮你剪去冗余,留下精华。
