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

如何使用SKLearn按列归一化Python数组中的机器学习输入特征?

问题分析与解决方案

核心问题

你的代码存在两个关键错误,导致归一化结果不符合预期:

  1. 重复对不同数据集执行fit操作:训练集、验证集、测试集各自调用fit_transform,会让每个数据集使用独立的归一化规则(各自计算min/max),既破坏了数据分布一致性,也会让你误以为X不是按列归一化。
  2. 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)

关键说明

  1. 按列归一化的正确性:MinMaxScaler默认按列(特征维度)计算min/max并归一化,只要用同一个scaler_X处理所有X类数据,就能保证每列特征使用训练集的统一规则。
  2. 禁止在验证/测试集上fit:验证和测试集必须复用训练集的归一化规则,否则会引入数据泄露,导致模型泛化能力下降、预测结果异常。
  3. 独立Scaler的必要性:特征与标签的数值分布差异大,分开处理能避免相互干扰,保证归一化逻辑的合理性。

验证方式

可以打印训练集特征的归一化参数,确认按列计算:

print("X各列最小值:", scaler_X.data_min_)
print("X各列最大值:", scaler_X.data_max_)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 22:55:18