Независимо от того, имеют ли ваши результаты смысл или нет, вы делаете здесь что-то принципиально неправильное: тренировать классификатор по всему набору данных и тестировать результаты на просмотренных данных . Я воспроизвел вашу проблему, используя набор данных 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()
Теперь, если мы попытаемся предсказать 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)