Использование различных методов передискретизации для улучшения моделей машинного обучения

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

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

  1. Оверсэмплинг
  2. Недостаточная выборка
  3. Сочетание избыточной и недостаточной выборки
  4. Пользовательская фильтрация и выборка

Сценарий и обзор данных

Чтобы продемонстрировать различные методы дисбаланса классов, будет использоваться фиктивный набор данных о дефолтах по кредитным картам. В нашем сценарии мы пытаемся создать объяснимый классификатор, который принимает два входа (возраст и баланс карты) и предсказывает, пропустит ли кто-то предстоящий платеж.

Макет данных показан на следующих диаграммах. Вы увидите, что во всех данных есть несколько случайных значений по умолчанию (оранжевые точки), но они составляют небольшой процент (24 из 374 экземпляров обучающего примера, ~ 6,4%). Это может затруднить понимание некоторых алгоритмов классификации машинного обучения, и мы можем захотеть ограничить наш потенциальный набор вариантов выбора модели в определенных случаях для факторов объяснимости/регулирования.

Для этого сценария наша цель будет составлять 90%+ по точности и 50%+ по оценке F1 (гармоническое среднее значение точности/отзыва) с использованием логистической регрессии.

Базовая логистическая регрессия

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

Базовая логистическая регрессия соответствует нашей цели точности 90%+, но терпит неудачу на фронте точности/отзыва. Ниже вы увидите, почему при таком небольшом относительном размере класса по умолчанию модель просто предсказывает каждую отдельную точку данных как не по умолчанию (обозначается голубым фон в граничном графике решения).

Тем не менее, в левом верхнем углу наших данных есть четкий раздел (очень молодой возраст с высоким балансом), который, похоже, чаще не выполняет дефолт, чем случайным образом. Можем ли мы добиться большего успеха при включении методов передискретизации?

Передискретизация

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

SMOTE расшифровывается как Synthetic Minority Over-sampling Technique. Учитывая название, вы, вероятно, можете интуитивно понять, что он делает — создает синтетические дополнительные точки данных для класса с меньшим количеством точек данных. Он делает это, принимая во внимание другие функции — вы можете думать об этом как об использовании интерполяции между несколькими выборками, которые нам нужны, чтобы добавить новые точки данных там, где они могут существовать.

Применить SMOTE просто; мы просто передаем наши обучающие данные x/y и возвращаем желаемые данные передискретизации. Построив эти новые данные, мы теперь показываем равномерное распределение классов (350 по умолчанию против 350 без по умолчанию). Было создано много новых точек данных класса по умолчанию, что должно позволить нашей модели изучить функцию, которая не просто предсказывает один и тот же результат для каждой точки данных.

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

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

Передискретизация класса, в котором было всего несколько точек данных, безусловно, привела к более высокому проценту прогнозов по умолчанию, но достигли ли мы наших целей? Точность упала до ~76%, но показатель F1 увеличился до ~30%. Еще не все, давайте попробуем некоторые дополнительные методы, чтобы посмотреть, можно ли это улучшить.

Неполная выборка

Противоположностью передискретизации класса с меньшим количеством примеров является недостаточная выборка класса с большим количеством. Используя подход Отредактированные ближайшие соседи, мы можем стратегически занижать точки данных. Это приводит к следующим измененным обучающим данным: у нас по-прежнему есть 24 точки данных класса по умолчанию, но в нашем новом наборе обучающих данных класс большинства теперь имеет только 287 из исходных 350 точек данных.

Это приводит к следующим границам решения. Модель правильно ориентируется на левый верхний угол как на область, которая чаще всего используется по умолчанию, но оценка F1 не там, где нам нужно. Конечно, в таблице все еще есть точки данных, которые можно зафиксировать, чтобы создать более идеальную границу решения.

Недостаточная выборка + Передискретизация

Еще один популярный метод — объединение двух подходов. Мы можем выполнить передискретизацию с помощью SMOTE, а затем очистить точки данных с помощью ENN. В imblearn это называется SMOTEENN.

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

Этот метод привел к немного более экстремальной границе решения с дальнейшим падением точности и более низким баллом F1.

Пользовательский сэмпл + Smote

Для наших данных SMOTE, кажется, помогает, но, возможно, мы можем быть немного более целенаправленными, с какими точками данных мы хотим передискретизировать. Один из подходов, который мы можем использовать, — это использовать простой классификатор K ближайших соседей и выбирать только те точки данных, у которых есть соседи, также принадлежащие к нашему классу по умолчанию, с некоторым порогом вероятности.

После этого у нас теперь есть следующий набор данных — мы уменьшаем наш класс по умолчанию с 24 до 10 (но, надеюсь, избавляемся от зашумленных точек данных, которые могут выбрасывать отключать наши процессы SMOTE и создавать слишком агрессивные интерполяции).

Выполнение SMOTE (с использованием того же кода, что и на предыдущих этапах) приводит к следующему набору обучающих данных — созданию 350 образцов класса по умолчанию из наших исходных 10:

Мы обучаем еще одну новую модель логистической регрессии и, используя эти данные с повторной выборкой, достигаем наших целей! Мы можем видеть, что граница решения теперь учитывает этот карман значений по умолчанию после обучения на нашем скорректированные данные. Точность по-прежнему составляет 90%+, а оценка F1 выше нашей цели в 50%.

Краткое содержание

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

Все примеры и файлы доступны на Github.

Первоначально опубликовано на https://datastud.dev.