О несбалансированных наборах данных

Недавно я наткнулся на некоторые интересные результаты, используя 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%, она поместит событие в определенный класс. Но, возможно, мы можем настроить это значение так, чтобы оно соответствовало нашему контексту. Отличный пример — с погодными паттернами. Ни один метеоролог не говорит, будет лить или не лить. Вместо этого они дают вероятность того, что событие произойдет. Может быть, это поможет в этом случае.

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

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

Дополнительное чтение

Обе статьи были связаны выше, но, чтобы быть точным, я настоятельно рекомендую:

Спасибо за прочтение!

Эта и другие статьи доступны бесплатно на сайте seandeaton.com и на Medium. Вопросы или комментарии? Общаемся в LinkedIn!