Какие деревья предпочтительнее использовать в алгоритмах бустинга (Boosting)?

Ответ

В бустинге (Gradient Boosting, XGBoost, LightGBM, CatBoost) в качестве базовых алгоритмов (weak learners) почти исключительно используются неглубокие решающие деревья.

Почему именно они?

  • Слабость (High Bias): Бустинг строет сильную модель, последовательно исправляя ошибки предыдущих. Если базовые деревья будут слишком сложными (глубокими), они начнут переобучаться (запоминать шум) с первого шага, и ансамблю будет нечего исправлять.
  • Скорость: Неглубокие деревья строятся и предсказывают очень быстро, что критично, так как бустинг строит сотни или тысячи таких деревьев.
  • Интерпретируемость: Совокупность простых правил (глубиной 3-6) часто проще для анализа, чем одно глубокое дерево.

Типичные параметры для деревьев в бустинге (на примере XGBoost):

import xgboost as xgb

params = {
    'max_depth': 4,          # Небольшая глубина (обычно 3-8)
    'min_child_weight': 5,   # Минимальный вес в листе для борьбы с переобучением
    'learning_rate': 0.1,    # Темп обучения (shrinkage) для контроля вклада каждого дерева
    'subsample': 0.8,        # Доля данных для обучения каждого дерева (stochastic boosting)
    'colsample_bytree': 0.8, # Доля признаков для каждого дерева
}
model = xgb.XGBRegressor(**params)

Современные вариации:

  • LightGBM использует деревья, растущие leaf-wise (а не level-wise), что часто эффективнее, и применяет гистограммный метод для ускорения поиска лучшего разбиения.
  • CatBoost эффективно работает с категориальными признаками без предобработки, используя упорядоченное бустирование для борьбы со смещением.

Ответ 18+ 🔞

Давай разберем эту тему, а то народ иногда думает, что в бустинге какие-то хитрые нейронки зашиты. Нихуя подобного, всё гениальное — просто, как тапок.

Слушай сюда, весь секрет в том, что эти алгоритмы — XGBoost, LightGBM, CatBoost — строят свою мощь на простых, неглубоких решающих деревьях. Не на каких-то там монстрах, а на таких, которые сам от себя охуеешь, насколько они тупые по отдельности.

А почему именно они, эти куцые деревца?

  • Они должны быть слабыми, ёпта! Вся фишка бустинга — это как тренировать команду. Если ты сразу возьмёшь какого-нибудь перекачанного качка (глубокое дерево), который уже всё знает и везде лезет, то его уже не переучишь. Он будет упорно повторять свои косяки. А нам нужны такие "слабые ученики", которые хоть и туповаты (высокое смещение), но их ошибки можно последовательно исправлять следующими такими же простаками. Вместе они — сила, ебать копать.
  • Скорость, детка! Представь, тебе нужно построить не одно дерево, а, блять, тысячу. Если каждое будет глубоким, с кучей условий, то обучение растянется на неделю. А эти неглубокие ребята строятся за секунды, что и позволяет накрутить их овердохуища.
  • Чтобы можно было понять, что происходит. Попробуй осмыслить одно дерево глубиной в 20 условий — голова взорвётся. А когда у тебя ансамбль из сотен правил вроде "если возраст < 30 и доход > 100к, то +0.05", это хоть как-то укладывается в голове. Не то чтобы прям легко, но терпимо.

Вот как это примерно выглядит в коде, смотри:

import xgboost as xgb

params = {
    'max_depth': 4,          # Глубина дерева — небольшая, чтобы не переобучалось
    'min_child_weight': 5,   # Минимальный вес в листе — чтоб не плодить херню на шуме
    'learning_rate': 0.1,    # Темп обучения, он же шаг — чтобы каждое новое дерево не ломилось как слон, а вносило мелкий вклад
    'subsample': 0.8,        # Берем 80% данных для каждого дерева — добавляем случайности, как в лесах
    'colsample_bytree': 0.8, # И только 80% признаков — ещё больше случайности против переобучения
}
model = xgb.XGBRegressor(**params)

А теперь про современные фишки, тут вообще весело:

  • LightGBM — это такой хитрожопый оптимизатор. Вместо того чтобы строить дерево уровень за уровнем (level-wise), он растёт "листьями" (leaf-wise). Находит самый перспективный лист и splits его, что часто эффективнее. Плюс использует гистограммы — группирует значения признаков в корзины, чтобы не перебирать каждую точку. Скорость взлетает просто пиздец.
  • CatBoost — это отдельная песня для работы с категориальными признаками. Он их не кодирует вручную, а работает нативно. Главная его фишка — "упорядоченное бустирование", чтобы избежать "утечки" целевой переменной при обработке категориалок. Если коротко — он хитрожопо перемешивает данные, чтобы модель не подглядывала в будущее. Доверия к таким моделям, блядь, больше.

Короче, вся мощь не в сложности одного алгоритма, а в том, как грамотно и быстро ты упаковываешь кучу простых правил в один невероятно точный ансамбль. Вот и вся магия, ебушки-воробушки.