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

StandardScaler与Min-Max Scaler对线性回归模型性能的影响差异

线性回归中StandardScaler与Min-Max Scaler性能矛盾问题分析

我在做线性回归任务时碰到个奇怪的情况:用StandardScaler的时候,看着预测结果挺准,但R²分数很低;换Min-Max Scaler的话,R²上去了,可实际预测结果又不准。想搞懂这俩为啥差异这么大,哪种更适合我的场景,还有怎么提升模型性能。我的代码如下:

import pandas as pd
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, r2_score

data = pd.read_csv("/content/weight.csv")

label_encoder = LabelEncoder()
data["Gender"] = label_encoder.fit_transform(data["Gender"])

category_mapping = {}
category_mapping["Gender"] = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))

inputs = data.drop("Weight", "columns")
output = data.drop(["Gender", "Height", "Index"], "columns")

scaler = MinMaxScaler()
inputs_scaled = scaler.fit_transform(inputs)

x_train, x_test, y_train, y_test = train_test_split(inputs_scaled, output, train_size=0.8)

model = linear_model.LinearRegression()
model.fit(x_train, y_train)

# Model application.
gen = int(input("Enter Gender : "))
hght = int(input("Enter Height : "))
indx = int(input("Enter index : "))

input_value = scaler.fit_transform([[gen, hght, indx]])
y_pred = model.predict(input_value)

r2 = r2_score(y_test, model.predict(x_test)) * 100

一、性能矛盾的核心原因

  1. R²的计算逻辑误区:R²衡量的是模型对数据方差的解释度,Min-Max Scaler把所有特征压缩到[0,1]区间,训练集上的方差被大幅缩小,模型容易拟合出高R²,但新数据(比如输入的身高超出训练集范围)用这套规则缩放会变形,导致预测偏差大;而StandardScaler基于均值和标准差缩放,保留了数据原本的分布特性,虽然R²可能因方差范围大显得偏低,但实际预测更贴合真实数据规律。
  2. 代码中的致命错误:你预测新数据时误用了scaler.fit_transform(),这会用单个输入样本重新计算缩放的均值/极值,完全推翻了训练时的缩放标准,这才是预测不准的主要原因!应该用scaler.transform(),只做转换不重新拟合。
  3. 数据分布的影响:如果数据存在异常值,StandardScaler会受影响,但如果特征本身接近正态分布,它的泛化性更稳定;Min-Max Scaler对异常值特别敏感,若训练集里有极端身高,大部分正常数据会被挤到极小区间,模型学出的权重必然偏差。

二、选哪种缩放器?

  • 如果你的特征分布接近正态,且无严重异常值,优先选StandardScaler,它能保留数据的统计特性,泛化能力更强,别被低R²误导,结合MAE/RMSE看实际预测偏差才靠谱。
  • 要是数据有大量异常值,或必须把特征缩到固定区间,先处理异常值(比如用箱线图截断极端值),再用Min-Max Scaler,但必须保证训练、测试、预测全程用同一套缩放规则。

三、提升模型性能的实操方法

  1. 修正缩放代码:训练时只对训练集做fit,测试集和新数据只用transform,核心代码调整如下:
    # 先拆分数据再缩放(更规范的流程)
    x_train, x_test, y_train, y_test = train_test_split(inputs, output, train_size=0.8)
    
    scaler = StandardScaler() # 或MinMaxScaler()
    x_train_scaled = scaler.fit_transform(x_train)
    x_test_scaled = scaler.transform(x_test)
    
    model.fit(x_train_scaled, y_train)
    
    # 预测新数据
    input_value = scaler.transform([[gen, hght, indx]])
    y_pred = model.predict(input_value)
    
  2. 用多维度指标评估:别只看R²,同时计算MAE(平均绝对误差)、RMSE(均方根误差),这俩能直接反映预测值与真实值的偏差大小,比R²更直观。
  3. 优化特征工程:
    • 检查"Index"特征与Weight的相关性,若存在高度共线性,直接删除以避免干扰模型。
    • Gender用LabelEncoder没问题,但如果性别无顺序意义,试试独热编码(OneHotEncoder),防止模型误以为0/1是大小关系。
  4. 模型正则化:换成Ridge或Lasso回归,添加正则项防止过拟合,尤其是特征数量不多时,效果会很明显。
  5. 处理异常值:对Height、Weight绘制箱线图,删除或修正超出上下四分位1.5倍间距的极端值,避免缩放器和模型被异常值带偏。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 08:18:11