Мошенничество, отток, дефолты, поломки оборудования: почти все реальные задачи классификации несбалансированы. Вопрос «что вы делаете при дисбалансе» проверяет, не бросаетесь ли вы сразу в SMOTE.
Сначала метрика и порог
Многие модели (бустинг, логрегрессия) нормально учатся на данных 1:99. Проблема обычно в оценке: accuracy и порог 0.5. Первые шаги:
- метрика: PR-AUC, recall при фиксированной precision или доле тревог, precision в топ-N;
- порог по стоимости ошибок и ёмкости проверки;
- стратифицированное разбиение;
- валидация и тест с реальным распределением классов, ведь precision и PR-AUC от него зависят.
Веса классов
class_weight="balanced" умножает потерю объектов класса c на n / (K·n_c). При 1 000 объектах и 50 положительных вес положительных 10, отрицательных около 0.53. Граница сдвигается в пользу редкого класса, но вероятности перестают быть откалиброванными.
Семплирование
- Oversampling: повторить объекты редкого класса.
- Undersampling: выбросить часть частого. Полезен на огромных данных, чтобы ускорить обучение.
- SMOTE: синтетическая точка на отрезке между объектом редкого класса и его соседом того же класса. Плохо работает с категориями, высокой размерностью и перекрытием классов.
Главное правило: семплирование только на трейне внутри фолда (imblearn Pipeline). SMOTE до кросс-валидации создаёт почти копии валидационных объектов в трейне, и recall «вырастает» с 0.4 до 0.9.
Калибровка
Калибровка важна, когда вероятность используется как число: ожидаемые потери, ставки, ценообразование.
Проверка: калибровочная кривая (средняя предсказанная вероятность против доли положительных в бинах), ECE, Brier score, log loss.
Что ломает калибровку: веса классов, семплирование, бустинг с большим числом деревьев, переуверенные нейросети, случайный лес (вероятности сжаты к середине).
Как чинить на отложенной выборке с реальным балансом:
- Platt scaling: сигмоида поверх скора, хорош при малых данных;
- Isotonic regression: монотонная ступенчатая функция, гибче, нужна большая выборка;
- Temperature scaling для нейросетей: делим логиты на одно число.
Все методы монотонны и не меняют AUC.
Поправка на приор
Если из отрицательных оставили долю β, шансы положительного класса завышены в 1/β раз. Поправка:
p' = β·p / (β·p + 1 - p)
При β = 0.1 вероятность 0.5 на самом деле около 0.09.
Focal loss
В детекции объектов огромное число лёгких фоновых примеров. Focal loss умножает кросс-энтропию на (1 - p)^γ, и уверенно верные примеры почти не влияют на градиент. В табличных задачах обычно хватает весов классов.
Частые ошибки
- Начинать с SMOTE до 50:50.
- Делать семплирование до разбиения.
- Считать precision на сбалансированной валидации.
- Использовать вероятности после undersampling без поправки.
Что спросят на собесе
- Ваша стратегия при дисбалансе от метрики до порога.
- Как работают веса классов и SMOTE, где утечка при SMOTE.
- Что такое калибровка, как проверить и исправить.
- Как поправить вероятности после undersampling.