如何使用scikit-learn的PCA进行特征选择并了解哪些特征被丢弃
我正在尝试对一个大小为 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)
现在,我得到了一个新的矩阵 X_new
,它的形状是 n x nf。请问,是否可以知道哪些特征被丢弃了,或者哪些特征被保留了呢?
谢谢
3 个回答
上面标记的答案是不正确的。sklearn网站上明确说明,components_数组是经过排序的,因此不能用来识别重要的特征。
components_ : 数组, [n_components, n_features] 特征空间中的主轴,表示数据中最大方差的方向。这些组件是根据explained_variance_进行排序的。
http://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html
将特征投影到主成分上时,会保留重要的信息(也就是那些变化最大的方向),而把变化小的方向去掉。这种做法就像是压缩
,但并不是完全丢弃数据。
而X_proj
这个名字比X_new
更合适,因为它是X
在主成分
上的投影。
你可以这样重建X_rec
:
X_rec = pca.inverse_transform(X_proj) # X_proj is originally X_new
在这里,X_rec
和X
很接近,但通过主成分分析(PCA)丢掉了不太重要
的信息。所以我们可以说X_rec
是经过去噪处理的。
在我看来,我可以说噪声
是被丢弃的。
在你使用的 PCA
对象中,经过训练后确定的特征可以在 pca.components_
中找到。与 pca.components_
所形成的空间垂直的部分会被丢弃。
需要注意的是,PCA 并不会“丢弃”或“保留”你预先定义的特征(这些特征是由你指定的列表示的)。它会把所有特征混合在一起(通过加权求和),以找到最大方差的垂直方向。
如果这不是你想要的效果,那么使用 PCA 进行降维可能就不合适了。如果你需要一些简单的特征选择方法,可以看看 sklearn.feature_selection
。