Zastosowanie PCA do testowania danych do celów klasyfikacji

10

Niedawno dowiedziałem się o cudownym PCA i zrobiłem przykład opisany w dokumentacji scikit-learn .

Chcę wiedzieć, jak mogę zastosować PCA do nowych punktów danych do celów klasyfikacji.

Po wizualizacji PCA w płaszczyźnie dwuwymiarowej (oś x, y) widzę, że prawdopodobnie mogę narysować linię, aby oddzielić punkty danych, tak aby jedna strona miała jedną klasyfikację, a druga inną. Jak narysować tę „granicę” i zastosować ją do nowych punktów danych?

vlasnalknsd
źródło
3
PCA nie jest klasyfikatorem, ale możliwe jest umieszczenie nowych obserwacji w PCA przy założeniu, że te same zmienne użyte do „dopasowania” PCA są mierzone w nowych punktach. Następnie umieszczasz nowe punkty na ważonej sumie wyników zmiennych (ładunków), wag podanych przez dane. To powiedziawszy, arbitralne rysowanie linii przez PCA nie wydaje mi się dobrym wyborem klasyfikatora ...
Gavin Simpson

Odpowiedzi:

16

PCA to narzędzie do zmniejszania wymiarów, a nie klasyfikator. W Scikit-Learn wszystkie klasyfikatory i estymatory mają predictmetodę, której nie ma PCA . Musisz dopasować klasyfikator do danych transformowanych PCA. Scikit-Learn ma wiele klasyfikatorów. Oto przykład użycia drzewa decyzyjnego na danych transformowanych PCA. Wybrałem klasyfikator drzewa decyzyjnego, ponieważ działa on dobrze dla danych z więcej niż dwiema klasami, co ma miejsce w przypadku zestawu danych tęczówki.

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 ma wygodne narzędzie o nazwie Pipeline, które pozwala łączyć ze sobą transformatory i końcowy klasyfikator:

# 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)

Jest to szczególnie przydatne podczas sprawdzania poprawności krzyżowej, ponieważ zapobiega przypadkowemu dopasowaniu ŻADNEGO kroku potoku w zestawie danych testowania:

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

Nawiasem mówiąc, może nie być konieczne użycie PCA, aby uzyskać dobre wyniki klasyfikacji. Zestaw danych tęczówki nie ma wielu wymiarów, a drzewa decyzyjne będą już dobrze działać na nietransformowanych danych.

Austin Richardson
źródło
6
rere
@xeon Nie wiedziałem tego.
Austin Richardson,
Być może lepiej sprawdzić, czy wyobrażasz sobie PCA jako rotację. Jeśli zdarzy się, że Twój zestaw danych ma taką właściwość, że klasy mogą być dyskryminowane przez wariancję, wówczas rotacja będzie wszystkim, czego potrzebujesz.
Vladislavs Dovgalecs
2
@xeon: Gdy wszystkie wymiary są zachowane, jedyną rzeczą, którą można osiągnąć dzięki PCA, jest korelowanie zestawu danych. Może rzeczywiście być korzystny dla niektórych klasyfikatorów, ale zdecydowana większość nie dba o to.
ameba
1
@amoeba Całkowicie się zgadzam, to tylko mały szczegół. Musiałem poradzić sobie z tak szczególnym zestawem danych i zawsze pamiętam tę lekcję.
Vladislavs Dovgalecs
0

Jeśli chcesz zastosować PCA do nowych danych, musisz najpierw dopasować model do zestawu danych szkoleniowych. Jaki model zapytasz? Jest to średni wektor odjęty od zestawu danych, wariancje użyte do „wybielenia” każdego wektora danych i wyuczona macierz mapowania. Aby więc zmapować nowy zestaw danych w tej samej przestrzeni, co dane treningowe, najpierw odejmij średnią, wybielić ją i zmapować za pomocą macierzy mapowania.

Vladislavs Dovgalecs
źródło