Anwenden von PCA auf Testdaten zu Klassifizierungszwecken

10

Ich habe kürzlich etwas über die wunderbare PCA gelernt und das in der Scikit-Learn-Dokumentation beschriebene Beispiel ausgeführt .

Ich bin interessiert zu wissen, wie ich PCA für Klassifizierungszwecke auf neue Datenpunkte anwenden kann.

Nachdem ich PCA in einer zweidimensionalen Ebene (x-, y-Achse) visualisiert habe, sehe ich, dass ich wahrscheinlich eine Linie zeichnen kann, um die Datenpunkte so zu trennen, dass eine Seite einer Klassifizierung und die andere einer anderen Klassifizierung entspricht. Wie zeichne ich diese "Grenze" und wende sie auf die neuen Datenpunkte an?

vlasnalknsd
quelle
3
PCA ist kein Klassifikator, aber es ist möglich, neue Beobachtungen in die PCA einzufügen, vorausgesetzt, dass dieselben Variablen, die zum "Anpassen" der PCA verwendet werden, an den neuen Punkten gemessen werden. Dann setzen Sie die neuen Punkte einfach auf die gewichtete Summe der variablen Bewertungen (Ladungen), die durch die Daten gegeben werden. Das heißt, willkürlich eine Linie durch Ihre PCA zu ziehen, klingt für mich nicht nach einer guten Wahl eines Klassifikators ...
Reinstate Monica - G. Simpson

Antworten:

16

PCA ist ein Werkzeug zur Dimensionsreduzierung, kein Klassifikator. In Scikit-Learn haben alle Klassifikatoren und Schätzer eine predictMethode, die PCA nicht verwendet . Sie müssen einen Klassifikator an die PCA-transformierten Daten anpassen. Scikit-Learn hat viele Klassifikatoren. Hier ist ein Beispiel für die Verwendung eines Entscheidungsbaums für PCA-transformierte Daten. Ich habe den Entscheidungsbaumklassifikator gewählt, da er für Daten mit mehr als zwei Klassen gut funktioniert, was beim Iris-Dataset der Fall ist.

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 verfügt über ein praktisches Tool namens Pipeline, mit dem Sie Transformatoren und einen endgültigen Klassifikator miteinander verketten können :

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

Dies ist besonders nützlich, wenn Sie eine Kreuzvalidierung durchführen, da Sie nicht versehentlich einen Schritt der Pipeline in Ihren Testdatensatz einpassen:

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

Übrigens müssen Sie möglicherweise nicht einmal PCA verwenden, um gute Klassifizierungsergebnisse zu erzielen. Der Iris-Datensatz hat nicht viele Dimensionen und Entscheidungsbäume funktionieren bereits gut mit den nicht transformierten Daten.

Austin Richardson
quelle
6
Vielleicht ist es wichtig zu beachten, dass PCA auch dann nützlich sein kann, wenn die Dimensionalität nicht verringert wird. Sie können einen Datensatz der Dimensionalität und die Unterscheidungsrichtungen entsprechen der maximalen Varianz. Sie behalten die Dimensionen bei, aber die Basis ist unterschiedlich. Durch die Zuordnung Ihrer Daten auf dieser neuen Basis können Klassen besser als auf der ursprünglichen Basis unterschieden werden. ddd
Vladislavs Dovgalecs
@xeon Das wusste ich nicht.
Austin Richardson
Vielleicht ist es besser zu sehen, ob Sie sich PCA als Rotation vorstellen. Wenn Ihr Dataset diese Eigenschaft aufweist, sodass die Klassen durch Varianz unterschieden werden können, ist diese Rotation alles, was Sie benötigen.
Vladislavs Dovgalecs
2
@xeon: Wenn alle Dimensionen beibehalten werden, erreicht PCA nur die Dekorrelation des Datensatzes. Es kann zwar für einige Klassifikatoren von Vorteil sein , aber die große Mehrheit kümmert sich nicht darum.
Amöbe sagt Reinstate Monica
1
@amoeba Ich stimme vollkommen zu, dies ist nur ein kleines Detail. Ich musste mich mit solch einem bestimmten Datensatz befassen und mich immer an diese Lektion erinnern.
Vladislavs Dovgalecs
0

Wenn Sie PCA auf neue Daten anwenden möchten, müssen Sie zuerst ein Modell in einen Trainingsdatensatz eingepasst haben. Was ist das Modell, das Sie fragen werden? Dies ist der mittlere Vektor, den Sie vom Datensatz subtrahiert haben, die Varianzen, mit denen Sie jeden Datenvektor "weiß" gemacht haben, und die gelernte Mapping-Matrix. Um einen neuen Datensatz im selben Bereich wie die Trainingsdaten abzubilden, subtrahieren Sie zunächst den Mittelwert, machen ihn weiß und ordnen ihn der Zuordnungsmatrix zu.

Vladislavs Dovgalecs
quelle