PCA分析时如何确定选中的主成分及与原始特征的映射关系
原始特征与主成分的对应关系
你拿到的10个主成分不存在和30个原始特征一一对应的关系,每个主成分都是所有原始特征的线性加权组合。你可以通过scikit-learn中训练好的PCA对象的components_属性拿到权重矩阵,这个矩阵的形状是(n_components, n_features),对应你场景下就是10行30列,第i行就是第i个主成分(PCi)对应的30个原始特征的权重系数,系数绝对值越大,说明这个原始特征对当前主成分的贡献越高。
参考示例代码查看对应关系:
from sklearn.decomposition import PCA from sklearn.preprocessing import StandardScaler import pandas as pd from sklearn.datasets import load_breast_cancer # 加载原始数据 cancer = load_breast_cancer() df = pd.DataFrame(data=cancer.data, columns=cancer.feature_names) # PCA前必须先做标准化,消除特征尺度的影响 scaler = StandardScaler() X_scaled = scaler.fit_transform(df) # 训练保留95%方差的PCA模型,对应你场景下的10个主成分 pca = PCA(n_components=0.95) X_pca_95 = pca.fit_transform(X_scaled) # 把主成分权重转成DataFrame,直观查看对应关系 pca_components_df = pd.DataFrame( pca.components_, columns = df.columns, index = [f'PC{i+1}' for i in range(pca.n_components_)] ) print(pca_components_df)
原始df与df_new的映射步骤
映射分为正向(原始特征转主成分)和反向(主成分转近似原始特征)两种场景:
1. 正向映射(原始df生成df_new)
就是你已经用到的PCA转换流程,支持批量/单条原始数据转换,不需要重新训练模型:
# 第一步:对原始特征做标准化 X_scaled_new = scaler.transform(df) # 第二步:用训练好的PCA生成主成分 X_pca = pca.transform(X_scaled_new) # 转成和你示例一致的df_new格式 df_new = pd.DataFrame(X_pca, columns=[f'PC{i+1}' for i in range(10)]) df_new['label'] = cancer.target
2. 反向映射(df_new还原近似原始df)
因为降维过程丢弃了少部分方差,还原后得到的是原始特征的近似值:
# 取出df_new中的主成分列,排除label列 pca_values = df_new[[f'PC{i+1}' for i in range(10)]].values # 第一步:反向转换得到标准化后的原始特征 X_scaled_recovered = pca.inverse_transform(pca_values) # 第二步:还原回原始特征的数值尺度 X_original_recovered = scaler.inverse_transform(X_scaled_recovered) # 转成和原始df格式对齐的DataFrame df_recovered = pd.DataFrame(X_original_recovered, columns=df.columns)
内容的提问来源于stack exchange,提问作者ASH
相关产品推荐
相关产品推荐

