Руководство по эффективной работе с несбалансированными наборами данных в Python

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

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

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

Данные

Мы будем использовать Набор данных обнаружения мошенничества с кредитными картами, доступный на Kaggle. Набор данных сильно несбалансирован: только 0,17% транзакций классифицируются как мошеннические. Полную записную книжку можно найти здесь.

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

Проблема несбалансированных классов

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

Проблема с точностью

Здесь мы можем использовать DummyClassifier, чтобы всегда предсказывать «не мошенничество», просто чтобы показать, насколько ошибочной может быть точность.

Мы получили оценку точности 99,8% - и даже без обучения модели! Давайте сравним это с логистической регрессией, настоящим обученным классификатором.

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

Давайте рассмотрим некоторые популярные методы борьбы с дисбалансом классов.

1. Измените показатель эффективности.

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

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

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

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

2. Измените алгоритм

Хотя в каждой задаче машинного обучения хорошее практическое правило - пробовать различные алгоритмы, это может быть особенно полезно при несбалансированных наборах данных. Деревья решений часто хорошо работают с несбалансированными данными. Они работают, изучая иерархию вопросов if / else, и это может заставить работать оба класса.

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

3. Методы повторной выборки - класс меньшинства с передискретизацией

Наш следующий метод начинает нашу технику передискретизации.

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

Мы будем использовать модуль повторной выборки из Scikit-Learn для случайной репликации образцов из класса меньшинства.

Важное примечание

Всегда разделяйте на тестовые и обучающие наборы, ПРЕЖДЕ чем пробовать методы передискретизации! Передискретизация перед разделением данных может позволить одни и те же наблюдения присутствовать как в тестовом, так и в обучающем наборе. Это может позволить нашей модели просто запоминать определенные точки данных и вызвать переоснащение и плохое обобщение тестовых данных.

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

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

4. Методы повторной выборки - класс большинства с неполной выборкой

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

Мы снова будем использовать модуль передискретизации из Scikit-Learn, чтобы случайным образом удалить образцы из большинства классов.

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

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

5. Создайте синтетические образцы.

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

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

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

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

Заключение

Мы изучили 5 различных методов работы с несбалансированными наборами данных:

  1. Изменить метрику производительности
  2. Измените алгоритм
  3. Превышение выборки класса меньшинства
  4. Класс неполного большинства
  5. Создавать синтетические образцы

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

Это лишь некоторые из множества возможных методов, которые можно попробовать при работе с несбалансированными наборами данных, и не исчерпывающий список. Некоторые другие методы, которые следует учитывать, - это сбор дополнительных данных или выбор других коэффициентов передискретизации - вам не обязательно иметь соотношение точно 1: 1!

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