如何使用scikit-learn的PCA进行特征选择并了解哪些特征被丢弃

27 投票
3 回答
38374 浏览
提问于 2025-04-18 04:14

我正在尝试对一个大小为 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 个回答

1

上面标记的答案是不正确的。sklearn网站上明确说明,components_数组是经过排序的,因此不能用来识别重要的特征。

components_ : 数组, [n_components, n_features] 特征空间中的主轴,表示数据中最大方差的方向。这些组件是根据explained_variance_进行排序的。

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

2

将特征投影到主成分上时,会保留重要的信息(也就是那些变化最大的方向),而把变化小的方向去掉。这种做法就像是压缩,但并不是完全丢弃数据。

X_proj这个名字比X_new更合适,因为它是X主成分上的投影。

你可以这样重建X_rec

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

在这里,X_recX很接近,但通过主成分分析(PCA)丢掉了不太重要的信息。所以我们可以说X_rec是经过去噪处理的。

在我看来,我可以说噪声是被丢弃的。

32

在你使用的 PCA 对象中,经过训练后确定的特征可以在 pca.components_ 中找到。与 pca.components_ 所形成的空间垂直的部分会被丢弃。

需要注意的是,PCA 并不会“丢弃”或“保留”你预先定义的特征(这些特征是由你指定的列表示的)。它会把所有特征混合在一起(通过加权求和),以找到最大方差的垂直方向。

如果这不是你想要的效果,那么使用 PCA 进行降维可能就不合适了。如果你需要一些简单的特征选择方法,可以看看 sklearn.feature_selection

撰写回答