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

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。
正确的流程参考如下:

  1. 训练阶段的预处理逻辑(仅执行一次)
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)
  1. 测试阶段的预处理逻辑
# 读取测试数据
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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 00:30:01