Lasso系数可为0因其L1惩罚的菱形等高线易在角点截断系数,Ridge的L2圆形等高线仅收缩不归零;故Lasso能特征筛选,Ridge不能。

为什么Lasso的系数会变成0,而Ridge不会
Lasso用的是L1范数惩罚项(即系数绝对值之和),它的等高线是菱形,在坐标轴交点处梯度不连续,优化过程容易“撞上角点”,导致某些系数被精确压缩为0;Ridge用L2范数(系数平方和),等高线是圆形,只会让系数趋近于0但极少真正归零。
这意味着:只有Lasso能天然做特征筛选,Ridge只适合缓解共线性或过拟合,不能删特征。
-
Lasso的alpha越大,稀疏性越强——但太大时所有系数都变0,模型失效 - 数据必须标准化(
StandardScaler):否则量纲差异会让大数值特征“占便宜”,小数值特征被误杀 -
Lasso对异常值敏感,建议先用RobustScaler或剔除明显离群点
如何用sklearn的Lasso选特征并解释结果
核心不是调参,而是看lasso.coef_哪些是严格等于0,对应特征就是被过滤掉的。注意:浮点计算下可能有极小非零值(如1e-15),应设阈值判断。
from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
import numpy as np
<p>X_scaled = StandardScaler().fit_transform(X)
lasso = Lasso(alpha=0.1, max_iter=2000)
lasso.fit(X_scaled, y)</p><h1>获取非零系数的特征名</h1><p>mask = np.abs(lasso.coef_) > 1e-5
selected_features = [f for f, m in zip(feature_names, mask) if m]
print("保留特征:", selected_features)-
max_iter常需调大,默认1000在高维或病态数据下易不收敛,报ConvergenceWarning -
alpha没固定最优值,用LassoCV自动交叉验证更稳,但要注意cv=5默认较慢,小数据可改cv=3 - 别直接用
lasso.feature_importances_——Lasso没这个属性,那是RandomForest的
LassoCV自动选alpha后,系数还是全非零?
常见于特征维度远小于样本量、或特征间高度相关(如多重共线性)。Lasso在共线特征中会随机保留一个、压掉其余,但有时全部“幸存”——这不是bug,是L1惩罚在当前alpha下尚未强到触发截断。
立即学习“Python免费学习笔记(深入)”;
- 检查
LassoCV返回的alpha_值:如果它非常小(如0.001),说明数据本身不易稀疏,强行加大alpha可能更实用 - 用
np.linalg.cond(X_scaled)看条件数:>1000说明共线严重,考虑先用PCA降维或手动合并相似特征 - 换
LogisticRegression(penalty='l1', solver='liblinear')(分类)或LinearSVC(penalty='l1', dual=False)(支持向量机版L1),它们在某些场景下稀疏性更强
过滤后的特征再训练模型,性能反而下降?
稀疏过滤本质是牺牲部分拟合能力换可解释性与泛化鲁棒性。性能下降不等于做错了——重点看验证集/测试集是否更稳定,以及业务是否真需要“可解释的少量特征”。
- 别在过滤后立刻用原始
X训练新模型:必须用同样标准化后的X_scaled[:, mask],否则尺度错乱 - 如果下游是树模型(如
RandomForest),Lasso过滤可能适得其反——树本身抗噪声、不依赖线性假设,硬筛反而丢信息 - 真正关键的是:你过滤的目的是部署轻量化(减少API字段)、审计合规(解释每个输入影响),还是单纯想降维?目标不同,评估指标就该不同
稀疏性不是银弹,alpha调得再细,也掩盖不了特征工程本身的质量问题——如果原始特征里本就没有强信号,Lasso只会沉默地删掉一堆噪音,然后给你一个看起来干净、实则无力的模型。


















