Собесов

Сценарий ML: XGBoost vs LightGBM vs CatBoost

ML / Data ScienceBoosting и ensembleСредняяSenior

Условие

Сравните XGBoost, LightGBM, CatBoost: как растят деревья, как работают с категориями, когда какую выбрать.

Решение

Подход

XGBoost LightGBM CatBoost
Tree growth level-wise (по умолч.) или leaf-wise (grow_policy) leaf-wise symmetric (oblivious)
Категории one-hot или label вручную native (Fisher's method) native (target enc с ordering)
Скорость средняя самый быстрый средняя
Память средняя low (histogram-based) высокая
Overfit на малых n средний склонен к overfit (leaf-wise) устойчив
Sparsity sparse-aware sparse-aware хуже
Ranking да да да

Level-wise vs leaf-wise

  • Level-wise: все листья текущего уровня расширяются вместе. Балансирует дерево, медленнее.
  • Leaf-wise (LightGBM): расширяем лист с максимальным gain. Быстрее сходится, но deeper unbalanced trees → overfit на малых n.

Категории

XGBoost: до 1.5 — только number. Сейчас поддерживает natively через enable_categorical=True (но рекомендуется label encoding).

LightGBM: использует Fisher's method — оптимальное двойное разделение категорий по сортировке по target mean.

CatBoost: ordered target statistics — для каждой записи target encoding считается только по предыдущим (в случайной перестановке) записям → нет leakage.

# Symmetric (oblivious) tree CatBoost
# Все splits на одном уровне = одна и та же фича и threshold
# Быстрый inference, регуляризованный

Когда что

  • CatBoost: много категорий с высокой cardinality, нужна robustness, малый dataset.
  • LightGBM: много данных (> 1M строк), важна скорость, large p, готовы тюнить leaf-wise параметры.
  • XGBoost: общий случай, нужна стабильность, надёжность; production proven; экосистема (XGBRanker и т.д.).

Гиперпараметры

# LightGBM
{'num_leaves': 31, 'max_depth': -1, 'learning_rate': 0.05,
 'min_data_in_leaf': 100, 'feature_fraction': 0.8}
 
# XGBoost
{'max_depth': 6, 'learning_rate': 0.05, 'subsample': 0.8,
 'colsample_bytree': 0.8, 'min_child_weight': 5}
 
# CatBoost
{'iterations': 1000, 'depth': 6, 'learning_rate': 0.05,
 'cat_features': cat_cols, 'l2_leaf_reg': 3}

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

  1. LightGBM с leaf-wise на малой выборке (< 10k) → переобучение. Ограничивайте num_leaves и min_data_in_leaf.
  2. CatBoost target stats требуют ordering перед запуском — если данные не shuffled, target stats biased.
  3. XGBoost с enable_categorical=True пока экспериментален; на проде безопаснее label encoding.
  4. GPU XGBoost vs CPU LightGBM: на больших данных GPU XGB быстрее, но при наличии CPU кластера LightGBM выигрывает.
  5. Все три не любят high-cardinality categorical с rare categories — нужен grouping / target encoding до подачи.

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

XGBoost — level-wise, надёжный baseline. LightGBM — leaf-wise + histogram, самый быстрый на больших данных, склонен к overfit на малых. CatBoost — symmetric trees + ordered target stats, robust к категориям. Выбор: CatBoost для категорий, LightGBM для скорости, XGBoost как стабильный default.

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

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

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