如何将主成分分析(PCA)结果映射回输入模型的原始特征?
你运行给出的代码时,确实可以输出pca.explained_variance_ratio_结果,同时生成如下主成分解释方差占比直方图:
你给出的代码存在两处可优化的点:
- 缺少
sklearn.decomposition.PCA、matplotlib.pyplot的导入语句 - 提前提取了
x = df.iloc[:,2:]但实际PCA拟合用了全量df,且没有做标准化处理,不同量纲的特征会直接影响PCA结果的准确性
PCA1、PCA2映射回原始特征的实现方法
sklearn的PCA实例的components_属性存储了主成分到原始特征的映射权重矩阵,矩阵的每一行对应一个主成分,每一列对应输入PCA的原始特征,权重绝对值越大代表对应原始特征对该主成分的贡献度越高。
完整实现代码
import statsmodels.api as sm import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler # 加载mtcars数据集 mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data df = pd.DataFrame(mtcars) # 提取第三列及之后的特征用于PCA计算 x = df.iloc[:,2:] # 先做特征标准化,消除量纲影响 scaler = StandardScaler() x_scaled = scaler.fit_transform(x) # 拟合PCA模型 pca = PCA(n_components=11) principalComponents = pca.fit_transform(x_scaled) # 绘制方差占比直方图 PC = range(1, pca.n_components_+1) plt.bar(PC, pca.explained_variance_ratio_, color='gold') plt.xlabel('Principal Components') plt.ylabel('Variance %') plt.xticks(PC) plt.show() # ========== 核心:提取PCA1、PCA2到原始特征的映射关系 ========== pca_2_mapping = pd.DataFrame( data = pca.components_[:2], # 取前两个主成分的权重 index = ["PCA1", "PCA2"], columns = x.columns # 对应原始特征名 ) print("PCA1、PCA2与原始特征的映射权重:") print(pca_2_mapping) # 可选:将主成分得分反推回原始特征数值 # 取前两个主成分的得分反变换 pca_2_scores = principalComponents[:, :2] # 先反PCA变换,再反标准化得到原始尺度的特征值 inverse_original = scaler.inverse_transform(pca.inverse_transform(principalComponents)) inverse_original_df = pd.DataFrame(inverse_original, columns=x.columns)
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

