分類の目的でPCAをテストデータに適用する


10

最近、素晴らしいPCAについて学び、scikit-learnのドキュメントで概説されている例を実行しました。

分類の目的でPCAを新しいデータポイントに適用する方法を知りたいです。

PCAを2次元平面(x、y軸)で視覚化した後、データポイントを分割する線を描画して、片側が別の分類になり、もう一方が別の分類になるようにすることができます。この「境界」を描画して新しいデータポイントに適用するにはどうすればよいですか?


3
PCAは分類器ではありませんが、PCAを「適合」するために使用される同じ変数が新しい点で測定されると仮定すると、PCAに新しい観測を配置することが可能です。次に、新しいポイントを変数スコア(ローディング)の加重合計、つまりデータによって与えられた加重に配置します。そうは言っても、PCAを介して任意に線を引くことは、私にとって分類子の適切な選択のように聞こえません...
モニカの復活-G.シンプソン

回答:


16

PCAは次元縮小ツールであり、分類子ではありません。Scikit-Learnでは、すべての分類器と推定器に、PCAにはないpredictメソッドがあります。PCA変換されたデータに分類器を合わせる必要があります。Scikit-Learnには多くの分類子があります。以下は、PCA変換されたデータで決定木を使用する例です。意思決定ツリー分類器を選択しました。これは、虹彩データセットの場合のように、3つ以上のクラスのデータに適しているためです。

from sklearn.decomposition import PCA
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import load_iris

# load data
iris = load_iris()

# initiate PCA and classifier
pca = PCA()
classifier = DecisionTreeClassifier()

# transform / fit

X_transformed = pca.fit_transform(iris.data)
classifier.fit(X_transformed, iris.target)

# predict "new" data
# (I'm faking it here by using the original data)

newdata = iris.data

# transform new data using already fitted pca
# (don't re-fit the pca)
newdata_transformed = pca.transform(newdata)

# predict labels using the trained classifier

pred_labels = classifier.predict(newdata_transformed)

SciKit Learnには、パイプラインと呼ばれる便利なツールがあり、トランスフォーマーと最終的な分類子をつなげることができます。

# you can make this a lot easier using Pipeline

from sklearn.pipeline import Pipeline

# fits PCA, transforms data and fits the decision tree classifier
# on the transformed data
pipe = Pipeline([('pca', PCA()),
                 ('tree', DecisionTreeClassifier())])

pipe.fit(iris.data, iris.target)

pipe.predict(newdata)

これは、クロス検証を実行するときに特に役立ちます。これは、テストデータセットでパイプラインの任意のステップを誤って再フィットするのを防ぐためです。

from sklearn.cross_validation import cross_val_score
print cross_val_score(pipe, iris.data, iris.target)
# [ 0.96078431  0.90196078  1.        ]

ところで、良い分類結果を得るためにPCAを使用する必要さえないかもしれません。アイリスデータセットには多くのディメンションがなく、デシジョンツリーは変換されていないデータに対してすでに十分に機能します。


6
dd

@xeon知らなかった。
オースティンリチャードソン

おそらく、PCAをローテーションとして想像する方が良いでしょう。データセットにこのプロパティがあり、クラスを分散で識別できる場合は、このローテーションで十分です。
Vladislavs Dovgalecs、2015

2
@xeon:すべての次元が維持される場合、PCAによって達成される唯一のことは、データセットの非相関化です。確かに一部の分類子にとっては有益ですが、大多数は気にしません。
アメーバは、2015

1
@amoeba私は完全に同意します、これはほんの小さな詳細です。私はそのような特定のデータセットを扱う必要があり、常にそのレッスンを覚えていました。
Vladislavs Dovgalecs

0

PCAを新しいデータに適用する場合は、最初にモデルをいくつかのトレーニングデータセットに適合させる必要があります。あなたが尋ねるモデルは何ですか?これは、データセットから差し引いた平均ベクトル、各データベクトルを「白くする」ために使用した分散、および学習したマッピングマトリックスです。したがって、トレーニングデータと同じ空間に新しいデータセットをマッピングするには、まず平均を差し引き、それを白色化して、マッピングマトリックスでマッピングします。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.