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

发布时间:2026/6/25 15:09:33

【特征选择方法】L1正则化(Lasso) 特征选择神器L1正则化Lasso原理公式Python实战全攻略L1正则化又称Lasso回归是高维数据特征选择、防止模型过拟合的核心方法能自动将不重要的特征系数压缩为0实现“建模即筛选”。一、先搞懂为什么需要L1正则化1. 特征选择的核心痛点现实场景中特征往往成百上千如基因数据、文本数据但大部分特征无用如“星座”与“感冒概率”冗余如“身高”与“体重”高度相关干扰模型增加过拟合风险、降低解释性手动筛选特征效率低而L1正则化能自动剔除无用特征让模型更简洁、更易解释。2. L1正则化的核心作用特征选择不重要特征的系数→0相当于被“扔掉”防止过拟合惩罚大系数避免模型过度依赖个别特征提升解释性最终只保留关键特征直观知道“哪些因素起作用”二、L1正则化是什么通俗理解1. 本质给模型加“惩罚项”普通线性回归只追求“拟合数据最好”而L1正则化在此基础上增加对“特征系数绝对值之和”的惩罚重要特征系数大惩罚后仍保留较大值不重要特征系数小惩罚后直接变成02. 形象比喻“套索Lasso”L1正则化的英文“Lasso”本意是“套索”可以理解为用套索把所有特征“捆住”然后慢慢收紧——不重要的特征被直接“勒断”系数→0只剩关键特征留在模型里。三、核心公式必须掌握1. 普通线性回归目标函数最小二乘m i n β 1 2 n ∑ i 1 n ( y i − x i ⊤ β ) 2 min_{\beta} \frac{1}{2n}\sum_{i1}^n (y_i - x_i^\top \beta)^2minβ​2n1​i1∑n​(yi​−xi⊤​β)2只关注“预测值与真实值的误差最小”容易导致系数过大过拟合2. L1正则化Lasso目标函数m i n β 1 2 n ∥ y − X β ∥ 2 2 λ ∑ j 1 p ∣ β j ∣ min_{\beta} \frac{1}{2n}\|y - X\beta\|_2^2 \lambda \sum_{j1}^p |\beta_j|minβ​2n1​∥y−Xβ∥22​λj1∑p​∣βj​∣或向量形式m i n β 1 2 n ∥ y − X β ∥ 2 2 λ ∥ β ∥ 1 min_{\beta} \frac{1}{2n}\|y - X\beta\|_2^2 \lambda \|\beta\|_1minβ​2n1​∥y−Xβ∥22​λ∥β∥1​各部分含义∥ y − X β ∥ 2 2 \|y - X\beta\|_2^2∥y−Xβ∥22​残差平方和拟合误差项λ \lambdaλ正则化系数惩罚强度λ \lambdaλ越大惩罚越重越多系数→0特征越少λ \lambdaλ越小惩罚越轻系数越接近普通回归特征越多∥ β ∥ 1 ∑ j 1 p ∣ β j ∣ \|\beta\|_1 \sum_{j1}^p |\beta_j|∥β∥1​∑j1p​∣βj​∣L1范数惩罚项核心即所有特征系数的绝对值之和四、关键原理为什么L1能让系数→01. 几何解释最直观目标函数的等高线椭圆越靠近中心拟合误差越小L1正则化的约束边界菱形二维/超正方体高维当椭圆与菱形“相切”时切点大概率落在坐标轴上——此时对应特征的系数β j 0 \beta_j0βj​0实现稀疏性部分特征被剔除。而L2正则化岭回归的约束边界是“圆”切点很少落在坐标轴上无法产生稀疏解。2. 数学解释软阈值函数Lasso的最优解满足“软阈值函数”设计矩阵正交时的封闭解β ^ j L a s s o s i g n ( β ^ j O L S ) ⋅ m a x ( ∣ β ^ j O L S ∣ − λ , 0 ) \hat{\beta}_j^{Lasso} sign(\hat{\beta}_j^{OLS}) \cdot max(|\hat{\beta}_j^{OLS}| - \lambda, 0)β^​jLasso​sign(β^​jOLS​)⋅max(∣β^​jOLS​∣−λ,0)β ^ j O L S \hat{\beta}_j^{OLS}β^​jOLS​普通线性回归的系数规则若∣ β ^ j O L S ∣ ≤ λ |\hat{\beta}_j^{OLS}| \leq \lambda∣β^​jOLS​∣≤λ系数直接→0特征被剔除若∣ β ^ j O L S ∣ λ |\hat{\beta}_j^{OLS}| \lambda∣β^​jOLS​∣λ系数减去λ \lambdaλ保留但被惩罚3. 求解算法不用深钻知道即可L1正则化的目标函数在β j 0 \beta_j0βj​0处不可导常用求解方法坐标下降法依次优化单个系数效率高sklearn默认用子梯度法处理不可导点LARS-Lasso适合小样本高维数据五、L1正则化特征选择完整流程必背数据准备输入特征矩阵X XX目标变量y yy特征标准化关键步骤L1对特征尺度敏感如“收入元”和“年龄岁”需标准化为“均值0方差1”设置正则化系数λ \lambdaλ控制惩罚强度需通过交叉验证优化训练Lasso模型最小化目标函数得到稀疏系数β \betaβ筛选特征保留β j ≠ 0 \beta_j \neq 0βj​0的特征剔除β j 0 \beta_j0βj​0的特征模型评估用筛选后的特征重新建模验证性能六、Python 完整实战加利福尼亚房价特征选择1. 导入库加载数据importnumpyasnpimportpandasaspdimportmatplotlib.pyplotaspltfromsklearn.datasetsimportfetch_california_housingfromsklearn.linear_modelimportLasso,LassoCVfromsklearn.model_selectionimporttrain_test_splitfromsklearn.preprocessingimportStandardScalerfromsklearn.metricsimportmean_squared_error,r2_scoreimportwarnings warnings.filterwarnings(ignore)# 加载数据20640个样本8个特征californiafetch_california_housing()Xpd.DataFrame(california.data,columnscalifornia.feature_names)ycalifornia.targetprint(样本数:,X.shape[0])print(特征数:,X.shape[1])print(特征名:,list(X.columns))X.head()2. 数据预处理拆分标准化# 拆分训练集/测试集7:3X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.3,random_state42)# 标准化L1必须步骤scalerStandardScaler()X_train_scaledscaler.fit_transform(X_train)X_test_scaledscaler.transform(X_test)3. 初始Lasso模型固定λ \lambdaλ# 设置初始正则化系数alpha_init0.1lasso_initLasso(alphaalpha_init)lasso_init.fit(X_train_scaled,y_train)# 查看特征系数coef_initpd.Series(lasso_init.coef_,indexX.columns)print( 初始Lassoalpha0.1特征系数 )print(coef_init)print(f被剔除的特征数系数0:,sum(coef_init0))# 模型性能评估y_pred_initlasso_init.predict(X_test_scaled)print(f\nMSE均方误差:,mean_squared_error(y_test,y_pred_init).round(3))print(fR²决定系数:,r2_score(y_test,y_pred_init).round(3))4. 交叉验证找最优λ \lambdaλ推荐做法# LassoCV自动交叉验证选最优alphalasso_cvLassoCV(cv5,max_iter10000,random_state42)lasso_cv.fit(X_train_scaled,y_train)print(f\n 交叉验证最优结果 )print(f最优alpha:,lasso_cv.alpha_.round(4))# 用最优alpha建模lasso_bestLasso(alphalasso_cv.alpha_)lasso_best.fit(X_train_scaled,y_train)coef_bestpd.Series(lasso_best.coef_,indexX.columns)print(\n最优模型特征系数:)print(coef_best)print(f被剔除的特征数:,sum(coef_best0))# 最优模型性能y_pred_bestlasso_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(kindbarh,color[redifc0elseskyblueforcincoef_best])plt.title(Lasso最优模型特征系数红色被剔除特征,fontsize14)plt.xlabel(系数值,fontsize12)plt.grid(alpha0.3,axisx)plt.tight_layout()plt.show()6. 筛选特征后建模最终步骤# 筛选系数≠0的特征selected_featurescoef_best[coef_best!0].index.tolist()print( 最终筛选的特征 )print(selected_features)# 用筛选后的特征重新训练模型X_train_selectedX_train[selected_features]X_test_selectedX_test[selected_features]# 标准化筛选后的特征scaler_selectedStandardScaler()X_train_selected_scaledscaler_selected.fit_transform(X_train_selected)X_test_selected_scaledscaler_selected.transform(X_test_selected)# 训练线性回归模型fromsklearn.linear_modelimportLinearRegression model_finalLinearRegression()model_final.fit(X_train_selected_scaled,y_train)# 最终性能y_pred_finalmodel_final.predict(X_test_selected_scaled)print(f\n筛选后模型 R²:,r2_score(y_test,y_pred_final).round(3))七、L1正则化的优缺点必背优点自动特征选择系数→0实现稀疏性无需手动筛选模型简洁易解释只保留关键特征可直接解释“哪些因素起作用”适用于高维数据特征数远大于样本数p ≫ n p \gg np≫n时仍有效如基因、文本数据计算高效用坐标下降法求解收敛快适合大规模数据缺点对多重共线性敏感特征高度相关时会随机剔除部分相关特征即使都重要最多选n个特征样本数为n时Lasso最多保留n个非零特征依赖λ \lambdaλ调优λ \lambdaλ过大/过小会导致“特征过少/过拟合”需交叉验证只适用于线性关系无法捕捉非线性特征交互需配合特征工程如多项式扩展八、L1与其他特征选择方法对比方法核心原理是否稀疏考虑特征相关性嵌入模型训练L1正则化LassoL1范数惩罚是否敏感是L2正则化RidgeL2范数惩罚否是平滑处理是Elastic NetL1L2混合惩罚是是缓解共线性是Filter法相关系数统计指标排序是否否Wrapper法RFE模型性能递归筛选是是是树模型随机森林节点分裂贡献是是是九、适用场景与替代方案优先用L1正则化的情况高维数据p ≫ n p \gg np≫n如文本、基因、图像特征需强解释性如经济建模、医学诊断、金融风控模型需简洁部署场景如实时预测特征相关性低无多重共线性考虑其他方法的情况特征高度相关用Elastic NetL1L2混合仅防过拟合不筛选特征用Ridge回归非线性关系用随机森林、XGBoost自带特征重要性预测性能优先用Wrapper法如RFESVM十、最简单总结背诵版L1正则化Lasso 线性回归 L1范数惩罚核心作用自动筛选特征系数→0 防止过拟合关键步骤必须标准化特征 交叉验证调λ \lambdaλ优点高效、简洁、易解释适用于高维数据缺点怕多重共线性只适用于线性关系

相关新闻