web-dev-qa-db-ja.com

機能削減のために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です。破棄された機能や保持されている機能を知ることは可能ですか?

ありがとう

24
gc5

PCAオブジェクトがフィッティング中に決定した機能は、pca.components_にあります。 pca.components_がまたがるベクトル空間に直交するベクトル空間は破棄されます。

PCAは、事前に定義された機能(指定した列でエンコードされたもの)を「破棄」または「保持」しないことに注意してください。それらのすべてを(重み付き和で)混合して、最大分散の直交方向を見つけます。

これが探している動作でない場合、PCA次元削減は進むべき方法ではありません。いくつかの簡単な一般的な機能選択方法については、sklearn.feature_selectionをご覧ください

27
eickenberg

主成分に投影されたフィーチャは、重要な情報(最大の分散を持つ軸)を保持し、小さな分散を持つ軸をドロップします。この動作はcompression(破棄しない)に似ています。

X_projX_newのより良い名前です。なぜなら、principal componentsへのXの投影だからです

X_recは次のように再構築できます。

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

ここで、X_recXに近いですが、less important情報はPCAによって削除されました。したがって、X_recはノイズ除去されていると言えます。

私の意見では、the noiseは破棄であると言えます。

2
emeth

上記でマークされた答えは間違っています。 sklearnサイトは、components_配列がソートされていることを明確に述べています。そのため、重要な機能を識別するために使用することはできません。

components_:配列、[n_components、n_features]データの最大分散の方向を表す、特徴空間の主軸。コンポーネントは、explained_variance_によってソートされます。

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

0