无运行错误但鸢尾花数据集PCA绘图结果异常求助
排查鸢尾花PCA分析绘图错误的关键点
先看你给出的代码片段,第一个非常明显的问题是方法名拼写错误:你写的model.fit_tran...应该是model.fit_transform(irisdf[varnames])——少写了一个s,这会直接导致scores变量无法正确生成,后续绘图自然会出问题。
除了这个拼写失误,还有两个常见的坑也可能让PCA绘图结果不符合预期:
- 忘记标准化特征:PCA对特征的尺度极度敏感,鸢尾花数据里的花瓣长度(PL)、花瓣宽度(PW)数值范围远小于花萼长度(SL)、花萼宽度(SW),如果不先做标准化处理,PCA会被数值大的特征主导,导致主成分的解释性和可视化结果出现偏差。
- 绘图时未正确关联类别标签:哪怕生成了正确的主成分得分,要是绘图时没把
Species列和得分对应绑定,也会得到混乱的可视化结果。
下面是修正后的完整可运行代码,我标注了关键修正点:
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from sklearn import datasets from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 新增:用于标准化特征 # 加载鸢尾花数据并构建DataFrame iris = datasets.load_iris() varnames = ['SL', 'SW', 'PL', 'PW'] irisdf = pd.DataFrame(data=iris.data, columns=varnames) irisdf['Species'] = [iris.target_names[a] for a in iris.target] # 关键步骤1:标准化特征(必须执行!) scaler = StandardScaler() scaled_features = scaler.fit_transform(irisdf[varnames]) # 关键步骤2:修正方法名拼写错误 model = PCA(n_components=2) scores = model.fit_transform(scaled_features) # 这里修正了fit_tran...为fit_transform # 将主成分得分合并到原DataFrame,方便后续绘图 irisdf['PC1'] = scores[:, 0] irisdf['PC2'] = scores[:, 1] # 绘制PCA散点图 plt.figure(figsize=(8,6)) sns.scatterplot(data=irisdf, x='PC1', y='PC2', hue='Species', palette='Set2', s=80) plt.title('PCA of Iris Dataset (Standardized Features)') plt.xlabel(f'Principal Component 1 ({model.explained_variance_ratio_[0]:.2%} variance)') plt.ylabel(f'Principal Component 2 ({model.explained_variance_ratio_[1]:.2%} variance)') plt.legend() plt.show()
你可以对照自己的代码逐一检查:
- 是否修正了
fit_transform的拼写错误? - 是否对特征做了标准化处理?
- 绘图时是否将主成分得分和
Species类别正确关联?
如果之前的绘图错误是因为拼写导致scores未生成,修正后应该能得到类别清晰分离的散点图;如果是因为没标准化,修正后你会看到三个鸢尾花品种在主成分空间里的区分度会更合理。
内容的提问来源于stack exchange,提问作者rnso
相关产品推荐
相关产品推荐

