sklearn 上的 PCA - 如何解释 pca.components_

Posted

技术标签:

【中文标题】sklearn 上的 PCA - 如何解释 pca.components_【英文标题】:PCA on sklearn - how to interpret pca.components_ 【发布时间】:2018-05-02 10:04:22 【问题描述】:

我使用以下简单代码在具有 10 个特征的数据帧上运行 PCA:

pca = PCA()
fit = pca.fit(dfPca)

pca.explained_variance_ratio_ 的结果显示:

array([  5.01173322e-01,   2.98421951e-01,   1.00968655e-01,
         4.28813755e-02,   2.46887288e-02,   1.40976609e-02,
         1.24905823e-02,   3.43255532e-03,   1.84516942e-03,
         4.50314168e-16])

我相信这意味着第一个 PC 解释了 52% 的方差,第二个组件解释了 29% 等等......

我不明白的是pca.components_ 的输出。如果我执行以下操作:

df = pd.DataFrame(pca.components_, columns=list(dfPca.columns))

我得到下面的数据框,其中每一行都是一个主成分。 我想了解的是如何解释该表。我知道,如果我对每个组件上的所有特征求平方并将它们相加,我会得到 1,但是 PC1 上的 -0.56 是什么意思?它是否说明了“特征 E”,因为它是解释 52% 方差的分量的最高量级?

谢谢

【问题讨论】:

看这里youtube.com/watch?v=_UVHneBUBW0 推荐:Intro to ML with Python Andreas C. Müller 和 Sarah Guido。 (Andreas 是一名核心 sklearn 开发人员。)关于 PCA 的部分给出了非常清晰的演练。 另一个建议:这个来自交叉验证 StackExchange 的优秀答案 - stats.stackexchange.com/a/140579/76611 希望我能投票两次,这正是我的问题。 【参考方案1】:

术语:首先,PCA 的结果通常根据分量分数进行讨论,有时称为因子分数(对应于特定数据点的转换变量值)和载荷 (每个标准化原始变量应乘以得到分量分数的权重。

第 1 部分:我解释了如何检查特征的重要性以及如何绘制双标图。

第 2 部分:我解释了如何检查特征的重要性以及如何使用特征名称将它们保存到 pandas 数据框中。

一篇文章中的总结:Python 精简指南:https://towardsdatascience.com/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e?source=friends_link&sk=65bf5440e444c24aff192fedf9f8b64f


第 1 部分:

在您的情况下,功能 E 的值 -0.56 是此功能在 PC1 上的得分。 此值告诉我们该功能对 PC 的影响程度(在我们的例子中是 PC1)。

所以绝对值越高,对主成分的影响越大。

在执行 PCA 分析后,人们通常会绘制已知的“双标图”,以查看 N 维(在我们的例子中为 2)的转换特征和原始变量(特征)。

我写了一个函数来绘制这个。


示例使用虹膜数据:

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

iris = datasets.load_iris()
X = iris.data
y = iris.target

#In general it is a good idea to scale the data
scaler = StandardScaler()
scaler.fit(X)
X=scaler.transform(X)

pca = PCA()
pca.fit(X,y)
x_new = pca.transform(X)   

def myplot(score,coeff,labels=None):
    xs = score[:,0]
    ys = score[:,1]
    n = coeff.shape[0]

    plt.scatter(xs ,ys, c = y) #without scaling
    for i in range(n):
        plt.arrow(0, 0, coeff[i,0], coeff[i,1],color = 'r',alpha = 0.5)
        if labels is None:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, "Var"+str(i+1), color = 'g', ha = 'center', va = 'center')
        else:
            plt.text(coeff[i,0]* 1.15, coeff[i,1] * 1.15, labels[i], color = 'g', ha = 'center', va = 'center')

plt.xlabel("PC".format(1))
plt.ylabel("PC".format(2))
plt.grid()

#Call the function. 
myplot(x_new[:,0:2], pca. components_) 
plt.show()

结果

第 2 部分:

重要的特征是对组件影响更大的特征,因此对组件具有很大的绝对值。

获取 PC 上最重要的功能以及名称并将它们保存到 pandas 数据框,请使用:

from sklearn.decomposition import PCA
import pandas as pd
import numpy as np
np.random.seed(0)

# 10 samples with 5 features
train_features = np.random.rand(10,5)

model = PCA(n_components=2).fit(train_features)
X_pc = model.transform(train_features)

# number of components
n_pcs= model.components_.shape[0]

# get the index of the most important feature on EACH component
# LIST COMPREHENSION HERE
most_important = [np.abs(model.components_[i]).argmax() for i in range(n_pcs)]

initial_feature_names = ['a','b','c','d','e']
# get the names
most_important_names = [initial_feature_names[most_important[i]] for i in range(n_pcs)]

# LIST COMPREHENSION HERE AGAIN
dic = 'PC'.format(i): most_important_names[i] for i in range(n_pcs)

# build the dataframe
df = pd.DataFrame(dic.items())

打印如下:

     0  1
 0  PC0  e
 1  PC1  d

所以在 PC1 上名为 e 的功能最重要,而在 PC2 上名为 d

一篇文章中的总结: Python 精简指南:https://towardsdatascience.com/pca-clearly-explained-how-when-why-to-use-it-and-feature-importance-a-guide-in-python-7c274582c37e?source=friends_link&sk=65bf5440e444c24aff192fedf9f8b64f

【讨论】:

感谢视频和视频。真的很有用 很高兴我能提供帮助。如果有帮助,请考虑接受答案【参考方案2】:

基本理念

按您拥有的功能划分的主要组件基本上告诉您每个主要组件在功能方向方面指向的“方向”。

在每个主成分中,具有更大绝对权重的特征将主成分“拉”到该特征的方向。

例如,我们可以说,在 PC1 中,由于 Feature A、Feature B、Feature I 和 Feature J 的权重相对较低(绝对值),PC1 在特征空间。相对于其他方向,PC1 将大部分指向要素 E 的方向。

低维可视化

要对此进行可视化,请查看以下来自here 和here 的图:

以下显示了对相关数据运行 PCA 的示例。

我们可以直观地看到,从 PCA 派生的两个特征向量都在特征 1 和特征 2 方向上被“拉”。因此,如果我们要像您制作的那样制作主成分分解表,我们会期望看到特征 1 和特征 2 对 PC1 和 PC2 的解释权重。

接下来,我们有一个不相关数据的示例。

让我们将绿色的主组件称为 PC1,将粉红色的主组件称为 PC2。很明显,PC1 没有被拉向特征 x' 的方向,PC2 也没有被拉向特征 y' 的方向。 因此,在我们的表中,PC1 中特征 x' 的权重必须为 0,PC2 中特征 y' 的权重必须为 0。

我希望这能让您了解您在表格中看到的内容。

【讨论】:

以上是关于sklearn 上的 PCA - 如何解释 pca.components_的主要内容,如果未能解决你的问题,请参考以下文章

Python PCA sklearn

scikit-learn 内核 PCA 解释方差

sklearn PCA 如何在数据帧上工作?

sklearn - PCA 的标签点

sklearn中的PCA

mlab PCA 和 sklearn PCA 的区别