Aplicación de PCA para probar datos con fines de clasificación

10

Recientemente he aprendido sobre el maravilloso PCA y he hecho el ejemplo descrito en la documentación de scikit-learn .

Estoy interesado en saber cómo puedo aplicar PCA a nuevos puntos de datos para fines de clasificación.

Después de visualizar PCA en un plano bidimensional (eje x, y), veo que probablemente pueda dibujar una línea para separar los puntos de datos para que un lado sea de una clasificación y el otro de otra clasificación. ¿Cómo dibujo este "límite" y lo aplico a los nuevos puntos de datos?

vlasnalknsd
fuente
3
PCA no es un clasificador, pero es posible colocar nuevas observaciones en el PCA suponiendo que las mismas variables utilizadas para "ajustar" el PCA se midan en los nuevos puntos. Luego, coloca los nuevos puntos en la suma ponderada de los puntajes variables (cargas), pesos dados por los datos. Dicho esto, dibujar una línea arbitraria a través de su PCA no me parece una buena opción de clasificador ...
Gavin Simpson

Respuestas:

16

PCA es una herramienta de reducción de dimensiones, no un clasificador. En Scikit-Learn, todos los clasificadores y estimadores tienen un predictmétodo que PCA no tiene . Debe ajustar un clasificador en los datos transformados por PCA. Scikit-Learn tiene muchos clasificadores. Aquí hay un ejemplo del uso de un árbol de decisión en datos transformados por PCA. Elegí el clasificador de árbol de decisión ya que funciona bien para datos con más de dos clases, como es el caso del conjunto de datos de 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 tiene una herramienta conveniente llamada Pipeline que le permite encadenar transformadores y un clasificador 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)

Esto es especialmente útil cuando se realiza la validación cruzada, ya que le impide volver a ajustar accidentalmente CUALQUIER paso de la tubería en su conjunto de datos de prueba:

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

Por cierto, es posible que ni siquiera necesite usar PCA para obtener buenos resultados de clasificación. El conjunto de datos de iris no tiene muchas dimensiones y los árboles de decisión ya funcionarán bien en los datos no transformados.

Austin Richardson
fuente
66
rere
@xeon No lo sabía.
Austin Richardson
Quizás sea mejor ver si imagina PCA como una rotación. Si sucede que su conjunto de datos tiene esta propiedad de modo que las clases pueden ser discriminadas por varianza, entonces esta rotación será todo lo que necesita.
Vladislavs Dovgalecs
2
@xeon: cuando se mantienen todas las dimensiones, lo único que se logra con PCA es decorelacionar el conjunto de datos. De hecho, puede ser beneficioso para algunos clasificadores, pero a la gran mayoría no le importa.
ameba
1
@amoeba Estoy completamente de acuerdo, esto es solo un pequeño detalle. Tuve que lidiar con un conjunto de datos tan particular y siempre recordar esa lección.
Vladislavs Dovgalecs
0

Si desea aplicar PCA a nuevos datos, primero debe haber ajustado un modelo en algún conjunto de datos de capacitación. ¿Cuál es el modelo que preguntarás? Este es el vector medio que resta del conjunto de datos, las variaciones que utilizó para "blanquear" cada vector de datos y la matriz de mapeo aprendida. Entonces, para mapear un nuevo conjunto de datos en el mismo espacio que los datos de entrenamiento, primero resta la media, blanquea y mapea con la matriz de mapeo.

Vladislavs Dovgalecs
fuente