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

标签 python machine-learning scikit-learn pca

当我运行下面的代码时,我看到了“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)

enter image description here

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

最佳答案

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

enter image description here

所以 w11、w22 将是您的负载,它们将代表每个功能对相关 PC 的影响。基本上它们会显示与您的 PC 的相关性请参阅 this post或者可能是这样的 blog获得 sklearn 的解释。

在您的示例中,您没有在 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)

enter image description here

这些是载荷:

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()

enter image description here

关于python - 如何将主成分分析的结果映射回输入模型的实际特征?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67585809/

相关文章:

machine-learning - Scikit-learn:在 GridSearchCV 中评分

python - 如何将 int 转换为以 9 为基数且不含 0 的 int?

python - 将列名作为变量传递给 python/pandas 函数中的 select 语句

python - 一个模拟/ stub python 模块如何像 urllib

python - 每行单独共享?

python - 如何从产品名称中提取品牌

python - 如何使用 sklearn 的 SGDClassifier 获得 Top 3 或 Top N 预测

python - 使用 Python 绘制每小时结果

machine-learning - Weka 中的测试用例

python - 如何缩放除最后一列之外的所有列?