如何在Scikit-learn中对新数据使用inverse_transform(适配PCA与标准化流程)
如何对新数据使用PCA和StandardScaler的inverse_transform
嘿,我来帮你理清楚完整的逆变换流程——因为你是先做标准化再做PCA降维的,所以逆变换必须按相反的顺序来:先逆PCA,再逆标准化。不过首先要纠正一个关键问题:你之前的代码没有保存拟合好的StandardScaler和PCA实例,这会导致后续无法正确逆变换,我先帮你调整训练代码,再一步步讲新数据的处理。
第一步:修正训练代码,保存拟合好的实例
你之前的代码里StandardScaler()是临时创建的对象,用完就丢了,逆变换必须用同一个拟合过的实例(它保存了训练数据的均值、标准差),PCA同理。调整后的训练代码如下:
import numpy as np import pandas as pd from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA variance_to_retain = 0.99 # 保存拟合好的标准化器(关键!) scaler = StandardScaler() np_scaled = scaler.fit_transform(df_data) # 保存拟合好的PCA模型(关键!) pca = PCA(n_components=variance_to_retain) np_pca = pca.fit_transform(np_scaled) # 后续的DataFrame转换可以保留 df_scaled = pd.DataFrame(np_scaled, columns=df_data.columns) num_components = len(pca.explained_variance_ratio_) cum_variance_explained = np.cumsum(pca.explained_variance_ratio_)
第二步:对新数据执行逆变换的完整流程
假设你有新数据new_data,它的特征数量、顺序必须和训练数据df_data完全一致,按以下步骤操作:
1. 用训练好的scaler标准化新数据
注意:绝对不能对新数据用fit_transform,必须用transform,这样才会沿用训练数据的均值和标准差做标准化:
# 标准化新数据(和训练数据用同一套基准) new_data_scaled = scaler.transform(new_data)
2. (可选)将新数据映射到PCA降维空间
如果需要把新数据转换到PCA的低维空间,用训练好的PCA实例的transform方法:
new_data_pca = pca.transform(new_data_scaled)
3. 逆PCA变换,回到标准化后的原始特征空间
用PCA的inverse_transform把低维数据还原到标准化后的高维特征空间:
new_data_scaled_inversed = pca.inverse_transform(new_data_pca)
4. 逆标准化变换,回到原始数据尺度
最后用scaler的inverse_transform把标准化后的数据还原到原始数据的数值范围:
new_data_original = scaler.inverse_transform(new_data_scaled_inversed)
关键注意事项
- 新数据的特征列必须和训练数据完全匹配(数量、顺序、含义一致),否则
transform会抛出维度不匹配的错误。 - 必须保留训练时拟合好的
scaler和pca实例,最好用joblib或pickle保存到文件,方便后续加载使用:import joblib joblib.dump(scaler, 'scaler.pkl') joblib.dump(pca, 'pca.pkl') # 后续加载 scaler = joblib.load('scaler.pkl') pca = joblib.load('pca.pkl') - 如果你的需求是把训练时得到的PCA降维数据(比如
np_pca)逆变换回原始数据,流程是一样的:先逆PCA到标准化空间,再逆标准化到原始尺度。
内容的提问来源于stack exchange,提问作者David McCormick
相关产品推荐
相关产品推荐

