В этом посте я объясню передискретизацию/апсемплинг с использованием SMOTE, SVM SMOTE, BorderlineSMOTE, K-Means SMOTE и SMOTE-NC. После объяснений я приведу практический пример, в котором мы применяем эти методы для решения несбалансированной проблемы машинного обучения, чтобы увидеть их влияние.

Введение

При работе над проблемами машинного обучения я в первую очередь проверяю распределение целевого класса в моих данных. Это распределение информирует об определенных аспектах того, как я решаю проблему. Я часто вижу какой-то дисбаланс в данных, и иногда этот дисбаланс незначителен (для простоты предположим, что 60:40 для задачи бинарной классификации), а иногда он есть (скажем, 98:2). Теперь, когда этот дисбаланс незначителен, мне намного легче жить; но я научился принимать, что это не всегда так. Те, кто работал с такими наборами данных (например, моделирование оттока, моделирование склонности и т. д.), должны знать, насколько низкой может быть производительность модели при правильном определении образцов класса меньшинства. Здесь важно понять, как вы можете справиться с проблемой такого типа, чтобы получить наилучший возможный результат.

Есть несколько способов решить эту проблему, и сегодня мы поговорим о передискретизации (она же апсемплинг). Проще говоря, избыточная выборка увеличивает количество выборок класса меньшинства. Однако речь идет не только о воспроизведении образцов класса меньшинства (что иногда может быть эффективным!), но и об использовании более сложных методов. Эти сложные методы включают в себя популярный SMOTE и несколько полезных вариантов (о которых, как мне кажется, мало говорят), производных от него.

Сначала я объясню, как работают эти методы, а затем мы рассмотрим небольшой практический пример, где мы применяем эти методы и смотрим, как они работают. Тогда начнем!

Методы

SMOTE (Техника передискретизации синтетического меньшинства)

SMOTE [1] следует очень простому подходу:

  1. Выберите образец, назовем его O(для происхождения), из класса меньшинства случайным образом.
  2. Найдите K-ближайших соседей O, которые принадлежат к тому же классу
  3. Соедините O с каждым из этих соседей прямой линией
  4. Случайным образом выберите коэффициент масштабирования «в диапазоне [0,1].
  5. Для каждого нового соединения поместите новую точку на линии (z * 100)% от O. Это будут наши синтетические образцы.
  6. Повторяйте этот процесс, пока не получите желаемое количество синтетических образцов.

Хотя идея создания новых синтетических сэмплов вместо дублирования оригинальных сэмплов является шагом вперед, у SMOTE есть один главный недостаток. Если точки, выбранные на шагах 1 или 2, расположены в области, в которой доминируют выборки большинства классов, синтетические точки могут быть сгенерированы внутри области большинства классов (что может затруднить классификацию!). Чтобы узнать больше, Dr. Саптарси Госвами и Алексей Билогур предоставили информативную визуализацию этого феномена.

ГраницаSMOTE

BorderlineSMOTE [2] работает аналогично традиционному SMOTE, но с некоторыми оговорками. Чтобы преодолеть недостаток SMOTE, он определяет два набора точек — Шум и Граница. Что это за своеобразные моменты, спросите вы? Точка называется "Шумом", если все ее ближайшие соседи принадлежат к другому классу (то есть к большинству). С другой стороны, "пограничные"точки — это точки, ближайшими соседями которых являются точки классов большинства и меньшинства.

Когда выборка завершена (SMOTE -> Шаг 1), используются только точки Border. Впоследствии при поиске ближайших соседей критерии выбора только точек, принадлежащих одному классу, смягчаются, чтобы включить точки, принадлежащие любому классу. Это помогает выбрать точки, которые могут быть ошибочно классифицированы, и новые точки ближе к границе. Все остальное то же самое.

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

K-значит SMOTE

Это довольно новый метод [3], и он направлен на уменьшение зашумленных синтетических точек, которые генерируются другими методами передискретизации. Принцип работы довольно прост:

  1. Выполните кластеризацию K-средних для данных. (Что такое кластеризация K-средних?)
  2. Выберите кластеры с высокой долей (>50% или определяемой пользователем) выборок класса меньшинства.
  3. Примените обычный SMOTE к этим выбранным кластерам. Каждому кластеру будут присвоены новые синтетические точки. Количество этих сгенерированных точек будет зависеть от разреженности класса меньшинства в кластере; чем больше разреженность, тем больше новых точек.

