БустингиCatBoost

CatBoost

Ordered boosting устраняет target leakage — каждое дерево обучается только на «прошлых» точках случайной перестановки. Нативная поддержка категориальных признаков без ручного encoding.

Интерактивная визуализация

Наблюдайте как ordered encoding и симметричные деревья работают на каждом шаге

Задача
РегрессияКлассиф.

Датасет


Деревьев10
Learning rate0.30
Глубина дерева2
Регуляризация λ3.0
Вычисляю...
Шаг 0 / 0

Числовой пример

Таблица первых 6 точек с ordered и naive encoding, остатками и предсказаниями.

Идея алгоритма

Как ordered boosting устраняет target leakage и почему симметричные деревья быстрые

🏫

Аналогия из жизни

⚠️ Наивный подход (с утечкой)

Преподаватель проверяет сочинения и выводит «средний балл по теме» — включая само это сочинение. Студент знает, что его оценка влияет на среднее, которым его же и оценивают. Это накручивает результат.

✓ Ordered подход (CatBoost)

Студентов рассадили в случайном порядке. Оценка каждого считается как среднее только тех, кто сдал раньше него в этой же очереди. Первый студент получает «пустой» ориентир (глобальное среднее) — и это честно.

CatBoost делает то же самое: для каждой итерации генерируется случайная перестановка σ, и каждая точка кодируется через среднее предшественников в σ, а не через всё множество. Никакой утечки целевой переменной.

Три ключевые идеи

Ordered Boosting

На каждой итерации генерируется перестановка σ. Дерево для точки σ(i) обучается только на {σ(1)...σ(i-1)} — никакой утечки целевой переменной.

Ordered Encoding

Категория кодируется через среднее y только «прошлых» точек в σ. Первая точка получает глобальное среднее (prior). Честно, без циклической зависимости.

Oblivious Trees

Симметричные деревья: все узлы одного уровня используют один порог. Предсказание — просто поиск листа по d бинарным вопросам. Быстро и регулярно.

Почему это важно: prediction shift

В стандартном бустинге точка i используется и для обучения дерева h_m, и для вычисления резидуала, на котором h_m обучается. Это создаёт «самоссылку» — модель видит свои же ошибки и «читерит». CatBoost разрывает этот круг через перестановку.

// Ordered encoding: для σ(k)
enc[σ(k)] = (Σ_{j<k, cat_j=cat} y_j + w·mean(y)) / (count + w)
// Точка σ(k) не знает своё y при вычислении enc[σ(k)]

CatBoost vs LightGBM vs Gradient Boosting

КритерийGBMLightGBMCatBoost
Категориальные признакиРучной encodingРучной encoding✅ Встроенный ordered
Структура дереваСимметричное / асим.Leaf-wise (асим.)Oblivious (симм.)
Target leakage⚠️ Возможен⚠️ Возможен✅ Устранён ordered
Скорость обученияМедленный✅ БыстрыйСредний
Защита от overfittingСредняяСредняя✅ Высокая

Bias и Variance

CatBoost использует ordered boosting: каждое дерево обучается на подмножестве «прошлых» точек перестановки. Это действует как встроенная регуляризация — variance растёт медленнее, чем у стандартного бустинга, потому что каждое дерево видит меньше точек и меньше «подгоняется» под шум.

Оборотная сторона: bias снижается чуть медленнее, чем у LightGBM с leaf-wise ростом. Зато оптимум по n_estimators шире — модель менее чувствительна к точному количеству деревьев, что удобно в продакшне.

ОшибкаЧисло итераций (n_estimators) →широкийоптимумBias²VarianceTotal Error

Ordered boosting удерживает variance низким — кривая Total Error имеет широкое плато. Это означает, что CatBoost менее чувствителен к переобучению при большом числе деревьев.

ПараметрBiasVarianceРекомендация
depth ↑↓ снижает↑ повышаетНачни с 4, увеличивай осторожно
learning_rate ↑↓ снижает↑ повышаетМалый lr + больше деревьев = стабильнее
lambda ↑↑ повышает↓ снижаетЯвная регуляризация листьев; default=3
n_estimators ↑↓ снижает~ медленноOrdered boosting замедляет рост variance
Практический совет: depth=6 + learning_rate=0.03 + lambda=3 + много деревьев. CatBoost с ordered boosting значительно терпимее к большому числу итераций, чем GBM или LightGBM.

Плюсы

  • +Встроенная поддержка категориальных признаков — не нужен label encoding или one-hot
  • +Ordered boosting предотвращает target leakage и снижает variance
  • +Симметричные деревья ускоряют inference: O(2^d) предсказание без обхода дерева
  • +Хорошие дефолты — CatBoost работает «из коробки» с минимальной настройкой
  • +Устойчив к большому числу деревьев — оптимум широкий, переобучение медленное

Минусы

  • Медленнее LightGBM в обучении из-за пересчёта permutation на каждой итерации
  • Симметричные деревья менее гибки, чем leaf-wise — иногда нужна большая глубина
  • При высокой кардинальности категорий (тысячи значений) encoding может быть нестабильным
  • Ordered boosting требует дополнительной памяти для хранения permutatoin статистик

