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

sklearn中Logistic Regression求解器差异及归一化影响解析

问题:无正则化LogisticRegression归一化前后结果差异的原因

在机器学习作业中发现,sklearn中无正则化的LogisticRegression模型,在数据归一化与不归一化时得到的结果截然不同。按道理归一化只是一种线性变换,理论上不该对模型的最终性能产生影响,但实际却出现了明显差异。


带标准化的实现与结果

代码实现:

ct = ColumnTransformer([
    ('ohe', OneHotEncoder(handle_unknown='ignore'), cat_features),
    ('scaler', StandardScaler(), number_features)
    ], remainder='passthrough')

pipe3 = Pipeline(steps=[
    ('ct', ct),
    ('logreg', LogisticRegression(penalty=None, max_iter=1000, solver='lbfgs'))
])

lazy_test(pipe3)

运行结果:

Train:   0.7721413945410982
Test:    0.7659698438358779

无标准化(LBFGS求解器)的实现与结果

代码实现:

ct = ColumnTransformer([
    ('ohe', OneHotEncoder(handle_unknown='ignore'), cat_features)
    ], remainder='passthrough')

pipe3 = Pipeline(steps=[
    ('ct', ct),
    ('logreg', LogisticRegression(penalty=None, max_iter=1000, solver='lbfgs'))
])

lazy_test(pipe3)

运行结果:

Train:   0.4624171576873345
Test:    0.45033180449094434

换用Newton-CG求解器的实现与结果

代码实现:

ct = ColumnTransformer([
    ('ohe', OneHotEncoder(handle_unknown='ignore'), cat_features)
    ], remainder='passthrough')

pipe3 = Pipeline(steps=[
    ('ct', ct),
    ('logreg', LogisticRegression(penalty=None, max_iter=1000, solver='newton-cg'))
])

lazy_test(pipe3)

运行结果:

Train:   0.7721375106245625
Test:    0.7659845638626798

原因解释

核心原因在于求解器对特征尺度的鲁棒性差异:

  • LBFGS是基于一阶梯度的拟牛顿法,当特征尺度差异较大时,不同特征对应的梯度量级会相差悬殊,这会导致求解器在迭代过程中难以平衡不同方向的更新,甚至在设置的迭代次数(1000次)内无法收敛到全局最优解,最终得到的模型权重偏离最优值,表现出很差的性能。
  • Newton-CG则利用了二阶导数(Hessian矩阵)的信息,能够更好地修正不同尺度特征带来的梯度偏差,对特征尺度的鲁棒性更强,即使不做归一化,也能在有限迭代次数内收敛到全局最优,因此结果与归一化后的模型一致。

虽然理论上归一化作为线性变换不会改变LogisticRegression的决策边界(权重会随特征尺度对应缩放),但这个结论的前提是求解器能够收敛到全局最优解。当求解器因特征尺度问题无法收敛时,就会出现归一化前后结果截然不同的现象。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 08:32:38