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
相关产品推荐
相关产品推荐

