KNN не находит классов после балансировки данных - PullRequest
1 голос
/ 28 сентября 2019

У меня странная проблема, когда у меня есть модель с 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 класса сейчас?

1 Ответ

0 голосов
/ 29 сентября 2019

Хотя для полного расследования требуются ваши данные, которые вы не предоставляете, такое поведение (хотя бы частично) соответствует следующему сценарию:

  1. У вас есть дубликатов (возможно много) в ваших исходных данных
  2. Из-за этих дубликатов некоторые (большинство? все?) из ваших тестовых данных на самом деле не являются новыми / невидимыми, но копии образцов в вашем обученииданные, что приводит к неоправданно высокой точности теста 1,0
  3. . При добавлении новых данных (без дубликатов ваших исходных данных) модель неудивительно, что не соответствует ожиданиям, связанным с такой высокой точностью (1,0) вданные испытаний.

Обратите внимание, что стратифицированное расщепление не защитит вас от такого сценария;вот демонстрация с игрушечными данными, адаптированная из документации :

import numpy as np
from sklearn.model_selection import StratifiedShuffleSplit

X = np.array([[1, 2], [3, 4], [1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([0, 1, 0, 1, 0, 1])

sss = StratifiedShuffleSplit(n_splits=5, test_size=0.5, random_state=0)
train_index, test_index = next(sss.split(X, y))

X[train_index]
# result:
array([[3, 4],
       [1, 2],
       [3, 4]])

X_[test_index]
# result:
array([[3, 4],
       [1, 2],
       [1, 2]])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...