LogisticRegression训练异常:数据放大100倍后预测正常的原因探究
LogisticRegression训练数据缩放前后效果差异的原因分析
问题情况
使用chip_test.csv数据集(test1、test2为特征,pass为标签:0=未通过,1=通过)训练LogisticRegression模型时:
- 原始数据训练:预测结果全为0,准确率仅66.67%
- 将特征放大100倍后训练:预测完全正确,准确率100%
原始数据集
test1,test2,pass 0.051267,0.69956,0 -0.09274,0.68494,0 -0.21371,0.69225,0 -0.375,0.50219,0 0.18376,0.93348,1 0.22408,0.77997,1 0.29896,61.915,1 -0.51325,0.46564,0 -0.52477,0.2098,0
原始训练输出
pre: [0 0 0 0 0 0 0 0 0] accuracy 0.6666666666666666 coef_ [[0.8464159 0.36835743]] intercept_ [-0.84822465]
放大100倍后的数据集
test1,test2,pass 5.1267,69.956,0 -9.274,68.494,0 18.376,93.348,1 22.408,77.997,1 29.896,61.915,1 -21.371,69.225,0 -37.5,50.219,0 -51.325,46.564,0 -52.477,20.98,0
放大后训练输出
pre: [0 0 1 1 1 0 0 0 0] accuracy 1.0 coef_ [[0.40853988 0.15604305]] intercept_ [-16.80311472]
核心原因分析
1. L2正则化的相对权重问题
sklearn的LogisticRegression默认开启L2正则化(penalty='l2'),正则项会限制模型系数的大小,公式为:
$$Loss = 对数损失 + C^{-1} * ||w||_2^2$$
(其中$C$是正则强度的倒数,默认$C=1.0$)
- 原始数据特征值极小(test1在-0.50.3之间,test2在0.20.9之间),此时正则项对系数的惩罚权重远大于特征本身的贡献,导致模型学到的系数被严重压制。最终线性组合$w_1x_1 + w_2x_2 + b$的结果全部为负,经过sigmoid函数后输出小于0.5,因此预测全为0。
- 特征放大100倍后,特征值量级提升,正则项的相对影响被削弱,模型可以学到足够大的系数,让正样本的线性组合结果为正,从而正确区分两类。
2. 梯度更新的效率问题
LogisticRegression使用梯度下降类算法优化损失函数,梯度的计算和特征值直接相关:
$$\nabla_w Loss = X^T(\sigma(Xw + b) - y) + C^{-1}w$$
- 原始数据特征值小,导致梯度的绝对值很小,模型在默认迭代次数(
max_iter=100)内无法完成有效更新,只能收敛到一个偏向多数类(0类占66.6%)的次优解。 - 放大特征后,梯度的有效步长变大,模型能在有限迭代次数内收敛到可以正确区分两类的最优参数。
3. 类别不平衡的间接影响
原始数据中0类样本占比更高(6/9),当模型因正则化和小梯度无法学到有效区分边界时,会倾向于选择“全预测0”这种简单策略——毕竟这样已经能获得不低的准确率(66.67%)。而放大数据后,模型具备了学习区分边界的能力,就不会再依赖这种偷懒的策略。
验证与解决思路
- 验证:尝试关闭正则化(
penalty='none'),原始数据训练也能得到正确结果(但不推荐,正则化是防止过拟合的重要手段)。 - 标准解决方案:对特征做标准化/归一化(比如
StandardScaler或MinMaxScaler),这是训练LogisticRegression等线性模型的常规操作,比手动放大数据更科学。
内容的提问来源于stack exchange,提问作者stewart jade
相关产品推荐
相关产品推荐

