Application de l'ACP pour tester les données à des fins de classification

10

J'ai récemment découvert le merveilleux PCA et j'ai fait l'exemple décrit dans la documentation scikit-learn .

Je souhaite savoir comment appliquer l'APC à de nouveaux points de données à des fins de classification.

Après avoir visualisé PCA dans un plan bidimensionnel (axe x, y), je vois que je peux probablement tracer une ligne pour séparer les points de données de sorte qu'un côté serait d'une classification et l'autre d'une autre classification. Comment dessiner cette "frontière" et l'appliquer aux nouveaux points de données?

vlasnalknsd
la source
3
L'ACP n'est pas un classificateur, mais il est possible de placer de nouvelles observations dans l'ACP en supposant que les mêmes variables utilisées pour «ajuster» l'ACP sont mesurées sur les nouveaux points. Ensuite, vous placez simplement les nouveaux points à la somme pondérée des scores variables (chargements), poids donnés par les données. Cela dit, tracer arbitrairement une ligne dans votre PCA ne me semble pas être un bon choix de classificateur ...
Gavin Simpson

Réponses:

16

PCA est un outil de réduction de dimension, pas un classificateur. Dans Scikit-Learn, tous les classificateurs et estimateurs ont une predictméthode que PCA n'a pas . Vous devez adapter un classificateur sur les données transformées par PCA. Scikit-Learn possède de nombreux classificateurs. Voici un exemple d'utilisation d'un arbre de décision sur des données transformées par l'ACP. J'ai choisi le classificateur d'arbre de décision car il fonctionne bien pour les données avec plus de deux classes, ce qui est le cas avec l'ensemble de données iris.

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 possède un outil pratique appelé Pipeline qui vous permet de chaîner des transformateurs et un classificateur final:

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

Cela est particulièrement utile lorsque vous effectuez une validation croisée car cela vous empêche de réadapter accidentellement N'IMPORTE QUELLE étape du pipeline sur votre jeu de données de test:

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

Soit dit en passant, vous n'aurez peut-être même pas besoin d'utiliser PCA pour obtenir de bons résultats de classification. L'ensemble de données iris n'a pas beaucoup de dimensions et les arbres de décision fonctionnent déjà bien sur les données non transformées.

Austin Richardson
la source
6
Il est peut- être important de noter que l'ACP peut être utile même si la dimensionnalité n'est pas réduite. Vous pouvez avoir un ensemble de données de dimensionnalité et les directions discriminantes sont celles qui correspondent à la variance maximale. Vous conservez les dimensions mais la base est différente. Le mappage de vos données sur ces nouvelles bases aidera à mieux distinguer les classes que sur la base d'origine. ddd
Vladislavs Dovgalecs
@xeon, je ne le savais pas.
Austin Richardson
Il vaut peut-être mieux voir si vous imaginez l'ACP comme une rotation. S'il arrive que votre ensemble de données possède cette propriété de sorte que les classes puissent être discriminées par variance, alors cette rotation sera tout ce dont vous avez besoin.
Vladislavs Dovgalecs
2
@xeon: Lorsque toutes les dimensions sont conservées, la seule chose que l'on réalise par PCA est la décorrélation de l'ensemble de données. Il peut en effet être bénéfique pour certains classificateurs, mais la grande majorité s'en moque.
amoeba
1
@amoeba Je suis entièrement d'accord, ce n'est qu'un petit détail. J'ai dû faire face à un tel ensemble de données et me souvenir toujours de cette leçon.
Vladislavs Dovgalecs
0

Si vous souhaitez appliquer PCA à de nouvelles données, vous devez d'abord avoir ajusté un modèle sur un ensemble de données d'apprentissage. Quel modèle allez-vous demander? Il s'agit du vecteur moyen que vous avez soustrait de l'ensemble de données, des variances que vous avez utilisées pour "blanchir" chaque vecteur de données et de la matrice de mappage apprise. Donc, pour mapper un nouvel ensemble de données dans le même espace que les données d'entraînement, vous devez d'abord soustraire la moyenne, la blanchir et la mapper avec la matrice de mappage.

Vladislavs Dovgalecs
la source