You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

更新sklearn Lasso(normalize=True)为Pipeline实现输出不一致问题求解

问题核心原因

你修改后的代码和原始代码输出不一致,来自3个核心差异:

  1. 归一化逻辑不匹配:旧版本Lasso(normalize=True)的内置归一化逻辑为「先对每个特征列减去均值,再除以该特征列的L2范数」,而你使用的StandardScaler是「减均值后除以特征列的标准差」,两种归一化后特征的尺度完全不同。
  2. 系数输出尺度未还原:旧normalize=True参数拟合完成后会自动将系数转换回原始特征的尺度,而Pipeline中取出的Lasso系数是基于归一化后特征的系数,没有做尺度还原,数值自然差异很大。
  3. 正则化强度不匹配:相同的alpha值在不同尺度的特征上,产生的正则化强度完全不同,直接复用旧alpha值无法得到相同的拟合结果。

修复方案(完全对齐原始代码输出)

要完全复现原始代码的系数结果,需要对齐归一化逻辑,并手动还原系数的原始尺度,修改后的代码如下:

# 导入依赖
from sklearn.linear_model import Lasso
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler, Normalizer

# 计算每个特征中心化后的L2范数,用于后续系数尺度还原
X_centered = X - X.mean(axis=0)
feat_l2_norms = np.linalg.norm(X_centered, axis=0)

# 构建和旧normalize逻辑完全等价的Pipeline
pipe = Pipeline(steps=[    
    ('centering', StandardScaler(with_std=False)), # 仅做特征中心化(减均值)
    ('l2_normalize', Normalizer(norm='l2', axis=0)), # 对特征列做L2归一化
    ('lasso', Lasso(alpha=0.4))
])

# 拟合模型
pipe.fit(X, y)

# 取出系数并还原到原始特征尺度
lasso_coef_norm = pipe.named_steps['lasso'].coef_
lasso_coef = lasso_coef_norm / feat_l2_norms
print(lasso_coef)

# 绘图逻辑和原始代码完全一致
plt.plot(range(len(df_columns)), lasso_coef)
plt.xticks(range(len(df_columns)), df_columns.values, rotation=60)
plt.margins(0.02)
plt.show()

补充说明

如果你想使用StandardScaler的行业最佳实践而非对齐旧的弃用逻辑,可以调整alpha的取值:StandardScaler归一化后的特征方差为1,等价的alpha值约为原来的0.4 / np.sqrt(X.shape[0]),调整后可以得到和原始代码一致的特征重要性排序,但系数的绝对值会有差异。

内容的提问来源于stack exchange,提问作者TMo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 05:54:03