У меня странная проблема, когда у меня есть модель с 4 кластерами, данные разбалансированы в следующих пропорциях: 75%, 15%, 7% и 3%.Я делю его на поезд и тестирую с соотношением 80/20, затем тренирую KNN с 5 соседями, давая мне точность 1.
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.2, random_state=42)
train_index, test_index = next(sss.split(X, y))
x_train, y_train = X[train_index], y[train_index]
x_test, y_test = X[test_index], y[test_index]
KNN_final = KNeighborsClassifier()
KNN_final.fit(x_train, y_train)
y_pred = KNN_final.predict(x_test)
print('Avg. accuracy for all classes:', metrics.accuracy_score(y_test, y_pred))
print('Classification report: \n',metrics.classification_report(y_test, y_pred, digits=2))
Avg. accuracy for all classes: 1.0
Classification report:
precision recall f1-score support
0 1.00 1.00 1.00 140
1 1.00 1.00 1.00 60
2 1.00 1.00 1.00 300
3 1.00 1.00 1.00 1500
accuracy 1.00 2000
macro avg 1.00 1.00 1.00 2000
weighted avg 1.00 1.00 1.00 2000
Хотя это кажется странным, я продолжаю идти, получаю новые данныеи попытаться классифицировать его на основе этой модели, но он никогда не находит класс с меньшим процентом, он всегда ошибочно классифицирует его как второй более низкий класс.Поэтому я пытаюсь сбалансировать данные, используя библиотеку обучения дисбалансу с алгоритмом SMOTEENN:
Original dataset shape Counter({3: 7500, 2: 1500, 0: 700, 1: 300})
sme = SMOTEENN(sampling_strategy='all', random_state=42)
X_res, y_res = sme.fit_resample(X, y)
print('Resampled dataset shape %s' % Counter(y_res))
Resampled dataset shape Counter({0: 7500, 1: 7500, 2: 7500, 3: 7500})
Затем я делаю то же самое, делю их на обучающие и тестирую с той же пропорцией 80/20 и обучаю новый классификатор KNNс 5 соседями.Но отчет о классификации кажется еще хуже:
Avg. accuracy for all classes: 1.0
Classification report:
precision recall f1-score support
0 1.00 1.00 1.00 1500
1 1.00 1.00 1.00 500
accuracy 1.00 2000
macro avg 1.00 1.00 1.00 2000
weighted avg 1.00 1.00 1.00 2000
Я не вижу, что я делаю неправильно, есть ли какой-то процесс, который мне нужно сделать после повторной выборки данных, кроме разделения и перемешивания, передтренируешь новый классификатор?Почему мой KNN не видит 4 класса сейчас?