如何使用 scikit-learn PCA 进行特征缩减并知道哪些特征被丢弃

Posted

技术标签:

【中文标题】如何使用 scikit-learn PCA 进行特征缩减并知道哪些特征被丢弃【英文标题】:How to use scikit-learn PCA for features reduction and know which features are discarded 【发布时间】:2014-06-11 06:09:09 【问题描述】:

我正在尝试在维度为 m x n 的矩阵上运行 PCA,其中 m 是特征数,n 是样本数。

假设我想保留具有最大方差的nf 特征。使用scikit-learn,我可以这样做:

from sklearn.decomposition import PCA

nf = 100
pca = PCA(n_components=nf)
# X is the matrix transposed (n samples on the rows, m features on the columns)
pca.fit(X)

X_new = pca.transform(X)

现在,我得到了一个形状为 n x nf 的新矩阵 X_new。是否可以知道哪些特征被丢弃或保留?

谢谢

【问题讨论】:

特征没有被丢弃,它们被投影到更小的维度,并假设揭示不同特征之间的有趣联系。 谢谢汤姆,我在想 PCA 可以用于特征选择,但是(如果我错了,请纠正)它仅用于重新调整主成分上的数据。当你阅读它时,我想我会结束这个问题。 你的输出矩阵应该是(n, nf),而不是(nf, n) 【参考方案1】:

您的PCA 对象在拟合期间确定的特征在pca.components_ 中。与pca.components_ 所跨越的向量空间正交的向量空间被丢弃。

请注意,PCA 不会“丢弃”或“保留”您的任何预定义功能(由您指定的列编码)。它混合所有这些(通过加权和)以找到最大方差的正交方向。

如果这不是您正在寻找的行为,那么 PCA 降维不是可行的方法。一些简单通用的特征选择方法,可以看一下sklearn.feature_selection

【讨论】:

我终于明白了 PCA 的作用(希望如此)。如果特征与主成分相关,是否有任何首选的相关函数可以计算?通过这种方式,我认为能够在我的数据集中找到最具代表性的维度..(如果我错了,请纠正我)..我可以只使用 Pearson 或余弦相似度吗? 为理解 PCA 点赞 ;) -- 为了能够回答您的问题,我们需要非常清楚 feature 的含义维度。两者都有混淆的可能性。您指定的特征是矩阵的列。为了查看 PCA 组件 0 是否使用了功能 i,您可以将 pca.components_[0, i]pca.components_[0] 的其余部分进行比较。因此,如果我正确理解了您的问题,那么答案就是查看给定的 PC,看看您的哪些功能具有最强的权重。 免责声明:如果您根据主成分中的权重选择特征,您可能会或可能不会获得一些有趣的东西。再一次,PCA 不是为了丢弃由规范轴定义的特征。为了确定您在做什么,请尝试使用sklearn.feature_selection.SelectKBest 使用sklearn.feature_selection.f_classifsklearn.feature_selection.f_regression 选择k 功能,具体取决于您的目标是数字还是分类 好的,我会看看那些。为了回答您之前的问题,我将组件视为伪样本,这是错误的吗?我交替使用特征和尺寸。但是,为了获得 k 个特征(作为一种特征选择),我认为我必须交换样本和特征,以获得伪特征(而不是伪样本)的 PC。我不知道是否清楚。在这种情况下,我可以将每个功能与每台 PC 相关联,以查看它是否在所有样本中显示相同的行为。无论如何感谢您的努力:) 好吧,也许又向前迈了一步:PC 不是伪样本,而是每个主成分上特征的投影数组。所以,如果我做得正确,如果某些功能在 PC 中一起超过某个阈值(例如 A = 0.75 和 B = 0.9),并且在其他 PC 中不相关(比如 A = 0.1 和 B = 0.05) ,也许我们可以说它们可以用 B 来概括(如果我们的目标是特征选择)..【参考方案2】:

投影到主成分上的特征将保留重要信息(方差最大的轴)并丢弃方差小的轴。这种行为就像compression(不丢弃)。

X_projX_new更好的名字,因为它是Xprincipal components上的投影

您可以将X_rec 重构为

X_rec = pca.inverse_transform(X_proj) # X_proj is originally X_new

这里,X_rec 接近于 X,但 PCA 删除了 less important 信息。所以我们可以说X_rec 被去噪了。

在我看来,我可以说the noise 被丢弃了。

【讨论】:

【参考方案3】:

上面标记的答案不正确。 sklearn 网站明确指出 components_ 数组已排序。所以它不能用来识别重要的特征。

components_ : 数组,[n_components, n_features] 特征空间中的主轴,表示数据中最大方差的方向。组件按解释_方差_排序。

http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html

【讨论】:

components_数组是按照解释方差排序的,也就是说components_[0]是PC1,components_[1]是PC2,依此类推,从高到低解释方差。如果我理解正确,上面的答案是您可以使用这些来选择在每台 PC 上具有最高权重的输入特征

以上是关于如何使用 scikit-learn PCA 进行特征缩减并知道哪些特征被丢弃的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 内核 PCA 解释方差

手动 PCA 逆变换

使用 scikit-learn PCA 找到具有最高方差的维度

scikit-learn PCA 没有“分数”方法

scikit-learn 中的 PCA 投影和重建

PCA详解-并用scikit-learn实现PCA压缩红酒数据集