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

使用sklearn MinMaxScaler时训练与验证集缩放结果异常问题排查

问题:MinMaxScaler缩放后验证集结果不在0-1区间的问题

我使用sklearn的MinMaxScaler对数据集进行缩放,代码如下:

from sklearn.preprocessing import MinMaxScaler

# create a StandardScaler object
self.scaler = MinMaxScaler(feature_range=(0, 1))

# fit the scaler to the dataset
self.scaler.fit(self.X_org)

# transform dataset using the scaler
self.X_scalled = pd.DataFrame(self.scaler.transform(self.X_org), columns=self.X_org.columns)

return self.X_scalled

随后我将全量数据集的最后10%作为验证集,使用训练集的同一scaler进行缩放:

X_input_val_data_scalled = pd.DataFrame(self.scaler.transform(X_input_val_data), columns=X_input_val_data.columns)

出现的问题:训练集缩放后结果正常分布在0-1之间,但验证集缩放结果却在7.5-8区间,请问哪里操作错误?


问题原因与解决方法

核心错误:训练集与验证集的划分逻辑颠倒

你在fit阶段用了全量数据集self.X_org,而非仅用训练集。后续操作相当于:

  1. 先用全量数据的最小值/最大值计算了缩放规则
  2. 训练集是全量数据的前90%,它的极值和全量数据极值几乎重合,因此缩放后落在0-1区间
  3. 如果验证集是全量数据的最后10%,且这部分数据的真实值远大于全量数据的最大值(比如数据集是按特征值递增排序的),用全量数据的极值去计算时,(验证集样本值 - 全量min)/(全量max - 全量min)的结果会远大于1,就出现了你看到的7.5-8区间的异常结果。

正确操作步骤

  1. 先划分训练集和验证集,再基于训练集拟合scaler,验证集仅做缩放转换:
# 第一步:划分训练集与验证集(假设全量数据为X_full)
train_size = int(0.9 * len(X_full))
X_train = X_full.iloc[:train_size]
X_val = X_full.iloc[train_size:]

# 第二步:用训练集拟合scaler并完成训练集缩放
self.scaler = MinMaxScaler(feature_range=(0,1))
X_train_scaled = pd.DataFrame(self.scaler.fit_transform(X_train), columns=X_train.columns)

# 第三步:用同一scaler完成验证集缩放
X_val_scaled = pd.DataFrame(self.scaler.transform(X_val), columns=X_val.columns)
  1. 额外检查点:确认全量数据集是否按数值大小排序(如时间序列递增、特征值递增),若存在这种情况,直接取最后10%作为验证集不仅会导致缩放异常,还会让模型验证失去参考意义,需改用随机划分等合理方式拆分数据集。

内容的提问来源于stack exchange,提问作者B Grau

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 21:37:10