如何将主成分分析的结果映射回输入模型的实际特征?
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()
当我 运行 下面的代码时,我看到“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()