Математика

Ordered encoding, симметричные деревья и L2-регуляризация листьев

Ordered target encoding для категориального признака:

x^σ(k)(cat)=j<k,catj=catyj+wyˉ{j<k:catj=cat}+w\hat{x}^{(cat)}_{\sigma(k)} = \frac{\displaystyle\sum_{j<k,\,\text{cat}_j=\text{cat}} y_j + w \cdot \bar{y}}{\displaystyle\left|\{j<k:\text{cat}_j=\text{cat}\}\right| + w}

Предсказание симметричного дерева глубины d:

hm(x)=ωb,b==1d1[xf>t]21h_m(x) = \omega_b, \quad b = \sum_{\ell=1}^{d} \mathbf{1}[x_{f_\ell} > t_\ell] \cdot 2^{\ell-1}

Значение листа (L2-регуляризованное):

ωb=ileafbrileafb+λ\omega_b = \frac{\displaystyle\sum_{i \in \text{leaf}_b} r_i}{|\text{leaf}_b| + \lambda}

Правило обновления (как в GBM):

Fm(x)=Fm1(x)+ηhm(x)F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)

Обозначения — наведи мышкой для объяснения:

σ\sigma
σ(k)\sigma(k)
ww
yˉ\bar{y}
f,tf_\ell, t_\ell
bb
ωb\omega_b
λ\lambda
rir_i
η\eta

Псевдокод

Вход: D = {(x_i, cat_i, y_i)}, η, M, depth, λ, w# датасет и параметры
F₀ ← mean(y)# начальное предсказание

для m = 1..M:# основной цикл бустинга
σ_m ← random_permutation(n, seed=m)# новая перестановка каждый раз
enc ← orderedTargetEncode(cat, y, σ_m, w)# честный encoding без leakage
r_i ← y_i − F_{m−1}(x_i) для каждого i# псевдо-остатки
T_m ← buildObliviousTree([x, enc], r, depth, λ)# симметричное дерево
листья: ω_b ← Σ_{i∈leaf_b} r_i / (|leaf_b| + λ)# L2-регуляризованные значения
F_m(x) ← F_{m−1}(x) + η · T_m(x)# обновление ансамбля

вернуть F_M# итоговый ансамбль

Ключевое отличие от GBM: на каждом шаге m генерируется новая перестановка σ_m и для неё пересчитывается ordered encoding. Это предотвращает накопление bias от leakage.

Разбор вручную

5 домов, 3 раунда, η=0.3, λ=3, prior_weight=1.0 — считаем каждый шаг с ordered encoding.

Датасет. У нас 5 домов с двумя признаками: числовая площадь и категориальный район (A или B).

iплощадьрайонцена (y)
150A3.2
280B4.5
360A3.5
4100B5.8
570A4

Шаг 1 — начальное предсказание F₀. Как и в GBM, стартуем с константы — среднего целевой переменной:

F₀ = mean(y) = (3.2 + 4.5 + 3.5 + 5.8 + 4.0) / 5 = 4.2

Шаг 2 — проблема с категориями. Категориальный признак «район» нельзя передать в дерево напрямую. Нужен числовой encoding. Наивный способ — среднее y по всем точкам с тем же районом:

Район A: mean = (3.2 + 3.5 + 4.0) / 3 = 3.567 ← включает y самой точки!
Район B: mean = (4.5 + 5.8) / 2 = 5.15 ← то же самое

Это target leakage: encoding точки 4 (B, y=5.8) зависит от самой цены 5.8. Дерево "видит будущее" — оно обучается предсказывать то, что уже зашито в признаки. CatBoost решает это через ordered encoding.

Итог

Что важно запомнить

Ключевые выводы

  • 1Ordered Target Encoding устраняет target leakage: enc для σ(k) вычисляется только по точкам σ(0)..σ(k-1) — точка не «видит» своё y
  • 2Ordered Boosting разрывает prediction shift: дерево для σ(k) обучается на подмножестве без σ(k), что даёт несмещённую оценку ошибки
  • 3Oblivious (симметричные) деревья: на каждом уровне один split для всех узлов — регуляризация встроена в структуру, inference = d сравнений + table lookup
  • 4λ в формуле листа контролирует L2-регуляризацию: чем больше λ, тем ближе к нулю значения листьев и тем медленнее снижается bias
  • 5CatBoost автоматически обрабатывает категориальные признаки — не нужно вручную делать One-Hot или Label Encoding перед обучением

Когда использовать CatBoost

СитуацияРекомендация
Датасет с категориальными признаками✅ CatBoost — встроенный честный encoding
Небольшой датасет (<50K строк)✅ Ordered boosting уменьшает variance
Нужна скорость inference✅ Oblivious trees = d сравнений + lookup
Очень большой датасет (>1M строк)⚠️ LightGBM быстрее обучается
Только числовые признаки⚠️ Преимущество CatBoost менее выражено
LightGBM