如何使用 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_classif
或sklearn.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_proj
是X_new
更好的名字,因为它是X
在principal 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 进行特征缩减并知道哪些特征被丢弃的主要内容,如果未能解决你的问题,请参考以下文章