Руководство по эффективной работе с несбалансированными наборами данных в 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 различных методов работы с несбалансированными наборами данных:
- Изменить метрику производительности
- Измените алгоритм
- Превышение выборки класса меньшинства
- Класс неполного большинства
- Создавать синтетические образцы
Похоже, что для этого конкретного набора данных случайный лес и SMOTE являются одними из лучших вариантов, которые мы здесь пробовали.
Это лишь некоторые из множества возможных методов, которые можно попробовать при работе с несбалансированными наборами данных, и не исчерпывающий список. Некоторые другие методы, которые следует учитывать, - это сбор дополнительных данных или выбор других коэффициентов передискретизации - вам не обязательно иметь соотношение точно 1: 1!
Вы всегда должны пробовать несколько подходов, а затем решать, какой из них лучше всего подходит для вашей проблемы.