微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PCA中特征重要性的度量 更新

如何解决PCA中特征重要性的度量 更新

正在进行主成分分析 (PCA),我想找出对结果贡献最大的特征。

我的直觉是总结特征对各个组件的各个贡献的所有绝对值。

import numpy as np
from sklearn.decomposition import PCA

X = np.array([[-1,-1,4,1],[-2,2],[-3,-2,3],[1,1,4],[2,5],[3,2,6]])
pca = PCA(n_components=0.95,whiten=True,svd_solver='full').fit(X)
pca.components_
array([[ 0.71417303,0.46711713,0.,0.52130459],[-0.46602418,-0.23839061,-0.,0.85205128]])
np.sum(np.abs(pca.components_),axis=0)
array([1.18019721,0.70550774,1.37335586])

在我看来,这可以衡量每个原始特征的重要性。请注意,第三个特征的重要性为零,因为我故意创建了一个只是一个常量值的列。

PCA 是否有更好的“重要性衡量标准”?

解决方法

PCA 的重要性度量在 explained_variance_ratio_ 中。此数组提供由每个组件解释的方差百分比。它按组件的重要性按降序排序,并在使用所有组件时总和为 1,或高于请求阈值的最小可能值。在您的示例中,您将阈值设置为 95%(应解释的方差),因此数组总和将为 0.9949522861608583,因为第一个分量解释了 92.021143% 和第二个 7.474085% 的方差,因此您收到了 2 个分量。

components_ 是存储特征空间中最大方差的方向的数组。它的尺寸是 n_components_n_features_。这是您在应用 transform() 以获得数据的降维投影时乘以数据点的值。

更新

为了获得原始特征对每个主成分的贡献百分比,您只需要归一化 components_,因为它们设置了原始向量对投影的贡献量。

r = np.abs(pca.components_.T)
r/r.sum(axis=0)

array([[0.41946155,0.29941172],[0.27435603,0.15316146],[0.,0.        ],[0.30618242,0.54742682]])

如您所见,第三个功能对 PC 没有贡献。

如果需要原始特征对解释方差的总贡献,则需要考虑每个 PC 贡献(即 explained_variance_ratio_):

ev = np.abs(pca.components_.T).dot(pca.explained_variance_ratio_)
ttl_ev = pca.explained_variance_ratio_.sum()*ev/ev.sum()
print(ttl_ev)

[0.40908847 0.26463667 0.         0.32122715]
,

如果你只是单纯地用 np.sum(np.abs(pca.components_),axis=0) 将 PC 相加,则假设所有 PC 都同等重要,这很少是真的。要使用 PCA 进行粗略的特征选择,请在丢弃低贡献的 PC 和/或按其相对贡献缩放 PC 后求和。

这是一个直观的例子,它强调了为什么简单的总和不能按预期工作。

给定 20 个特征的 3 个观察结果(可视化为三个 5x4 热图):

>>> print(X.T)
[[2 1 1 1 1 1 1 1 1 4 1 1 1 4 1 1 1 1 1 2]
 [1 1 1 1 1 1 1 1 1 4 1 1 1 6 3 1 1 1 1 2]
 [1 1 1 2 1 1 1 1 1 5 2 1 1 5 1 1 1 1 1 2]]

original data

这些是生成的 PC:

>>> pca = PCA(n_components=None,whiten=True,svd_solver='full').fit(X.T)

principal components

请注意,PC3 在 (2,1) 处具有高震级,但如果我们检查其解释方差,它提供了 ~0 贡献:

>>> print(pca.explained_variance_ratio_)
array([0.6638886943392722,0.3361113056607279,2.2971091700327738e-32])

在对未缩放的 PC 求和(左)与对按解释方差比缩放的 PC(右)求和时,这会导致特征选择差异:

>>> unscaled = np.sum(np.abs(pca.components_),axis=0)
>>> scaled = np.sum(pca.explained_variance_ratio_[:,None] * np.abs(pca.components_),axis=0)

unscaled vs scaled PC sums

使用未缩放的总和(左),无意义的 PC3 仍然被赋予 33% 的权重。这导致 (2,1) 被认为是最重要的特征,但如果我们回顾原始数据,(2,1) 提供的观察之间的区分度很低。

按比例和(右),PC1 和 PC2 分别具有 66% 和 33% 的权重。现在 (3,1)(3,2) 是最重要的特征,它们实际跟踪原始数据。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。