Условие
Как работать с сильно несбалансированными классами (например, 1% позитивов в задаче фрод-детекции)? Опишите подходы — от препроцессинга до выбора метрики.
Решение
Подход
1. Правильно выбирать метрику. Accuracy на дисбалансе бесполезен (99% — это «всегда негатив»). Используйте PR-AUC, F1 по позитивному классу, recall@precision.
2. Изменить веса в loss.
class_weight='balanced'в sklearn — простой и часто достаточный приём.- В
LogisticRegression,RandomForest,LightGBM— параметрclass_weight/scale_pos_weight.
3. Ресэмплинг.
- Oversampling позитивов — простой repeat или SMOTE/ADASYN (генерация синтетических соседей).
- Undersampling негативов — выкидываем часть негативов. Быстро, но теряем информацию.
- Гибрид — oversample позитивов до X%, undersample негативов до Y%.
4. Калибровка вероятностей.
После ресэмплинга предсказанные вероятности смещены — отдают слишком высокую P(+). Используйте CalibratedClassifierCV или сдвиг через Platt scaling.
5. Подбор порога. Дефолтный 0.5 для несбалансированных задач почти всегда неоптимален. Подбирайте порог по PR-кривой под бизнес-ограничение (например, precision ≥ 0.9).
from sklearn.linear_model import LogisticRegression
from imblearn.over_sampling import SMOTE
from imblearn.pipeline import Pipeline
pipe = Pipeline([
("sm", SMOTE(random_state=0)),
("clf", LogisticRegression(class_weight="balanced")),
])Подводные камни
- SMOTE по категориальным признакам не работает «как есть» — нужен
SMOTENCили encoding до SMOTE. Иначе получаются дробные значения у категорий. - Ресэмплинг применяется только на train, никогда на val/test. Иначе утечка и завышенная метрика.
- Калибровка после oversample — обязательна для задач, где важна именно вероятность (рисковое моделирование, ценообразование).
- На бизнес-уровне иногда правильнее не балансировать классы, а изменить функцию потерь под асимметричные стоимости ошибок (cost-sensitive learning).
Эталонный ответ
Не доверяйте accuracy: смотрите PR-AUC и метрики по позитивному классу. Включайте class_weight='balanced' или SMOTE на train. После ресэмплинга — калибровка вероятностей и подбор порога по бизнес-ограничению.