Как выполнить прогнозирование с помощью LDA (линейного дискриминанта) в scikit-learn?

Я проверял, насколько хорошо PCA и LDA работают для классификации 3 различных типов тегов изображений, которые я хочу автоматически идентифицировать. В моем коде X - это моя матрица данных, где каждая строка - это пиксели изображения, а y - это одномерный массив, определяющий классификацию каждой строки.

import matplotlib.pyplot as plt
from sklearn import datasets
from sklearn.decomposition import PCA
from sklearn.lda import LDA

pca = PCA(n_components=2)
X_r = pca.fit(X).transform(X)

plt.figure(figsize = (35, 20))
plt.scatter(X_r[:, 0], X_r[:, 1], c=y, s=200)

lda = LDA(n_components=2)
X_lda = lda.fit(X, y).transform(X)
plt.figure(figsize = (35, 20))
plt.scatter(X_lda[:, 0], X_lda[:, 1], c=y, s=200)

С LDA я получаю 3 четко различимых кластера с небольшим перекрытием между ними. Теперь, если у меня есть новое изображение, которое я хочу классифицировать, как только я превращу его в одномерный массив, как мне предсказать, в какой кластер он должен попасть, и если он падает слишком далеко от центра, как я могу сказать, что классификация "неокончательна"? "? Мне также было любопытно, что функция ".transform(X)" сделала с моими данными, как только я их подогнала.

1 ответ

Решение

После того, как вы обучили свою модель LDA некоторым данным XВы можете проецировать некоторые другие данные, Z, в этом случае вы должны сделать следующее:

lda = LDA(n_components=2) #creating a LDA object
lda = lda.fit(X, y) #learning the projection matrix
X_lda = lda.transform(X) #using the model to project X 
# .... getting Z as test data....
Z = lda.transform(Z) #using the model to project Z
z_labels = lda.predict(Z) #gives you the predicted label for each sample
z_prob = lda.predict_proba(Z) #the probability of each sample to belong to each class

Обратите внимание, что "подгонка" используется для подгонки модели, а не подгонки данных.

Так transform используется для построения представления (проекция в данном случае), и predict используется для прогнозирования метки каждого образца. (это используется для ВСЕХ классов, которые наследуются от BaseEstimator в склеарн.

Вы можете прочитать документацию для дальнейших опций и свойств.

Кроме того, API Sklearn позволяет вам сделать pca.fit_transform(X) вместо pca.fit(X).transform(X), Используйте эту версию, когда вы не заинтересованы в самой модели после этой точки в коде.

Несколько комментариев: Поскольку PCA - это неконтролируемый подход, LDA - лучший подход для выполнения этой "визуальной" классификации, которую вы в настоящее время делаете.

Более того, если вы заинтересованы в классификации, вы можете рассмотреть возможность использования классификаторов другого типа, не обязательно LDA, хотя это отличный подход для визуализации.

Другие вопросы по тегам