Собесов

alexeygrigorev/data-science-interviews: дисбаланс классов

Статистика и теорверML на практикеСредняяMiddle

Условие

Как работать с сильно несбалансированными классами (например, 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")),
])

Подводные камни

  1. SMOTE по категориальным признакам не работает «как есть» — нужен SMOTENC или encoding до SMOTE. Иначе получаются дробные значения у категорий.
  2. Ресэмплинг применяется только на train, никогда на val/test. Иначе утечка и завышенная метрика.
  3. Калибровка после oversample — обязательна для задач, где важна именно вероятность (рисковое моделирование, ценообразование).
  4. На бизнес-уровне иногда правильнее не балансировать классы, а изменить функцию потерь под асимметричные стоимости ошибок (cost-sensitive learning).

Эталонный ответ

Не доверяйте accuracy: смотрите PR-AUC и метрики по позитивному классу. Включайте class_weight='balanced' или SMOTE на train. После ресэмплинга — калибровка вероятностей и подбор порога по бизнес-ограничению.

Хочешь увидеть разбор?

Зарегистрируйся бесплатно — откроется развёрнутое решение этой задачи и ещё 4 на выбор.

Зарегистрироваться и увидеть разбор
Уже есть аккаунт? Войти