По сути, этот метод помогает создавать кластеры класса меньшинства (на которые не сильно влияют другие классы). В конечном итоге это может принести пользу модели машинного обучения. Однако он унаследовал слабые стороны алгоритма K-Means, такие как поиск правильного K среди прочих.

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

SVM SMOTE

SVM SMOTE [4] фокусируется на увеличении точек меньшинства вдоль границы решения. Аргумент, стоящий за этим, заключается в том, что экземпляры вокруг этой границы имеют решающее значение для оценки оптимальной границы решения (что контрастирует с методом K-средних, который мы видели ранее, но согласуется с вариантом границы).

Итак, как работает этот метод:

  1. Обучите SVM на ваших данных. Это даст вам векторы поддержки (мы сосредоточимся на векторах поддержки класса меньшинства). (Что такое SVM?)
  2. Затем мы используем эти опорные векторы для создания новых выборок. Для каждого из опорных векторов мы находим его K-ближайших соседей и создаем выборки вдоль линии, соединяющей опорный вектор и ближайших соседей, используя либо интерполяцию, либо экстраполяцию.
  3. Если менее половины ближайших соседей принадлежат к мажоритарному классу, то делаем экстраполяцию. Это помогает расширить область класса меньшинства в сторону области большинства. Если нет, то делаем интерполяцию. Идея здесь в том, что, поскольку большинство соседей принадлежат к классу большинства, мы вместо этого консолидируем текущую область класса меньшинства.

Если вам трудно понять пункт 3, попробуйте визуализировать его в уме или нарисуйте на листе бумаги, чтобы увидеть, как он будет выглядеть. Это должно сделать вещи более очевидными. Взгляните на исследовательскую работу [4], указанную в конце этого поста, и подтвердите свое понимание.

Примечание. При нахождении ближайших соседей учитываются все классы, а при присоединении опорного вектора меньшинства к этим соседям учитываются только меньшинства.

Этот метод хорошо работает, когда существует низкая степень перекрытия между классами.

SMOTE-NC

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

SMOTE-NC (N для номинального и C для непрерывного) [1] можно использовать, когда у нас есть смесь числовых © и категориальных (N) данных. Чтобы понять, как работает этот метод, я отвечу на два вопроса. Остановитесь на мгновение и подумайте, какими они могут быть.

Вопрос 1: Учитывая, что у нас есть категориальные переменные, как мы вычисляем расстояние при поиске ближайших соседей?

Ответ 1: Мы вычисляем константу M (думаем об этом как о штрафном члене), которая является медианой стандартных отклонений числовых характеристик выборок меньшинства. См. иллюстрацию ниже:

Вопрос 2: Как мы назначаем категории новым синтетическим очкам?

Ответ 2: Чтобы получить числовые характеристики нового синтетического образца, мы используем традиционный SMOTE. Однако, чтобы получить категориальный признак, мы присваиваем значение, встречающееся у большинства K-ближайших соседей (все они принадлежат к классу меньшинства).

Итак, теперь мы знаем, как найти ближайших соседей (Шаг 2 SMOTE) и назначить категории. Остальное в основном алгоритм SMOTE.

Примечание. Если ваши данные содержат только категориальные признаки, вы можете использовать SMOTE-N. Однако такой сценарий должен быть редким.

Практический пример

Реализация этих методов относительно проста (хотя вам нужно будет изучить некоторые более тонкие детали в исследовательских работах, перечисленных в конце этого поста). Существует отличный пакет под названием Imbalanced Learn, в котором уже реализованы все эти методы, и он очень прост в использовании. Но, если у вас есть время, почему бы не реализовать свою реализацию и посмотреть, как она соотносится с пакетом.

Итак, подходя к примеру. Мы будем использовать набор данных об оттоке клиентов в сфере телекоммуникаций, поскольку он по своей природе несбалансирован. Это проблема бинарной классификации, когда клиент либо уходит (то есть уходит), либо остается.

Сравним производительность классификатора для следующих стратегий:

  1. Нет передискретизации
  2. Случайная передискретизация
  3. УДАР
  4. ГраницаSMOTE
  5. SVM SMOTE
  6. K-значит SMOTE

