如何将主成分分析的结果映射回输入模型的实际特征?

How to map the results of Principal Component Analysis back to the actual features that were fed into the model?

当我 运行 下面的代码时,我看到“pca.explained_variance_ratio_”和一个直方图,它显示了为每个特征解释的方差比例。

import statsmodels.api as sm
import numpy as np
import pandas as pd
import statsmodels.formula.api as smf
from statsmodels.stats import anova

mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)

x = df.iloc[:,2:]

from sklearn.preprocessing import StandardScaler

pca = PCA(n_components=11)
principalComponents = pca.fit_transform(df)


# Plotting the variances for each PC
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)

如何将 PCA 1 和 2 映射回数据框中的原始特征?

使用inverse_transform方法:

x_fromPCA = pca.inverse_transform(principalComponents)

每个 PC 都是您的变量的线性组合。例如 PC1 将是(其中 X1、X2 代表每个因变量):

所以 w11、w22 将是您的负载,它们将代表每个功能对相关 PC 的影响。基本上,它们会显示与您的 PC 的相关程度。有关 sklearn 的解释,请参阅 this post or maybe something like this blog

在您的示例中,您没有在 PC 之前缩放数据,因此负载最多的矢量将是幅度最大的矢量。所以让我们正确地做到这一点:

import statsmodels.api as sm
import numpy as np
import pandas as pd
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
import matplotlib.pyplot as plt

mtcars = sm.datasets.get_rdataset("mtcars", "datasets", cache=True).data
df = pd.DataFrame(mtcars)
X = StandardScaler().fit_transform(df)
pca = PCA(n_components=11)
pca.fit(X)

# Plotting the variances for each PC
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)

这些是加载量:

PCnames = ['PC'+str(i+1) for i in range(pca.n_components_)]
Loadings = pd.DataFrame(pca.components_,columns=PCnames,index=df.columns)

Loadings.iloc[:,:2]

                PC1        PC2
    mpg      0.362531   -0.373916
    cyl      0.016124    0.043744
    disp    -0.225744   -0.175311
    hp      -0.022540   -0.002592
    drat     0.102845    0.058484
    wt      -0.108797    0.168554
    qsec     0.367724    0.057278
    vs       0.754091    0.230825
    am      -0.235702   -0.054035
    gear     0.139285   -0.846419
    carb     0.124896    0.140695 

粗略地说,这意味着具有高 vs 的观察结果在第一个组件 (PC1) 上的得分较高,而 am 的观察结果同样具有较低的得分。你可以查看他们的影响力:

Loadings["PC1"].sort_values().plot.barh()