PCA分析特征权重绘制技术求助:附数据集与主成分计算代码
实现PCA特征权重可视化的完整方案
看起来你已经搞定了PCA计算的核心步骤,接下来咱们把特征权重(也就是主成分的载荷矩阵)提取出来并可视化,这样就能清晰看到每个原始特征对前两个主成分的贡献啦。
首先先补全并优化你的基础代码(注意ix已经被sklearn弃用,换成iloc更稳妥):
import pandas as pd from sklearn.decomposition import PCA as sklearnPCA from sklearn.preprocessing import StandardScaler import matplotlib.pyplot as plt # 读取数据集(可替换为你的本地文件路径,或直接用pd.read_csv读取URL) data = pd.read_csv('rr.txt') X = data.iloc[:, 0:4].values # 提取前4列的特征数据 # 标准化特征(PCA对尺度敏感,这一步是关键!) X_std = StandardScaler().fit_transform(X) # 拟合PCA,提取前2个主成分 sklearn_pca = sklearnPCA(n_components=2) Y_sklearn = sklearn_pca.fit_transform(X_std) # 获取特征权重(载荷矩阵):形状为(2,4),对应2个主成分 × 4个原始特征 feature_weights = sklearn_pca.components_ # 获取原始特征的列名(如果数据集没有列名,可手动指定为['Feature1','Feature2','Feature3','Feature4']) feature_names = data.columns[0:4]
方法1:分栏条形图可视化单主成分权重
这种方式能单独清晰展示每个主成分下,不同特征的贡献差异:
# 设置画布,分成左右两个子图 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 绘制第一主成分的特征权重 ax1.bar(feature_names, feature_weights[0], color='#1f77b4') ax1.set_title('Feature Weights for First Principal Component') ax1.set_ylabel('Weight Value') ax1.tick_params(axis='x', rotation=45) # 旋转x轴标签避免重叠 # 绘制第二主成分的特征权重 ax2.bar(feature_names, feature_weights[1], color='#ff7f0e') ax2.set_title('Feature Weights for Second Principal Component') ax2.set_ylabel('Weight Value') ax2.tick_params(axis='x', rotation=45) plt.tight_layout() plt.show()
方法2:双组条形图对比两个主成分权重
如果想把两个主成分的权重放在同一张图里直接对比,用双组条形图更直观:
fig, ax = plt.subplots(figsize=(8, 5)) x_indices = range(len(feature_names)) bar_width = 0.35 # 绘制第一主成分权重 rects1 = ax.bar([i - bar_width/2 for i in x_indices], feature_weights[0], bar_width, label='PC1', color='#1f77b4') # 绘制第二主成分权重 rects2 = ax.bar([i + bar_width/2 for i in x_indices], feature_weights[1], bar_width, label='PC2', color='#ff7f0e') # 设置图表细节 ax.set_xticks(x_indices) ax.set_xticklabels(feature_names, rotation=45) ax.set_title('Feature Weights for Principal Components 1 & 2') ax.set_ylabel('Weight Value') ax.legend() plt.tight_layout() plt.show()
几个关键注意点:
- 为什么要标准化?PCA是基于方差计算的,尺度大的特征会默认主导主成分,所以必须用
StandardScaler把所有特征缩放到均值为0、方差为1的范围,保证每个特征的权重公平性。 sklearn_pca.components_返回的是主成分的特征向量,也就是每个原始特征对对应主成分的权重:权重绝对值越大,说明该特征对这个主成分的贡献越大;正负号代表特征与主成分的相关性方向。
内容的提问来源于stack exchange,提问作者Leo
相关产品推荐
相关产品推荐

