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

如何正确缩放数据集?三种StandardScaler使用方式正确性对比咨询

三种数据缩放方案的正确性判断

三种实现里第三种是唯一符合机器学习建模规范的方案,前两种都存在原理性缺陷,你测试时准确率没有明显差异,大概率是当前使用的wine数据集样本量小、特征分布均匀,换分布差异更大、复杂度更高的数据集,前两种的缺陷会直接体现在最终模型效果上。


各方案的问题分析

第一种实现(训练集测试集分别fit_transform)

这种写法的问题是缩放基准不统一:

  • StandardScaler的fit操作是计算数据集的均值、标准差,再用这两个值做归一化
  • 训练集和测试集分别fit,相当于用两套不同的统计基准缩放数据,模型在训练集学习到的分布规律,不能直接套用到另一套基准的测试集上,预测结果的可信度极低。
# 问题代码示例
dataset= pd.read_csv("wine.csv")
x = dataset.iloc[:,:13]
y = dataset.iloc[:,13]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.8,random_state=0)
sc=StandardScaler()
x_train=sc.fit_transform(x_train)
x_test=sc.fit_transform(x_test) # 错误:测试集单独fit

第二种实现(全量数据fit后拆分)

这种写法存在严重的数据泄露问题:

  • 先对全量特征做fit,相当于计算统计量时已经用到了测试集的数据信息,等于模型训练阶段提前“偷看”了本该完全未知的测试集分布
  • 这种操作会让你线下验证的准确率虚高,模型上线后碰到真实的未知数据,效果会出现明显下滑,属于建模的禁忌操作。
# 问题代码示例
dataset= pd.read_csv("wine.csv")
x = dataset.iloc[:,:13]
y = dataset.iloc[:,13]
sc=StandardScaler()
x = sc.fit_transform(x) # 错误:拆分前对全量数据fit
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.8,random_state=0)

第三种实现(训练集fit,统一transform所有数据)

是完全符合规范的写法:

  • 先拆分训练集、测试集,保证测试集全程不参与任何模型/预处理的学习过程
  • 仅在训练集上做fit得到缩放用的统计量,测试集、后续上线的真实生产数据都统一用这套统计量做transform,完全模拟了真实场景下“数据未知”的预设,最终得到的模型效果可信度最高。
# 正确代码示例
dataset= pd.read_csv("wine.csv")
x = dataset.iloc[:,:13]
y = dataset.iloc[:,13]
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=0.8,random_state=0)
sc=StandardScaler()
x_train=sc.fit_transform(x_train)
x_test=sc.transform(x_test) # 正确:用训练集的统计量缩放测试集

其他合理的数据缩放方案

除了StandardScaler之外,你可以根据数据特性选择适配的缩放方式,核心使用规则都和第三种一致:仅在训练集上fit:

  • 数据存在大量极端异常值时,选择RobustScaler,基于中位数和四分位数做缩放,对异常值的鲁棒性更强
  • 需要把特征缩放到固定区间(比如0~1)时,选择MinMaxScaler,常用于对输入数值范围有要求的模型(比如神经网络、支持向量机)
  • 处理稀疏矩阵时选择MaxAbsScaler,缩放过程不会破坏矩阵的稀疏结构
  • 需要把特征强制映射到正态/均匀分布时,可选择分位数变换缩放,适配对输入分布有严格要求的模型。

内容的提问来源于stack exchange,提问作者Alper Özyurt

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.24 00:15:05