使用StandardScaler前后Logistic Regression预测结果差异及准确性疑问
两次预测结果不同的原因
- 逻辑回归本身是对特征尺度高度敏感的模型:sklearn中默认配置的
LogisticRegression开启了L2正则化,正则项的惩罚力度直接受特征数值量级影响,同时模型训练的梯度下降过程也和特征尺度强相关,最终模型学到的权重参数,是完全匹配训练阶段输入的特征分布的。 - 预处理和训练流程存在不匹配的问题:从你给出的代码来看,训练分类器时直接用原始
X_train调用classifier.fit(),而你初始化的StandardScaler实例sc没有执行过sc.fit(X_train)的操作,哪怕你后续对测试数据做了转换,要么标准化用到的均值、方差是错误的,要么预测时传入的特征分布和训练时模型学习的分布完全不一致,自然会输出不同的预测结果。 - 额外注意:
sc.transform(df)不会原地修改df对象,如果你执行完转换操作后还是传入原始df给predict却得到不同结果,说明你在其他未贴出的代码中已经拟合过sc,两次预测的实际输入确实有差异。
哪种预测结果更准确
结果的准确性完全取决于你训练阶段对X_train做的预处理操作:
- 如果你训练
classifier时直接使用未标准化的原始X_train,那么第一次直接传入原始df预测的结果是准确的,第二次传入标准化后的数据相当于给模型输入了完全不符合训练分布的特征,输出结果没有参考价值。 - 如果你训练
classifier时用的是sc.fit_transform(X_train)输出的标准化训练集,那么第二次先做标准化再预测的结果才是准确的,第一次直接传入原始df属于输入分布不匹配,结果是错误的。 - 实践提示:带正则的线性模型训练前做标准化,通常能同时提升模型收敛速度和最终预测效果。
内容的提问来源于stack exchange,提问作者ravan
相关产品推荐
相关产品推荐

