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

Sklearn MinMaxScaler按行缩放时transform报特征数不匹配如何解决

问题原因

Sklearn的所有预处理转换器默认按列识别特征:fit时会把输入矩阵的每一列当做一个独立特征,记录对应特征的统计参数(对MinMaxScaler来说就是每列的最小值、最大值),后续transform时会强制要求输入矩阵的列数和fit时记录的特征数一致。
你的代码里训练集做了转置操作:

  • 原始数据集共3个样本,按test_size=0.3拆分后,训练集x_train是2行3列的矩阵(2个样本,每个样本3个特征),传入fit_transform前做了.T转置,变成3行2列,此时scaler会判定输入有2个特征,训练完成后期望后续输入的列数必须是2。
  • 测试集x_test是1行3列的矩阵,你直接传入transform没有做对应转置,scaler识别到输入有3列,和之前记录的2个特征要求不匹配,就抛出了特征数不匹配的错误。
    另外你原本的代码还有逻辑疏漏:就算不报错,直接给测试集调用transform也没有实现按行缩放的效果,和训练集的预处理逻辑不一致。
修复方案

对测试集执行和训练集完全一致的转置预处理流程:传入scaler前先转置,完成缩放转换后再转置回原矩阵形状即可。
修正后的可运行代码:

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import train_test_split
import numpy as np

# 生成样本数据
x = np.array([[-1, 4, 2], [-0.5, 8, 9], [3, 2, 3]])
y = np.array([1, 2, 3])

# 训练集测试集拆分
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=2)

scaler = MinMaxScaler()
# 训练集转置后完成fit和转换,再转置回原形状,实现按行缩放
x_train = scaler.fit_transform(x_train.T).T
# 测试集做相同转置处理:先转置适配scaler的特征维度,转换后转置回原形状
x_test = scaler.transform(x_test.T).T

补充提示:这种转置实现按行缩放的方案,仅适用于缩放统计量从单样本自身特征计算的场景(比如MinMaxScaler按样本做归一化时,最值来自样本自身),不会引入数据泄露。如果你的缩放逻辑需要用到跨样本的统计值,不能直接套用该方法,需要重新设计预处理流程避免测试集信息提前泄露到训练环节。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.31 21:21:26