Python中如何用训练集的参数标准化测试集?

train_features 是训练集的原始特征,test_features 是测试集的原始特征。我现在想先把训练集中每列进行标准化,然后用它的参数(平均值和标准差)去标准化测试集对应的列,问一下该怎么做?
Python中如何用训练集的参数标准化测试集?

5 回复

我这样做对吗?
scaler = preprocessing.StandardScaler()
Ens_seg1_all_std_probaes = scaler.fit_transform( Ens_seg1_all_probaes )
Ens_seg2_all_std_probaes = scaler.transform( Ens_seg2_all_probaes )
其中 Ens_seg1_all_probaes 为训练集特征矩阵,Ens_seg2_all_probaes 为测试集的


在scikit-learn里,用训练集的均值和标准差来标准化测试集是标准做法。关键是要用fit_transform()处理训练集,然后用transform()处理测试集,绝对不能用fit_transform()再拟合一次测试集。

from sklearn.preprocessing import StandardScaler
import numpy as np

# 假设这是你的数据
X_train = np.array([[1, 2], [3, 4], [5, 6]])
X_test = np.array([[7, 8], [9, 10]])

# 创建标准化器
scaler = StandardScaler()

# 只在训练集上拟合(计算均值和标准差)
X_train_scaled = scaler.fit_transform(X_train)
print("训练集标准化后:\n", X_train_scaled)
print("训练集均值:", scaler.mean_)
print("训练集标准差:", scaler.scale_)

# 用训练集的参数转换测试集
X_test_scaled = scaler.transform(X_test)
print("\n测试集标准化后:\n", X_test_scaled)

这样做的原理是:fit_transform()会计算训练集的统计量并立即转换,而transform()会复用这些统计量来转换新数据。测试集必须使用与训练集相同的缩放参数,否则数据分布就不一致了,模型效果会出问题。

如果你需要保存和加载这个标准化器,可以用joblib或pickle:

import joblib
joblib.dump(scaler, 'scaler.pkl')  # 保存
loaded_scaler = joblib.load('scaler.pkl')  # 加载

简单说就是训练集fit_transform,测试集只transform

没有思考过这个问题,一直都是先在整个数据集上做标准化这样的工作,然后再划分训练集之类的

对的

训练集和测试集特征空间不一致,这模型还有什么用…

回到顶部