SMOTE передискретизация создает новые точки данных - PullRequest
0 голосов
/ 17 марта 2020

Я пытаюсь решить проблему несбалансированной классификации, все входные функции являются категориальными. Вот количество значений каждой функции:

 for i in X_train.columns:
    print(i+':',X_train[i].value_counts().shape[0])

 Pclass: 3
 Sex: 2
 IsAlone: 2
 Title: 5
 IsCabin: 2
 AgeBin: 4
 FareBin: 4

Применение SMOTE к данным тренировки после train_test_split. Созданы новые значения, которых нет в наборе данных X_train.

 from imblearn.over_sampling import SMOTE
 from collections import Counter
 #removing the random_state dosent help
 sm = SMOTE(random_state=0)
 X_res, y_res = sm.fit_resample(X_train, y_train)
 print('Resampled dataset shape %s' % Counter(y_res))

 Resampled dataset shape Counter({1: 381, 0: 381})

Количество значений в наборе данных с передискретизацией:

 Pclass: 16
 Sex: 7
 IsAlone: 2
 Title: 12
 IsCabin: 2
 AgeBin: 4
 FareBin: 4

Существуют новые значения, созданные с помощью SMOTE, это также было в случае с under_sampling, были созданы новые значения. Эти новые значения отсутствуют в наборе тестовых данных.

Пример:

X_train-Pclass 1-20,2-15,3-40
X_res-Pclass 1-20,0.999999-3,2-11,1.9999999-4,3-34,2.9999999-6

Мой вопрос:

  1. Почему создаются и создаются эти значения они имеют какое-то значение?

  2. Как с ними бороться? Должен ли я просто округлить их или удалить их

  3. Есть ли способ выполнить выборку выше или ниже, не создавая эти новые значения?

1 Ответ

0 голосов
/ 17 марта 2020

Если распределение классов в наборе данных неравномерно, это может вызвать проблемы на более поздних этапах обучения и классификации, поскольку у классификаторов будет очень мало данных для изучения особенностей конкретного класса.

В отличие от обычного повышения дискретизации, SMOTE использует алгоритм ближайшего соседа для генерации новых и синтетических c данных, которые можно использовать для обучения моделей.

Как сказано в этой оригинальной статье SMOTE , " Класс меньшинства переизбирается путем взятия каждой выборки класса меньшинства и введения синтетических c примеров вдоль отрезков, соединяющих любые / все k ближайших соседей класса меньшинства."

Итак да , эти вновь созданные синтетические точки данных c важны, и вам не нужно сильно о них беспокоиться. SMOTE - один из лучших методов для выполнения этой задачи, поэтому я бы предложил использовать это.

Рассмотрим, например, следующее изображение: enter image description here Рисунок имеет больше точек данных для класса 0 , но очень мало для класса 1 .

Как видно, после применения SMOTE (* 1028) * Рисунок b ), он сгенерирует новые точки данных для меньшинства класса (в данном случае для класса 1 ), чтобы сбалансировать набор данных .


Попробуйте прочитать:

  1. http://rikunert.com/SMOTE_explained

  2. https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/

...