【问题标题】:Most important original feature(s) of Principal Component Analysis主成分分析最重要的原始特征
【发布时间】:2017-07-14 07:33:53
【问题描述】:

我正在做 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 不是进行此类分析的正确方法(我应该改用特征选择方法)吗?

【问题讨论】:

    标签: python scikit-learn pca feature-selection


    【解决方案1】:

    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 几乎没有解释整体方差,这可以忽略不计。

    【讨论】:

    • 我们能否对特征 2 的这个特征重要性给出一个衡量标准? 0.9893 * 0.8376 之类的?
    • 我从未见过有人以您描述的方式使用解释的方差和负载。您所做的基本上是通过组件的贡献来衡量负载。这是不寻常的,但它应该可以工作。
    • 既然你说不寻常,我很感兴趣其他人对这个问题的看法
    • 由于这个问题在 SO 上似乎没有受到太多关注,您可能想在stats.stackexchange.com 上询问这个问题(类似于“您可以将 PC 的因子负载相乘吗?通过 PC 的解释方差来评估 PCA 中特征的重要性?”)。我很想看看那边有知识的人对此有什么看法。
    • 感谢您的建议,这个问题现在也发布在stats.stackexchange.com/questions/266190/…
    猜你喜欢
    • 2016-01-16
    • 2016-02-22
    • 2011-06-26
    • 2016-02-05
    • 2013-10-21
    • 1970-01-01
    • 2018-03-16
    • 2013-04-21
    • 1970-01-01
    相关资源
    最近更新 更多