Поскольку это несбалансированная проблема, точность классификатора — не лучшая метрика для сравнения. Вместо этого я сосредоточусь на отзыве класса меньшинства (оттока). Напомним, что позволяет нам понять, насколько хорошо классификатор правильно определяет клиентов, которые уходят. Мы также можем сосредоточиться на точности и F1, но это зависит от бизнес-требований и того, на что направлено внимание (минимизация ложноотрицательных или ложноположительных результатов или того и другого). Прочтите этот пост, чтобы узнать больше об этих метриках и получить общее представление о том, когда что выбирать.

Весь блокнот можно найти здесь. Ниже я покажу только код, относящийся к передискретизации.

#Imports
from imblearn.over_sampling import RandomOverSampler 
from imblearn.over_sampling import SMOTE
from imblearn.over_sampling import BorderlineSMOTE
from imblearn.over_sampling import SVMSMOTE 
from imblearn.over_sampling import KMeansSMOTE
#Random Oversampling
random_os = RandomOverSampler(random_state = 42)
X_random, y_random = random_os.fit_resample(X_train, y_train)
#SMOTE
smote_os = SMOTE(random_state = 42)
X_smote, y_smote = smote_os.fit_resample(X_train, y_train)
#BorderlineSMOTE
smote_border = BorderlineSMOTE(random_state = 42, kind = 'borderline-2')
X_smoteborder, y_smoteborder = smote_border.fit_resample(X_train, y_train)
#SVM SMOTE
smote_svm = SVMSMOTE(random_state = 42)
X_smotesvm, y_smotesvm = smote_svm.fit_resample(X_train, y_train)
#K-Means SMOTE
smote_kmeans = KMeansSMOTE(random_state = 42)
X_smotekmeans, y_smotekmeans = smote_kmeans.fit_resample(X_train, y_train)

Упражнение для читателей:

Сделанная мной избыточная выборка приводит к тому, что соотношение между оттоком и отсутствием оттока равно 1. Но мы можем изменить это, наряду со многими другими вещами, в соответствии с требованиями, используя гиперпараметры сэмплеров (обратитесь к этим документам). Вы можете поиграть с этими гиперпараметрами и посмотреть, как они изменяют результирующий образец.

По завершению я получил следующие результаты:

Вывод:

1. Некоторая форма передискретизации лучше, чем отсутствие передискретизации для решения этой проблемы.

2. BorderlineSMOTE превосходит другие методы с большим отрывом, в то время как SMOTE, SVM SMOTE и Random Oversampling относительно одинаковы. Как я уже говорил, случайная передискретизация иногда может приводить к благоприятным результатам.

3. K-Means SMOTE дает наихудшие результаты из всех методов передискретизации. Тем не менее, вы не должны отказываться от этого метода для использования в будущем. Любой метод может превзойти другой в зависимости от типа проблемы и распределения данных. Возможно, в этом случае выбранные нами данные не подходили для K-средних.

Примечание. В записной книжке я начертил результирующее распределение данных для каждого из сравниваемых методов. Взгляните на это и попытайтесь визуально объяснить, почему мы получаем такие результаты (особенно для BorderlineSMOTE и K-Means SMOTE).

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

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

Вот и все, давайте закончим этот пост хорошим демонстрационным мемом (и уроком).

Свяжитесь со мной на LinkedIn, если у вас есть вопросы или обсуждения, связанные с этой статьей.

Подтверждение

Эта статья написана от имени Intelify Australia — компании, в которой я работаю специалистом по данным.

В Intellify мы используем данные, аналитику и машинное обучение, чтобы помочь
решить самые сложные бизнес-задачи наших клиентов. Пожалуйста, посетите наш веб-сайт, чтобы узнать больше.

Рекомендации

[1] Н. В. Чавла, К. В. Бойер, Л. О. Холл, В. П. Кегельмейер, «SMOTE: метод передискретизации синтетического меньшинства», Журнал исследований искусственного интеллекта, 321–357, 2002.

[2] Х. Хан, В. Вэнь-Юань, М. Бин-Хуан, «Граница-SMOTE: новый метод избыточной выборки в обучении несбалансированных наборов данных», Достижения в области интеллектуальных вычислений, 878–887, 2005.

[3] Феликс Ласт, Георгиос Дусас, Фернандо Бакао, «Перевыборка для несбалансированного обучения на основе K-средних и SMOTE»

[4] HM Nguyen, EW Cooper, K. Kamei, «Пограничная избыточная выборка для классификации несбалансированных данных», Международный журнал инженерии знаний и парадигм мягких данных, 3 (1), стр. 4–21, 2009 г.