Застосування PCA для тестування даних для цілей класифікації


10

Нещодавно я дізнався про чудовий PCA і зробив приклад, викладений у документації scikit-learn .

Мені цікаво знати, як я можу застосувати PCA до нових точок даних для цілей класифікації.

Після візуалізації PCA у двовимірній площині (вісь x, y) я бачу, що, ймовірно, можу провести лінію для розділення точок даних, щоб одна сторона була однією класифікацією, а інша - іншою. Як намалювати цю "межу" та застосувати це до нових точок даних?


3
PCA не є класифікатором, але можна помістити нові спостереження в PCA, припускаючи, що ті ж змінні, які використовуються для "підгонки" PCA, вимірюються в нових точках. Тоді ви просто розміщуєте нові бали за зваженою сумою змінних балів (навантажень), зваженими даними. Але це означає, що довільне наведення лінії через ваш PCA не здається мені гарним вибором класифікатора ...
Гевін Сімпсон

Відповіді:


16

PCA - це інструмент зменшення розмірів, а не класифікатор. У Scikit-Learn усі класифікатори та оцінювачі мають predictметод, який не має PCA . Вам потрібно встановити класифікатор даних, трансформованих PCA. У Scikit-Learn є багато класифікаторів. Ось приклад використання дерева рішень для даних, трансформованих PCA. Я вибрав класифікатор дерева рішень, оскільки він добре працює для даних з більш ніж двома класами, що стосується набору даних райдужки.

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 є зручний інструмент під назвою Pipeline, який дозволяє з'єднати трансформатори та остаточний класифікатор:

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

Це особливо корисно під час перехресної перевірки, оскільки це заважає вам випадково перевстановити будь-який крок трубопроводу на тестовий набір даних:

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

До речі, вам може навіть не знадобитися використовувати PCA, щоб отримати хороші результати класифікації. Набір даних райдужної оболонки не має багатьох розмірів, і дерева рішень вже добре працюватимуть на неперетворених даних.


6
Можливо, важливо зазначити, що PCA може бути корисним, навіть якщо розмірність не зменшується. Ви можете мати набір даних про розмірність а дискримінаційні напрямки - це ті, які відповідають максимальній дисперсії. Ви зберігаєте розміри, але основи різні. Картографування ваших даних на цій новій основі допоможе розрізнити класи краще, ніж на початковій основі. ddd
Владислав Довгалеч

@xeon Я цього не знав.
Остін Річардсон

Можливо, краще побачити, чи уявляєте ви PCA як обертання. Якщо трапляється, що у вашого набору даних є така властивість, що класи можуть бути розрізнені за різницею, то це обертання буде все, що вам потрібно.
Владислав Довгалеч

2
@xeon: Коли всі параметри зберігаються, єдине, що досягається PCA, - це декорреляція набору даних. Це дійсно може бути корисним для деяких класифікаторів, але переважна більшість їх не хвилює.
амеба

1
@amoeba Я повністю згоден, це лише невелика деталь. Мені довелося мати справу з таким конкретним набором даних і завжди пам'ятати цей урок.
Владислав Довгалеч

0

Якщо ви хочете застосувати PCA до нових даних, ви повинні спочатку встановити модель на якомусь навчальному наборі даних. Яку модель ви запитаєте? Це середній вектор, який ви віднімали з набору даних, відхилення, які ви використовували для "відбілювання" кожного вектора даних та вивченої матриці відображення. Отже, щоб відобразити новий набір даних у тому самому просторі, що і навчальні дані, спочатку ви віднімаєте середнє значення, відбілюєте його та відображаєте його за допомогою матриці відображення.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.