Как выполнить прогнозирование с помощью 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, хотя это отличный подход для визуализации.