О несбалансированных наборах данных
Недавно я наткнулся на некоторые интересные результаты, используя classification_report
от scikit-learn.
precision recall f1-score support 0 0.86 0.52 0.65 83 1 0.88 0.98 0.92 287 accuracy 0.87 370 macro avg 0.87 0.75 0.78 370 weighted avg 0.87 0.87 0.86 370 Confusion Matrix: [[ 43 40] [ 7 280]]
Результаты показывают своеобразную разницу между макро и средневзвешенными результатами для отзыва (и, как следствие, f1); средневзвешенное значение немного выше (0,86 против 0,78). Это связано с несбалансированностью набора данных. Столбец support
показывает количество образцов в каждом классе, 0
и 1
соответственно. Образцы, относящиеся к классу 1
, составляют около 77% образцов. Учитывая этот относительный дисбаланс между двумя классами, модель могла бы преуспеть, просто предположив, что все образцы в классе 1
принадлежат классу 0
.
Мы можем увидеть это более четко на более экстремальном примере, любезно предоставленном Переполнением стека.
precision recall f1-score support 0 1.00 1.00 1.00 28432 1 0.02 0.02 0.02 49 accuracy 1.00 28481 macro avg 0.51 0.51 0.51 28481 weighted avg 1.00 1.00 1.00 28481
Здесь класс 0
доминирует примерно в 99,8% всех образцов. С таким несбалансированным набором данных модель всегда должна предсказывать любое событие, принадлежащее к классу большинства.
Макро Среднее
Именно об этом говорит нам расхождение между макроэкономическими и средневзвешенными значениями. Среднее значение макроса равномерно умножает оценку каждого класса на 1/n
, где n
— это количество прогнозируемых классов, и складывает их вместе. Так как модель выполняет бинарную классификацию, это просто1/2
. Если мы рассмотрим оценки F1 для моего набора данных выше, 0,65 и 0,92 для классов 0
и 1
:
Средневзвешенное
Не плохо. Однако вместо этого средневзвешенное значение умножает оценку каждого класса на взвешенный процент, который каждый класс принимает в выборке. Поэтому вместо 1/n
мы умножим на samples in class n/total samples
, где n
снова будет числом предсказанных классов.
Рассмотрим еще раз результаты моего набора данных F1 вместе с количеством образцов в каждом классе, 83 и 287.
Вот как мы приходим к нашему макро и средневзвешенному значению.
Как мы здесь оказались?
На практике постоянно встречаются несбалансированные наборы данных. Особенно с учетом того, что мы часто хотим предсказать редкие или экстремальные выбросы. Рассмотрите возможность выявления рака кожи по фотографиям пациентов. Если предположить отсутствие предвзятости в отношении того, кто отправляет свои фотографии, вполне вероятно, что на большинстве фотографий не будет признаков рака кожи. Истинный положительный случай, фактически имеющий рак кожи, может иметь место в одном из каждых пяти случаев. В других приложениях могут быть гораздо более редкие события с коэффициентом 1000:1 или выше. Должны ли мы проводить выборку таким образом, чтобы каждому классу присваивался одинаковый вес? Или мы должны обучить модель пропорции, которую она, скорее всего, увидит в реальном мире?
Как мы должны подходить к этому?
Нет, мы не должны не делить классы 1:1. Вместо этого мы должны задать вопрос: Правильно ли представлен класс меньшинства?. Конкретно для моего набора данных, в реальном мире члены класса 1
обычно составляют 77% населения? Если так, отлично! Мы тестируем и тренируемся на реальных популяциях. Повторная балансировка обучающих данных негативно повлияет на нашу модель, поскольку большинство классификаторов предполагают, что прогнозы следуют … тому же распределению, что и обучающие данные».
Кроме того, мы должны проверить, достаточно ли у нас данных, чтобы правильно представить этот класс меньшинства. Очевидно, что одного члена класса меньшинства недостаточно. Имеет 10? Скорее всего нет. 100? Может быть. А 10000? Сейчас мы говорим! Возможно, нам нужно больше данных. Сообщается, что жадные до данных модели, такие как классификаторы случайного леса, должны иметь размеры выборки, которые в 200 раз превышают количество признаков. В моем наборе данных 1536 объектов, поэтому мои 370 событий далеки от целевого количества в 307 200 (для обоих классов).
Наконец, мы должны рассмотреть возможность настройки порога предсказания модели. Большинство моделей предполагают порог 50%. Например, если модель уверена более чем на 50%, она поместит событие в определенный класс. Но, возможно, мы можем настроить это значение так, чтобы оно соответствовало нашему контексту. Отличный пример — с погодными паттернами. Ни один метеоролог не говорит, будет лить или не лить. Вместо этого они дают вероятность того, что событие произойдет. Может быть, это поможет в этом случае.
Другой вероятный момент оптимизации заключается в разработке функций. Возможно, эти функции не очень важны для начала. Я еще не совсем уверен, но я продолжу экспериментировать и, возможно, вернусь, чтобы обновить этот пост тем, что работает хорошо. Я точно знаю, что мне нужно больше образцов, так что это первое дело.
В машинном обучении у вас есть данные, которые у вас есть. Повторная балансировка включает в себя удаление событий из класса большинства или репликацию событий из класса меньшинства. Это либо удаляет информацию, либо не предоставляет новой информации. В тех случаях, когда мы рассматриваем возможность репликации данных, нам следует вместо этого рассмотреть возможность создания и маркировки дополнительных событий для увеличения численности меньшинства.
Дополнительное чтение
Обе статьи были связаны выше, но, чтобы быть точным, я настоятельно рекомендую:
- Пост Гейба Верзино Почему балансировка классов чрезмерно раскручена и его цитаты. Это отличный обзор проблемы и того, как недостаточная и избыточная выборка вряд ли являются проблемой.
- В книге Фостера Провоста Машинное обучение на несбалансированных наборах данных 101 приводится краткий аргумент против повышающей или понижающей выборки, и вместо этого основное внимание уделяется настройке пороговых значений, добавлению новых данных и выбору репрезентативных выборок.
Спасибо за прочтение!
Эта и другие статьи доступны бесплатно на сайте seandeaton.com и на Medium. Вопросы или комментарии? Общаемся в LinkedIn!