Aplicando o PCA aos Dados de Teste para Propósitos de Classificação

10

Recentemente, aprendi sobre o maravilhoso PCA e fiz o exemplo descrito na documentação do scikit-learn .

Estou interessado em saber como posso aplicar o PCA a novos pontos de dados para fins de classificação.

Depois de visualizar o PCA em um plano bidimensional (eixo x, y), vejo que provavelmente posso desenhar uma linha para separar os pontos de dados, de modo que um lado seja de uma classificação e o outro de outra classificação. Como faço para desenhar esse "limite" e aplicá-lo aos novos pontos de dados?

vlasnalknsd
fonte
3
O PCA não é um classificador, mas é possível colocar novas observações no PCA, assumindo que as mesmas variáveis ​​usadas para "ajustar" o PCA sejam medidas nos novos pontos. Em seguida, basta colocar os novos pontos na soma ponderada das pontuações variáveis ​​(cargas), pesos dados pelos dados. Dito isto, arbitrariamente desenhar uma linha através do seu PCA não soa como uma boa escolha de classificador para mim ...
Gavin Simpson

Respostas:

16

O PCA é uma ferramenta de redução de dimensão, não um classificador. No Scikit-Learn, todos os classificadores e estimadores têm um predictmétodo que o PCA não possui . Você precisa ajustar um classificador nos dados transformados pelo PCA. O Scikit-Learn possui muitos classificadores. Aqui está um exemplo de uso de uma árvore de decisão em dados transformados por PCA. Eu escolhi o classificador da árvore de decisão, pois ele funciona bem para dados com mais de duas classes, como é o caso do conjunto de dados da íris.

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)

O SciKit learn tem uma ferramenta conveniente chamada Pipeline, que permite conectar transformadores e um classificador 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)

Isso é especialmente útil ao realizar a validação cruzada, pois evita que você reajuste acidentalmente QUALQUER etapa do pipeline no conjunto de dados de teste:

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

A propósito, talvez você nem precise usar o PCA para obter bons resultados de classificação. O conjunto de dados da íris não possui muitas dimensões e as árvores de decisão já terão um bom desempenho nos dados não transformados.

Austin Richardson
fonte
6
dd
@xeon eu não sabia disso.
21715 Austin
Talvez seja melhor ver se você imagina o PCA como uma rotação. Se o seu conjunto de dados tiver essa propriedade de forma que as classes possam ser discriminadas por variação, essa rotação será tudo o que você precisa.
Vladislavs Dovgalecs
2
@xeon: Quando todas as dimensões são mantidas, a única coisa que se alcança pelo PCA é decorrelatar o conjunto de dados. De fato, pode ser benéfico para alguns classificadores, mas a grande maioria não se importa.
Ameba
11
@amoeba Concordo plenamente, este é apenas um pequeno detalhe. Eu tive que lidar com esse conjunto de dados em particular e sempre me lembro dessa lição.
Vladislavs Dovgalecs
0

Se você deseja aplicar o PCA a novos dados, deve primeiro ajustar um modelo em alguns conjuntos de dados de treinamento. Qual é o modelo que você perguntará? Esse é o vetor médio que você subtraiu do conjunto de dados, as variações usadas para "embranquecer" cada vetor de dados e a matriz de mapeamento aprendida. Portanto, para mapear o novo conjunto de dados no mesmo espaço que os dados de treinamento, você subtrai a média, embranquece-a e mapeia-a com a matriz de mapeamento.

Vladislavs Dovgalecs
fonte