MinMaxScaler调用fit_transform处理测试数据总是返回全0是什么原因
问题原因分析
- 违背了特征标准化的正确使用逻辑
Scaler类的fit()操作是用来统计训练数据的分布特征,对MinMaxScaler来说就是统计每个特征的最大值、最小值,这个统计结果只能从训练/验证集上获取。测试阶段绝对不能在测试数据上重新调用fit()或者fit_transform(),否则会用测试数据的分布重新计算转换规则,和训练阶段的规则完全不匹配,自然会出现训练和测试表现不一致的问题。 - 单样本重新fit直接导致输出全0
你当前的测试集只有1条数据,对P1、P2两个特征来说,特征的最大值和最小值都等于该条数据对应的特征值,代入MinMaxScaler的转换公式(x - 特征最小值) / (特征最大值 - 特征最小值),分子分母均为0,sklearn的底层处理逻辑会直接返回0值,这就是你得到[[0. 0.]]输出的直接原因。
修复方案
你需要保留训练阶段已经在验证/训练数据上fit完成的MinMaxScaler实例,测试阶段直接调用该实例的transform()方法处理测试数据即可,不要重新fit。
正确的流程参考如下:
- 训练阶段的预处理逻辑(仅执行一次)
import pandas as pd import numpy as np from sklearn.preprocessing import MinMaxScaler # 初始化Scaler sc = MinMaxScaler(feature_range = (0, 1)) # 读取训练/验证数据集 dataset_train_val = pd.read_csv("训练/验证数据路径.csv", index_col="Date", parse_dates=True) train_val_x = np.array(dataset_train_val) # 仅在训练/验证集上fit一次,保存统计规则 sc.fit(train_val_x)
- 测试阶段的预处理逻辑
# 读取测试数据 dataset_test = pd.read_csv("filePath.csv",index_col="Date",parse_dates=True) test_x = np.array(dataset_test) # 直接用已经fit好的sc做转换,不要重新fit test_x = sc.transform(test_x) print("test_x: ", test_x)
内容的提问来源于stack exchange,提问作者Ali Raza
相关产品推荐
相关产品推荐

