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

34

我使用这段简单的代码对一个包含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])

我相信这意味着第一台个人电脑解释了52%的方差,第二个成分解释了29%,依此类推...

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

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

我获得了下面的数据框,其中每一行都是一个主成分。 我想要了解的是如何解释这个表格。我知道如果我对每个成分上的所有特征进行平方并将它们相加,则会得到1,但是PC1上的-0.56是什么意思?它是否有关于“特征E”的信息,因为它是解释了52%方差的成分上最高的幅度?

enter image description here

谢谢


请查看此处视频链接:https://www.youtube.com/watch?v=_UVHneBUBW0 - seralouk
推荐阅读:Andreas C. Müller和Sarah Guido的《Python机器学习入门》(Intro to ML with Python)。Andreas是sklearn核心开发人员之一。该书中关于PCA的章节提供了非常清晰的指导。 - Brad Solomon
另一个建议:来自交叉验证StackExchange的绝佳答案-https://stats.stackexchange.com/a/140579/76611 - KPLauritzen
1
希望我能点赞两次,这正是我的问题。 - Bruno Brant
2个回答

43

术语: 首先,PCA的结果通常以组件得分为讨论重点,有时称为因子得分(对应于特定数据点的变换后变量值),以及负载(用于将每个标准化原始变量乘以获取组件得分的权重)。

PART1: 我将解释如何检查特征的重要性并绘制双图。

PART2: 我将解释如何检查特征的重要性,并使用特征名称将它们保存到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


PART1:

在您的情况下,Feature 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()

结果

enter image description here

PART 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


谢谢你的回复和视频,非常有用。 - Diego
很高兴我能帮到您。如果有帮助,请考虑接受答案。 - seralouk

10

基本思想

按特征分解的主成分基本上告诉你每个主成分在特征方向上“指向”的方向。

在每个主成分中,具有较大绝对权重的特征会更多地“拉”该主成分朝着该特征方向。

例如,在PC1中,由于特征A、特征B、特征I和特征J的权重相对较低(绝对值),所以PC1在特征空间中不太朝这些特征的方向指向。相对于其他方向,PC1最可能指向特征E的方向。

较低维度的可视化

为了进行可视化,可以看一下从这里这里获取的以下图像:

下面是在相关数据上运行PCA的示例。 enter image description here

我们可以直观地看到,从PCA派生的两个特征向量都被“拉”到了特征1和特征2的方向。因此,如果我们制作一个像您制作的主成分分解表格,我们会期望在PC1和PC2中看到来自特征1和特征2的某些权重。

接下来是一个无关数据的例子。

enter image description here

让我们将绿色主成分称为PC1,将粉红色主成分称为PC2。显然,PC1没有被拉到x'特征的方向,PC2也没有被拉到y'特征的方向。 因此,在我们的表格中,PC1的x'特征权重应该为0,PC2的y'特征权重应该为0。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接