我正在做PCA,我对哪些原始功能最重要感兴趣。让我用一个例子来说明这一点:
import numpy as np
from sklearn.decomposition import PCA
X = np.array([[1,-1, -1,-1], [1,-2, -1,-1], [1,-3, -2,-1], [1,1, 1,-1], [1,2,1,-1], [1,3, 2,-0.5]])
print(X)
哪个输出:
[[ 1. -1. -1. -1. ]
[ 1. -2. -1. -1. ]
[ 1. -3. -2. -1. ]
[ 1. 1. 1. -1. ]
[ 1. 2. 1. -1. ]
[ 1. 3. 2. -0.5]]
直观地,人们已经可以说功能1和功能4由于它们的低方差而不是非常重要。让我们在这个集合上应用pca:
pca = PCA(n_components=2)
pca.fit_transform(X)
comps = pca.components_
输出:
array([[ 0. , 0.8376103 , 0.54436943, 0.04550712],
[-0. , 0.54564656, -0.8297757 , -0.11722679]])
此输出表示每个原始要素对两个主要组成部分的重要性(请参阅this以供参考)。换句话说,对于第一主成分,特征2是最重要的,然后是特征3.对于第二主成分,特征3看起来最重要。
问题是,哪个功能最重要,哪一秒最多等?我可以使用component_
属性吗?或者我错了,PCA不是进行此类分析的正确方法(我应该使用特征选择方法)吗?
答案 0 :(得分:5)
component_
属性不是查找要素重要性的正确位置。两个阵列(即两个组件PC1和PC2)中的载荷告诉您原始矩阵如何被每个特征转换(合在一起,它们形成一个旋转矩阵)。但是他们没有告诉你每个组件对描述转换的特征空间有多大贡献,所以你还不知道如何比较两个组件的负载。
但是,您链接的answer实际上会告诉您要使用的内容:explained_variance_ratio_
属性。此属性告诉您每个主要组件解释了您的要素空间中有多少差异:
In [5]: pca.explained_variance_ratio_
Out[5]: array([ 0.98934303, 0.00757996])
这意味着第一个原则组件几乎可以解释99%的方差。您从components_
知道PC1具有第二个功能的最高负载。因此,功能2是数据空间中最重要的功能。功能3是下一个最重要的功能,因为它在PC1中具有第二高的负载。
在PC2中,绝对载荷几乎在要素2和要素3之间交换。但是,由于PC2几乎没有解释整体方差,这可以忽略不计。