Применение PCA для проверки данных в целях классификации

10

Недавно я узнал о замечательном PCA, и я сделал пример, изложенный в документации scikit-learn .

Мне интересно знать, как я могу применить PCA к новым точкам данных для целей классификации.

После визуализации PCA в двухмерной плоскости (ось x, y) я вижу, что, вероятно, могу нарисовать линию, чтобы отделить точки данных, чтобы одна сторона была одной классификации, а другая - другой. Как нарисовать эту «границу» и применить ее к новым точкам данных?

vlasnalknsd
источник
3
PCA не является классификатором, но в PCA можно поместить новые наблюдения, предполагая, что те же самые переменные, которые использовались для «подгонки» PCA, измеряются в новых точках. Затем вы просто помещаете новые точки в взвешенную сумму переменных оценок (нагрузок), веса, заданного данными. Тем не менее, произвольное рисование линии через ваш PCA не звучит для меня как хороший выбор классификатора ...
Гэвин Симпсон

Ответы:

16

PCA - это инструмент уменьшения размеров, а не классификатор. В Scikit-Learn у всех классификаторов и оценщиков есть predictметод, которого нет у PCA . Вам необходимо установить классификатор на данные, преобразованные PCA. Scikit-Learn имеет много классификаторов. Вот пример использования дерева решений для PCA-преобразованных данных. Я выбрал классификатор дерева решений, поскольку он хорошо работает для данных с более чем двумя классами, как в случае с набором данных 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 имеет удобный инструмент под названием 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, чтобы получить хорошие результаты классификации. Набор данных iris не имеет большого количества измерений, и деревья решений уже будут хорошо работать с нетрансформированными данными.

Остин Ричардсон
источник
6
dd
@xeon Я этого не знал.
Остин Ричардсон
Возможно, лучше посмотреть, представляете ли вы PCA как ротацию. Если случится, что ваш набор данных обладает таким свойством, что классы могут различаться по дисперсии, то это вращение будет всем, что вам нужно.
Владислав Довгальец
2
@xeon: Когда все измерения сохраняются, единственное, чего можно достичь с помощью PCA, это декоррелировать набор данных. Это действительно может быть полезно для некоторых классификаторов, но подавляющему большинству все равно.
амеба
1
@amoeba Я полностью согласен, это всего лишь маленькая деталь. Мне приходилось иметь дело с таким конкретным набором данных и всегда помнить этот урок.
Владислав Довгальец
0

Если вы хотите применить PCA к новым данным, вы должны сначала подобрать модель в некотором наборе обучающих данных. Какую модель вы спросите? Это средний вектор, который вы вычли из набора данных, дисперсии, которые вы использовали для «отбеливания» каждого вектора данных, и матрицу изученного отображения. Таким образом, чтобы отобразить новый набор данных в том же пространстве, что и обучающие данные, сначала вычтите среднее значение, отбелите его и сопоставьте с матрицей отображения.

Владислав Довгальец
источник