特征选择神器:L1正则化(Lasso)|原理+公式+Python实战全攻略
L1正则化(又称Lasso回归)是高维数据特征选择、防止模型过拟合的核心方法,能自动将不重要的特征系数压缩为0,实现“建模即筛选”。
一、先搞懂:为什么需要L1正则化?
1. 特征选择的核心痛点
现实场景中,特征往往成百上千(如基因数据、文本数据),但大部分特征:
- 无用(如“星座”与“感冒概率”)
- 冗余(如“身高”与“体重”高度相关)
- 干扰模型(增加过拟合风险、降低解释性)
手动筛选特征效率低,而L1正则化能自动剔除无用特征,让模型更简洁、更易解释。
2. L1正则化的核心作用
- 特征选择:不重要特征的系数→0,相当于被“扔掉”
- 防止过拟合:惩罚大系数,避免模型过度依赖个别特征
- 提升解释性:最终只保留关键特征,直观知道“哪些因素起作用”
二、L1正则化是什么?通俗理解
1. 本质:给模型加“惩罚项”
普通线性回归只追求“拟合数据最好”,而L1正则化在此基础上,增加对“特征系数绝对值之和”的惩罚:
- 重要特征:系数大,惩罚后仍保留较大值
- 不重要特征:系数小,惩罚后直接变成0
2. 形象比喻:“套索(Lasso)”
L1正则化的英文“Lasso”本意是“套索”,可以理解为:
用套索把所有特征“捆住”,然后慢慢收紧——不重要的特征被直接“勒断”(系数→0),只剩关键特征留在模型里。
三、核心公式(必须掌握)
1. 普通线性回归目标函数(最小二乘)
minβ12n∑i=1n(yi−xi⊤β)2 min_{\beta} \frac{1}{2n}\sum_{i=1}^n (y_i - x_i^\top \beta)^2 minβ2n1i=1∑n(yi−xi⊤β)2
- 只关注“预测值与真实值的误差最小”,容易导致系数过大(过拟合)
2. L1正则化(Lasso)目标函数
minβ12n∥y−Xβ∥22+λ∑j=1p∣βj∣
min_{\beta} \frac{1}{2n}\|y - X\beta\|_2^2 + \lambda \sum_{j=1}^p |\beta_j|
minβ2n1∥y−Xβ∥22+λj=1∑p∣βj∣
或向量形式:
minβ12n∥y−Xβ∥22+λ∥β∥1
min_{\beta} \frac{1}{2n}\|y - X\beta\|_2^2 + \lambda \|\beta\|_1
minβ2n1∥y−Xβ∥22+λ∥β∥1
各部分含义:
- ∥y−Xβ∥22\|y - X\beta\|_2^2∥y−Xβ∥22:残差平方和(拟合误差项)
- λ\lambdaλ:正则化系数(惩罚强度)
- λ\lambdaλ 越大:惩罚越重,越多系数→0(特征越少)
- λ\lambdaλ 越小:惩罚越轻,系数越接近普通回归(特征越多)
- ∥β∥1=∑j=1p∣βj∣\|\beta\|_1 = \sum_{j=1}^p |\beta_j|∥β∥1=∑j=1p∣βj∣:L1范数(惩罚项核心),即所有特征系数的绝对值之和
四、关键原理:为什么L1能让系数→0?
1. 几何解释(最直观)
- 目标函数的等高线:椭圆(越靠近中心,拟合误差越小)
- L1正则化的约束边界:菱形(二维)/超正方体(高维)
当椭圆与菱形“相切”时,切点大概率落在坐标轴上——此时对应特征的系数βj=0\beta_j=0βj=0,实现稀疏性(部分特征被剔除)。
而L2正则化(岭回归)的约束边界是“圆”,切点很少落在坐标轴上,无法产生稀疏解。
2. 数学解释:软阈值函数
Lasso的最优解满足“软阈值函数”(设计矩阵正交时的封闭解):
β^jLasso=sign(β^jOLS)⋅max(∣β^jOLS∣−λ,0)
\hat{\beta}_j^{Lasso} = sign(\hat{\beta}_j^{OLS}) \cdot max(|\hat{\beta}_j^{OLS}| - \lambda, 0)
β^jLasso=sign(β^jOLS)⋅max(∣β^jOLS∣−λ,0)
- β^jOLS\hat{\beta}_j^{OLS}β^jOLS:普通线性回归的系数
- 规则:
- 若∣β^jOLS∣≤λ|\hat{\beta}_j^{OLS}| \leq \lambda∣β^jOLS∣≤λ:系数直接→0(特征被剔除)
- 若∣β^jOLS∣>λ|\hat{\beta}_j^{OLS}| > \lambda∣β^jOLS∣>λ:系数减去λ\lambdaλ(保留但被惩罚)
3. 求解算法(不用深钻,知道即可)
L1正则化的目标函数在βj=0\beta_j=0βj=0处不可导,常用求解方法:
- 坐标下降法:依次优化单个系数,效率高(sklearn默认用)
- 子梯度法:处理不可导点
- LARS-Lasso:适合小样本高维数据
五、L1正则化特征选择完整流程(必背)
- 数据准备:输入特征矩阵XXX,目标变量yyy
- 特征标准化(关键步骤):
L1对特征尺度敏感(如“收入(元)”和“年龄(岁)”),需标准化为“均值=0,方差=1” - 设置正则化系数λ\lambdaλ:
控制惩罚强度,需通过交叉验证优化 - 训练Lasso模型:最小化目标函数,得到稀疏系数β\betaβ
- 筛选特征:保留βj≠0\beta_j \neq 0βj=0的特征,剔除βj=0\beta_j=0βj=0的特征
- 模型评估:用筛选后的特征重新建模,验证性能
六、Python 完整实战:加利福尼亚房价特征选择
1. 导入库+加载数据
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import Lasso, LassoCV
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import mean_squared_error, r2_score
import warnings
warnings.filterwarnings("ignore")
# 加载数据(20640个样本,8个特征)
california = fetch_california_housing()
X = pd.DataFrame(california.data, columns=california.feature_names)
y = california.target
print("样本数:", X.shape[0])
print("特征数:", X.shape[1])
print("特征名:", list(X.columns))
X.head()
2. 数据预处理(拆分+标准化)
# 拆分训练集/测试集(7:3)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 标准化(L1必须步骤)
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
3. 初始Lasso模型(固定λ\lambdaλ)
# 设置初始正则化系数
alpha_init = 0.1
lasso_init = Lasso(alpha=alpha_init)
lasso_init.fit(X_train_scaled, y_train)
# 查看特征系数
coef_init = pd.Series(lasso_init.coef_, index=X.columns)
print("=== 初始Lasso(alpha=0.1)特征系数 ===")
print(coef_init)
print(f"被剔除的特征数(系数=0):", sum(coef_init == 0))
# 模型性能评估
y_pred_init = lasso_init.predict(X_test_scaled)
print(f"\nMSE(均方误差):", mean_squared_error(y_test, y_pred_init).round(3))
print(f"R²(决定系数):", r2_score(y_test, y_pred_init).round(3))
4. 交叉验证找最优λ\lambdaλ(推荐做法)
# LassoCV:自动交叉验证选最优alpha
lasso_cv = LassoCV(cv=5, max_iter=10000, random_state=42)
lasso_cv.fit(X_train_scaled, y_train)
print(f"\n=== 交叉验证最优结果 ===")
print(f"最优alpha:", lasso_cv.alpha_.round(4))
# 用最优alpha建模
lasso_best = Lasso(alpha=lasso_cv.alpha_)
lasso_best.fit(X_train_scaled, y_train)
coef_best = pd.Series(lasso_best.coef_, index=X.columns)
print("\n最优模型特征系数:")
print(coef_best)
print(f"被剔除的特征数:", sum(coef_best == 0))
# 最优模型性能
y_pred_best = lasso_best.predict(X_test_scaled)
print(f"\n最优模型 MSE:", mean_squared_error(y_test, y_pred_best).round(3))
print(f"最优模型 R²:", r2_score(y_test, y_pred_best).round(3))
5. 特征系数可视化
plt.figure(figsize=(10, 6))
coef_best.sort_values().plot(kind='barh', color=['red' if c == 0 else 'skyblue' for c in coef_best])
plt.title("Lasso最优模型特征系数(红色=被剔除特征)", fontsize=14)
plt.xlabel("系数值", fontsize=12)
plt.grid(alpha=0.3, axis='x')
plt.tight_layout()
plt.show()
6. 筛选特征后建模(最终步骤)
# 筛选系数≠0的特征
selected_features = coef_best[coef_best != 0].index.tolist()
print("=== 最终筛选的特征 ===")
print(selected_features)
# 用筛选后的特征重新训练模型
X_train_selected = X_train[selected_features]
X_test_selected = X_test[selected_features]
# 标准化筛选后的特征
scaler_selected = StandardScaler()
X_train_selected_scaled = scaler_selected.fit_transform(X_train_selected)
X_test_selected_scaled = scaler_selected.transform(X_test_selected)
# 训练线性回归模型
from sklearn.linear_model import LinearRegression
model_final = LinearRegression()
model_final.fit(X_train_selected_scaled, y_train)
# 最终性能
y_pred_final = model_final.predict(X_test_selected_scaled)
print(f"\n筛选后模型 R²:", r2_score(y_test, y_pred_final).round(3))
七、L1正则化的优缺点(必背)
优点
- 自动特征选择:系数→0实现稀疏性,无需手动筛选
- 模型简洁易解释:只保留关键特征,可直接解释“哪些因素起作用”
- 适用于高维数据:特征数远大于样本数(p≫np \gg np≫n)时仍有效(如基因、文本数据)
- 计算高效:用坐标下降法求解,收敛快,适合大规模数据
缺点
- 对多重共线性敏感:特征高度相关时,会随机剔除部分相关特征(即使都重要)
- 最多选n个特征:样本数为n时,Lasso最多保留n个非零特征
- 依赖λ\lambdaλ调优:λ\lambdaλ 过大/过小会导致“特征过少/过拟合”,需交叉验证
- 只适用于线性关系:无法捕捉非线性特征交互(需配合特征工程,如多项式扩展)
八、L1与其他特征选择方法对比
| 方法 | 核心原理 | 是否稀疏 | 考虑特征相关性 | 嵌入模型训练 |
|---|---|---|---|---|
| L1正则化(Lasso) | L1范数惩罚 | 是 | 否(敏感) | 是 |
| L2正则化(Ridge) | L2范数惩罚 | 否 | 是(平滑处理) | 是 |
| Elastic Net | L1+L2混合惩罚 | 是 | 是(缓解共线性) | 是 |
| Filter法(相关系数) | 统计指标排序 | 是 | 否 | 否 |
| Wrapper法(RFE) | 模型性能递归筛选 | 是 | 是 | 是 |
| 树模型(随机森林) | 节点分裂贡献 | 是 | 是 | 是 |
九、适用场景与替代方案
优先用L1正则化的情况
- 高维数据(p≫np \gg np≫n):如文本、基因、图像特征
- 需强解释性:如经济建模、医学诊断、金融风控
- 模型需简洁:部署场景(如实时预测)
- 特征相关性低:无多重共线性
考虑其他方法的情况
- 特征高度相关:用Elastic Net(L1+L2混合)
- 仅防过拟合不筛选特征:用Ridge回归
- 非线性关系:用随机森林、XGBoost(自带特征重要性)
- 预测性能优先:用Wrapper法(如RFE+SVM)
十、最简单总结(背诵版)
- L1正则化(Lasso)= 线性回归 + L1范数惩罚
- 核心作用:自动筛选特征(系数→0)+ 防止过拟合
- 关键步骤:必须标准化特征 + 交叉验证调λ\lambdaλ
- 优点:高效、简洁、易解释,适用于高维数据
- 缺点:怕多重共线性,只适用于线性关系
&spm=1001.2101.3001.5002&articleId=159347750&d=1&t=3&u=5b7acb8eb4e648ed90957887d90cca39)
2112

被折叠的 条评论
为什么被折叠?



