如何使用SKLearn按列归一化Python数组中的机器学习输入特征?
问题分析与解决方案
核心问题
你的代码存在两个关键错误,导致归一化结果不符合预期:
- 重复对不同数据集执行
fit操作:训练集、验证集、测试集各自调用fit_transform,会让每个数据集使用独立的归一化规则(各自计算min/max),既破坏了数据分布一致性,也会让你误以为X不是按列归一化。 - X与Y未使用独立Scaler:特征与标签的数值范围完全不同,混用Scaler会导致归一化逻辑混乱。
修正后的代码
import tensorflow as tf import keras import numpy as np from keras.models import Sequential from keras.layers import Dense, Activation, Dropout import matplotlib.pyplot as plt from sklearn.preprocessing import MinMaxScaler # 加载数据 rawfilepath = r'C:\Users\***\Desktop\***\Unprocessed_Data_For_Training.txt' valfilepath = r'C:\Users\***\Desktop\***\Unprocessed_Data_For_Validation.txt' testfilepath = r'C:\Users\***\Desktop\***\h4t6usedforprediction.txt' raw_data = np.loadtxt(rawfilepath) val_data = np.loadtxt(valfilepath) test = np.loadtxt(testfilepath) # 拆分特征与标签,直接将Y转为二维数组 X = raw_data[:, 1:4] Y = raw_data[:, 0].reshape(-1, 1) X_Val = val_data[:, 1:4] Y_Val = val_data[:, 0].reshape(-1, 1) X_test = test[:, 1:4] Y_test = test[:, 0].reshape(-1, 1) # 初始化两个独立Scaler:分别处理特征和标签 scaler_X = MinMaxScaler() scaler_Y = MinMaxScaler() # 仅在训练集上执行fit,验证/测试集仅做transform Xnorm = scaler_X.fit_transform(X) Xvalnorm = scaler_X.transform(X_Val) Xtestnorm = scaler_X.transform(X_test) Ynorm = scaler_Y.fit_transform(Y) Yvalnorm = scaler_Y.transform(Y_Val) Ytestnorm = scaler_Y.transform(Y_test)
关键说明
- 按列归一化的正确性:MinMaxScaler默认按列(特征维度)计算min/max并归一化,只要用同一个
scaler_X处理所有X类数据,就能保证每列特征使用训练集的统一规则。 - 禁止在验证/测试集上fit:验证和测试集必须复用训练集的归一化规则,否则会引入数据泄露,导致模型泛化能力下降、预测结果异常。
- 独立Scaler的必要性:特征与标签的数值分布差异大,分开处理能避免相互干扰,保证归一化逻辑的合理性。
验证方式
可以打印训练集特征的归一化参数,确认按列计算:
print("X各列最小值:", scaler_X.data_min_) print("X各列最大值:", scaler_X.data_max_)
内容的提问来源于stack exchange,提问作者Warmapplepie_
相关产品推荐
相关产品推荐

