Applicazione di PCA per testare i dati ai fini della classificazione


10

Di recente ho imparato a conoscere il meraviglioso PCA e ho fatto l'esempio delineato nella documentazione di scikit-learn .

Sono interessato a sapere come posso applicare PCA a nuovi punti dati a fini di classificazione.

Dopo aver visualizzato PCA su un piano bidimensionale (asse x, y), vedo che probabilmente posso disegnare una linea per separare i punti dati in modo che un lato sia di una classificazione e l'altro di un'altra classificazione. Come posso disegnare questo "confine" e applicarlo ai nuovi punti dati?


3
PCA non è un classificatore, ma è possibile inserire nuove osservazioni nel PCA assumendo che le stesse variabili utilizzate per "adattare" il PCA siano misurate sui nuovi punti. Quindi si posizionano semplicemente i nuovi punti nella somma ponderata dei punteggi delle variabili (caricamenti), pesi dati dai dati. Detto questo, disegnare arbitrariamente una linea attraverso il tuo PCA non mi sembra una buona scelta di classificatore per me ...
Gavin Simpson

Risposte:


16

PCA è uno strumento di riduzione dimensionale, non un classificatore. In Scikit-Learn, tutti i classificatori e gli stimatori hanno un predictmetodo che PCA non ha . È necessario adattare un classificatore ai dati trasformati PCA. Scikit-Learn ha molti classificatori. Ecco un esempio dell'uso di un albero decisionale su dati trasformati in PCA. Ho scelto il classificatore dell'albero decisionale in quanto funziona bene per i dati con più di due classi, come nel caso del set di dati dell'iride.

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 ha un comodo strumento chiamato Pipeline che ti consente di unire i trasformatori e un classificatore finale:

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

Ciò è particolarmente utile quando si esegue la convalida incrociata in quanto impedisce di ricollegare accidentalmente QUALSIASI passaggio della pipeline sul set di dati di test:

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

A proposito, potrebbe non essere nemmeno necessario utilizzare PCA per ottenere buoni risultati di classificazione. Il set di dati dell'iride non ha molte dimensioni e gli alberi delle decisioni funzioneranno già bene sui dati non trasformati.


6
dd

@xeon Non lo sapevo.
Austin Richardson,

Forse è meglio vedere se immagini il PCA come una rotazione. Se succede che il tuo set di dati ha questa proprietà in modo tale che le classi possano essere discriminate dalla varianza, allora questa rotazione sarà tutto ciò di cui hai bisogno.
Vladislavs Dovgalecs,

2
@xeon: quando vengono mantenute tutte le dimensioni, l'unica cosa che si ottiene da PCA è la decorrelazione del set di dati. Può davvero essere utile per alcuni classificatori, ma alla stragrande maggioranza non importa.
amoeba,

1
@amoeba Sono completamente d'accordo, questo è solo un piccolo dettaglio. Ho dovuto affrontare un set di dati così particolare e ricordare sempre quella lezione.
Vladislavs Dovgalecs,

0

Se si desidera applicare la PCA a nuovi dati, è necessario innanzitutto inserire un modello in alcuni set di dati di addestramento. Qual è il modello che chiederai? Questo è il vettore medio che hai sottratto dal set di dati, le varianze che hai usato per "sbiancare" ogni vettore di dati e la matrice di mappatura appresa. Quindi, per mappare un nuovo set di dati nello stesso spazio dei dati di allenamento, devi prima sottrarre la media, imbiancarla e mapparla con la matrice di mappatura.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.