Какой лосс использовать при дисбалансе классов
Что проверяют
Понимаете ли вы, что дисбаланс лечится не одним «правильным лоссом», а связкой: функция потерь, метрика и порог. Следом почти всегда спрашивают, чем вы будете мерить результат и что станет с вероятностями после взвешивания.
Как отвечать
Начните с базы, затем переходите к специальным вариантам:
- взвешенная кросс-энтропия: редкий класс получает больший вес в лоссе. В PyTorch это
nn.CrossEntropyLoss(weight=...)илиnn.BCEWithLogitsLoss(pos_weight=...), в scikit-learnclass_weight="balanced", в градиентном бустингеscale_pos_weight. Вес часто берут обратно пропорциональным частоте класса, но это стартовая точка, а не закон; - focal loss:
FL = -α_t (1 - p_t)^γ log(p_t). Множитель(1 - p_t)^γгасит вклад лёгких примеров, которых большинство, и модель учится на трудных. Пришёл из детекции объектов, типичный стартγ = 2,α = 0.25. Готовые реализации:torchvision.ops.sigmoid_focal_loss,BinaryFocalCrossentropyв Keras; - Dice и Tversky: для сегментации, где пикселей фона на порядки больше. Tversky с параметрами α и β отдельно штрафует ложные срабатывания и пропуски;
- class-balanced loss: веса по «эффективному числу примеров», полезны при длинном хвосте из сотен классов.
Затем скажите, что лосс не единственный рычаг. Порог 0.5 при дисбалансе почти никогда не оптимален, его подбирают на валидации под цель задачи. Мерить нужно PR-AUC, F1 или recall при фиксированной precision, а не accuracy. Альтернативы лоссу: андерсэмплинг, оверсэмплинг, SMOTE, но только на обучающей выборке.
Где спотыкаются
Отчитываются accuracy. При 1% положительных модель, которая всегда отвечает «нет», получает 99% и ничего не умеет.
Забывают, что после взвешивания или focal loss предсказанные вероятности смещаются. Если вероятности нужны сами по себе, например для оценки риска, модель придётся калибровать: CalibratedClassifierCV, изотоническая регрессия или Platt scaling.
Делают оверсэмплинг или SMOTE до разбиения на train и test. Копии редких примеров попадают в обе части, и метрика на тесте оказывается завышенной.