Как использовать модель бустинга в случае дисбаланса классов?

«Как использовать модель бустинга в случае дисбаланса классов?» — вопрос из категории Деревья и ансамбли, который задают на 26% собеседований Data Scientist / ML Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

При работе с дисбалансированными данными в градиентном бустинге (XGBoost, LightGBM, CatBoost) применяют несколько подходов:

1. Встроенные параметры для учета дисбаланса:

  • XGBoost: scale_pos_weight — устанавливает вес для положительного класса. Эмпирическое правило: scale_pos_weight = количество_негативных / количество_позитивных.
    import xgboost as xgb
    model = xgb.XGBClassifier(scale_pos_weight=10, eval_metric='logloss')
  • LightGBM: is_unbalance=True или явное задание class_weight.
    import lightgbm as lgb
    model = lgb.LGBMClassifier(is_unbalance=True)
  • CatBoost: auto_class_weights='Balanced' или class_weights.

2. Выбор корректных метрик: Использовать F1-score, Precision-Recall AUC, Average Precision вместо Accuracy. В кросс-валидации применять StratifiedKFold.

3. Стратегии сэмплирования:

  • Внешние: SMOTE, ADASYN (применяются до обучения).
  • Внутренние (встроенные в бустер): настройка subsample, colsample_bytree для балансировки входящих данных на каждом дереве.

4. Фокус-параметры: В XGBoost max_delta_step помогает стабилизировать обучение при сильном дисбалансе, ограничивая шаг обновления весов.

Важно: Всегда оценивать качество на отдельном тестовом наборе, сохраняющем исходное распределение классов.