如何在Python中基于新数据计算主成分?附鸢尾花数据PCA示例
如何用训练好的PCA模型处理新数据
嘿,看起来你已经顺利完成了鸢尾花数据的PCA分析,现在想知道怎么把这套逻辑用到新数据上对吧?其实核心就是复用已经训练好的模型参数,而不是重新训练,我给你一步步捋清楚:
关键注意点先提
首先得纠正一个小细节:你之前用scale()函数做标准化,这个函数是一次性的,没法保存训练数据的均值和标准差——而新数据必须用训练数据的统计量来标准化,不然结果会偏差。所以更规范的做法是用StandardScaler类,它能帮你保存这些关键信息。
完整的训练+新数据处理流程
1. 重新整理你的训练代码(优化版)
先把之前的代码改成可复用的形式:
import pandas as pd from sklearn import datasets from sklearn.preprocessing import StandardScaler from sklearn.decomposition import PCA # 加载鸢尾花训练数据 iris = datasets.load_iris() train_dat = pd.DataFrame(data=iris.data, columns=['sl', 'sw', 'pl', 'pw']) # 初始化并拟合标准化器——保存训练数据的均值/标准差 scaler = StandardScaler() std_train_dat = scaler.fit_transform(train_dat) # 拟合PCA模型——保存主成分的特征向量等参数 pca = PCA(n_components=2) train_pc = pca.fit_transform(std_train_dat) train_pcdf = pd.DataFrame(data=train_pc, columns=['PC-1', 'PC-2']) print("训练数据主成分:") print(train_pcdf.head())
2. 处理新数据的步骤
现在假设你拿到了新的样本,只要按照下面两步来:
# 模拟新数据——特征列必须和训练数据完全一致(数量、顺序都要对) new_dat = pd.DataFrame([ [5.0, 3.2, 1.2, 0.2], [6.5, 3.0, 5.2, 2.0] ], columns=['sl', 'sw', 'pl', 'pw']) # 步骤1:用训练好的scaler标准化新数据——千万不要用fit_transform! std_new_dat = scaler.transform(new_dat) # 步骤2:用训练好的pca转换新数据得到主成分——同样不要用fit_transform! new_pc = pca.transform(std_new_dat) new_pcdf = pd.DataFrame(data=new_pc, columns=['PC-1', 'PC-2']) print("\n新数据主成分:") print(new_pcdf)
为什么不能用fit_transform处理新数据?
fit()方法会重新计算数据的统计量(标准化时的均值/标准差,PCA时的协方差矩阵、主成分向量),这样新数据的转换就基于它自己的分布,和训练数据的主成分空间完全脱节了,这不是我们想要的。- 我们要的是把新数据投影到训练数据已经确定好的主成分空间里,所以只用
transform()方法就够了。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

