Классификация с использованием компонентов из PCA - PullRequest
0 голосов
/ 03 апреля 2020

Я использовал анализ PCA для своего набора данных следующим образом:

from sklearn.decomposition import PCA
pca = PCA(n_components=3)
principalComponents = pca.fit_transform(scale_x)
principalDf = pd.DataFrame(data=principalComponents, columns = ['PC1', 'PC2', 'PC3'])

, а затем при визуализации результатов с помощью MatPlotLib - я вижу разделение между двумя моими классами, например:

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(principalDf['PC1'].values, principalDf['PC2'].values, principalDf['PC3'].values, c=['red' if m==0 else 'green' for m in y], marker='o')

ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')

plt.show()

PCA 3D Plot

но затем, когда я использую классификационную модель, такую ​​как SVM или Logisti c регрессия, я не могу выучить это соотношение:

from sklearn.linear_model import LogisticRegression
lg = LogisticRegression(solver = 'lbfgs')
lg.fit(principalDf.values, y)
lg_p = lg.predict(principalDf.values)
print(classification_report(y, lg_p, target_names=['Failure', 'Success']))
                 precision    recall  f1-score   support

        Failure       1.00      0.03      0.06        67
        Success       0.77      1.00      0.87       219

       accuracy                           0.77       286
      macro avg       0.89      0.51      0.46       286
   weighted avg       0.82      0.77      0.68       286

В чем может быть причина этого?

Ответы [ 2 ]

1 голос
/ 03 апреля 2020

Независимо от того, имеют ли ваши результаты смысл или нет, вы делаете здесь что-то принципиально неправильное: тренировать классификатор по всему набору данных и тестировать результаты на просмотренных данных . Я воспроизвел вашу проблему, используя набор данных iris и установив регрессор logisti c, дал хорошие результаты для меня:

from sklearn.datasets import load_iris
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import confusion_matrix
from sklearn.model_selection import train_test_split

data = load_iris()
X = data.data
y = data.target

pca = PCA(n_components=3)
principalComponents = pca.fit_transform(X)
principalDf = pd.DataFrame(data=principalComponents, columns = ['PC1', 'PC2', 'PC3'])

from mpl_toolkits.mplot3d import Axes3D
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')

ax.scatter(principalDf['PC1'].values, 
           principalDf['PC2'].values, 
           principalDf['PC3'].values, 
           c=[['red', 'green', 'blue'][m] for m in y], marker='o')

ax.set_xlabel('PC1')
ax.set_ylabel('PC2')
ax.set_zlabel('PC3')

plt.show()

enter image description here

Теперь, если мы попытаемся предсказать X_test, мы увидим, что матрица путаницы в этом случае выглядит довольно хорошо, то есть общая идея должна работать хорошо:

X_train, X_test, y_train, y_test = train_test_split(principalDf, y)

lg = LogisticRegression(solver = 'lbfgs')
lg.fit(X_train, y_train)
y_pred = lg.predict(X_test)

confusion_matrix(y_true=y_test, y_pred=y_pred)

array([[ 9,  0,  0],
       [ 0, 12,  1],
       [ 0,  0, 16]], dtype=int64)
1 голос
/ 03 апреля 2020

Во-первых, используйте три функции ПК1, ПК2, ПК3. Дополнительные характеристики (PC4 ~ PC6), которые не отражены на графике, могут повлиять на результат классификации.

Во-вторых, классификатор иногда не так хорошо подготовлен, как вы думаете. Я рекомендую использовать дерево решений вместо используемых вами классификаторов, потому что дерево - это линейный классификатор (горизонт), и он даст желаемый результат.

...