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

Sklearn MinMaxScaler行独立归一化报错问题及修正方法咨询

解决MinMaxScaler归一化时的特征数量不匹配错误

错误原因

用train_test_split拆分数据后,x_train是2行3列,转置后变为3行2列。此时scaler.fit_transform会将其识别为3个样本、每个样本含2个特征的数据集,因此scaler会记录“输入需包含2个特征”的规则。而x_test是1行3列,转置后变成3行1列,每个样本仅含1个特征,与scaler预期的特征数量不符,触发ValueError。

你的核心需求是对原数据的每行(即每个样本)独立执行归一化——也就是把单个样本的所有特征值单独缩放到0-1区间,而非跨样本按特征列统一归一化。以下是两种可行的修正方案:

方案一:利用MinMaxScaler的axis参数(Sklearn 0.24及以上版本适用)

直接指定axis=1,让Scaler对每行(样本)进行归一化,无需转置操作:

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

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)

# 指定axis=1,按行(样本)维度做归一化
scaler = MinMaxScaler(feature_range=(0,1), axis=1)
x_train_norm = scaler.fit_transform(x_train)
x_test_norm = scaler.transform(x_test)

方案二:逐行手动处理(兼容所有Sklearn版本)

如果你的Sklearn版本较低不支持axis参数,可以逐个对样本应用Scaler:

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

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)

def normalize_rows(data):
    scaler = MinMaxScaler()
    # 对每行数据单独归一化,需将行调整为(1, n)的形状后处理
    return np.array([scaler.fit_transform(row.reshape(1, -1)).flatten() for row in data])

x_train_norm = normalize_rows(x_train)
x_test_norm = normalize_rows(x_test)

两种方案都会对每个样本的自身特征做归一化,比如样本[-1, 4, 2]会被缩放到[0, 1, 0.6](计算逻辑:(x - 行最小值)/(行最大值 - 行最小值)),完全匹配你的需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 00:02:42