【特征选择方法】L1正则化(Lasso)

特征选择神器: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=1n(yixiβ)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β2n1y22+λj=1pβj
或向量形式:
minβ12n∥y−Xβ∥22+λ∥β∥1 min_{\beta} \frac{1}{2n}\|y - X\beta\|_2^2 + \lambda \|\beta\|_1 minβ2n1y22+λβ1

各部分含义:
  • ∥y−Xβ∥22\|y - X\beta\|_2^2y22:残差平方和(拟合误差项)
  • λ\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:普通线性回归的系数
  • 规则:
    1. ∣β^jOLS∣≤λ|\hat{\beta}_j^{OLS}| \leq \lambdaβ^jOLSλ:系数直接→0(特征被剔除)
    2. ∣β^jOLS∣>λ|\hat{\beta}_j^{OLS}| > \lambdaβ^jOLS>λ:系数减去λ\lambdaλ(保留但被惩罚)

3. 求解算法(不用深钻,知道即可)

L1正则化的目标函数在βj=0\beta_j=0βj=0处不可导,常用求解方法:

  • 坐标下降法:依次优化单个系数,效率高(sklearn默认用)
  • 子梯度法:处理不可导点
  • LARS-Lasso:适合小样本高维数据

五、L1正则化特征选择完整流程(必背)

  1. 数据准备:输入特征矩阵XXX,目标变量yyy
  2. 特征标准化(关键步骤)
    L1对特征尺度敏感(如“收入(元)”和“年龄(岁)”),需标准化为“均值=0,方差=1”
  3. 设置正则化系数λ\lambdaλ
    控制惩罚强度,需通过交叉验证优化
  4. 训练Lasso模型:最小化目标函数,得到稀疏系数β\betaβ
  5. 筛选特征:保留βj≠0\beta_j \neq 0βj=0的特征,剔除βj=0\beta_j=0βj=0的特征
  6. 模型评估:用筛选后的特征重新建模,验证性能

六、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正则化的优缺点(必背)

优点

  1. 自动特征选择:系数→0实现稀疏性,无需手动筛选
  2. 模型简洁易解释:只保留关键特征,可直接解释“哪些因素起作用”
  3. 适用于高维数据:特征数远大于样本数(p≫np \gg npn)时仍有效(如基因、文本数据)
  4. 计算高效:用坐标下降法求解,收敛快,适合大规模数据

缺点

  1. 对多重共线性敏感:特征高度相关时,会随机剔除部分相关特征(即使都重要)
  2. 最多选n个特征:样本数为n时,Lasso最多保留n个非零特征
  3. 依赖λ\lambdaλ调优λ\lambdaλ 过大/过小会导致“特征过少/过拟合”,需交叉验证
  4. 只适用于线性关系:无法捕捉非线性特征交互(需配合特征工程,如多项式扩展)

八、L1与其他特征选择方法对比

方法核心原理是否稀疏考虑特征相关性嵌入模型训练
L1正则化(Lasso)L1范数惩罚否(敏感)
L2正则化(Ridge)L2范数惩罚是(平滑处理)
Elastic NetL1+L2混合惩罚是(缓解共线性)
Filter法(相关系数)统计指标排序
Wrapper法(RFE)模型性能递归筛选
树模型(随机森林)节点分裂贡献

九、适用场景与替代方案

优先用L1正则化的情况

  1. 高维数据(p≫np \gg npn):如文本、基因、图像特征
  2. 需强解释性:如经济建模、医学诊断、金融风控
  3. 模型需简洁:部署场景(如实时预测)
  4. 特征相关性低:无多重共线性

考虑其他方法的情况

  1. 特征高度相关:用Elastic Net(L1+L2混合)
  2. 仅防过拟合不筛选特征:用Ridge回归
  3. 非线性关系:用随机森林、XGBoost(自带特征重要性)
  4. 预测性能优先:用Wrapper法(如RFE+SVM)

十、最简单总结(背诵版)

  1. L1正则化(Lasso)= 线性回归 + L1范数惩罚
  2. 核心作用:自动筛选特征(系数→0)+ 防止过拟合
  3. 关键步骤:必须标准化特征 + 交叉验证调λ\lambdaλ
  4. 优点:高效、简洁、易解释,适用于高维数据
  5. 缺点:怕多重共线性,只适用于线性关系
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

DeepModel

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值