使用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,而非仅用训练集。后续操作相当于:
- 先用全量数据的最小值/最大值计算了缩放规则
- 训练集是全量数据的前90%,它的极值和全量数据极值几乎重合,因此缩放后落在0-1区间
- 如果验证集是全量数据的最后10%,且这部分数据的真实值远大于全量数据的最大值(比如数据集是按特征值递增排序的),用全量数据的极值去计算时,
(验证集样本值 - 全量min)/(全量max - 全量min)的结果会远大于1,就出现了你看到的7.5-8区间的异常结果。
正确操作步骤
- 先划分训练集和验证集,再基于训练集拟合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)
- 额外检查点:确认全量数据集是否按数值大小排序(如时间序列递增、特征值递增),若存在这种情况,直接取最后10%作为验证集不仅会导致缩放异常,还会让模型验证失去参考意义,需改用随机划分等合理方式拆分数据集。
内容的提问来源于stack exchange,提问作者B Grau
相关产品推荐
相关产品推荐

