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
相关产品推荐
相关产品推荐

