Условие
Сравните 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}Подводные камни
- LightGBM с leaf-wise на малой выборке (< 10k) → переобучение. Ограничивайте
num_leavesиmin_data_in_leaf. - CatBoost target stats требуют ordering перед запуском — если данные не shuffled, target stats biased.
- XGBoost с
enable_categorical=Trueпока экспериментален; на проде безопаснее label encoding. - GPU XGBoost vs CPU LightGBM: на больших данных GPU XGB быстрее, но при наличии CPU кластера LightGBM выигрывает.
- Все три не любят 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.