CatBoost
CatBoost — разработанная Яндексом библиотека градиентного бустинга с открытым исходным кодом: она кодирует категориальные признаки с помощью упорядоченной целевой статистики и строит симметричные деревья.
CatBoost — библиотека с открытым исходным кодом для градиентного бустинга на деревьях решений, разработанная Yandex и выпущенная в 2017 году. Её название происходит от «категориального бустинга»: библиотека принимает категориальные столбцы, например город, идентификатор товара или тип устройства, в виде обычных строк и преобразует их в числа внутри себя, поэтому перед обучением табличным данным не требуется ручное кодирование one-hot или целевое кодирование. Две идеи из статьи на NeurIPS 2018 — упорядоченная статистика целевых значений и упорядоченный бустинг — не позволяют использовать метку самой обучающей строки при вычислении чисел для неё. Эта утечка смещает как обычное целевое кодирование, так и стандартный бустинг. CatBoost работает на CPU и GPU, предоставляет интерфейсы Python, R и командной строки, а также поддерживает классификацию, регрессию и ранжирование.
Как CatBoost кодирует категориальные признаки#
При one-hot-кодировании для каждой категории создаётся отдельный столбец, что становится неудобным для признаков с тысячами значений, например идентификаторов продавцов или пользователей. Целевое кодирование заменяет каждую категорию средним значением метки её строк. Это компактно, но приводит к утечке ответа: метка строки входит в число, которое её описывает, поэтому модель усваивает короткий путь, не работающий на новых данных. Это разновидность утечки данных, проявляющаяся как переобучение; сильнее всего она затрагивает редкие категории.
Упорядоченная статистика целевых значений CatBoost решает эту проблему с помощью случайной перестановки обучающих строк. Категория каждой строки кодируется только по меткам строк, которые стоят перед ней в перестановке; результат сглаживается в сторону априорного значения, поэтому ни одна строка не использует собственную метку. CatBoost повторяет эту процедуру для нескольких перестановок, выполняет one-hot-кодирование признаков с очень малым числом уникальных значений и жадно строит новые признаки — комбинации категориальных признаков, например сочетание города и типа устройства.
В пакете CatBoost для Python категориальные столбцы передаются по имени через cat_features. В этом примере каждому из 50 тарифных планов присваивается собственная скрытая доля оттока, после чего проверяется, сможет ли модель восстановить эти значения по исходным названиям планов:
import numpy as np
import pandas as pd
from catboost import CatBoostClassifier
# Synthetic churn data: each of 50 plans has its own hidden churn rate
rng = np.random.default_rng(0)
rates = rng.uniform(0.05, 0.6, size=50)
plan_ids = rng.integers(0, 50, size=5000)
X = pd.DataFrame({"plan": [f"plan_{i}" for i in plan_ids], "tenure_months": rng.integers(1, 60, size=5000)})
y = rng.random(5000) < rates[plan_ids]
# Raw strings go in directly; CatBoost encodes them with ordered target statistics
model = CatBoostClassifier(iterations=200, depth=4, verbose=0, random_seed=0)
model.fit(X, y, cat_features=["plan"])
# Compare true and predicted churn for the safest and riskiest plans
lo, hi = rates.argmin(), rates.argmax()
probe = pd.DataFrame({"plan": [f"plan_{lo}", f"plan_{hi}"], "tenure_months": [30, 30]})
print("True churn rates: ", rates[[lo, hi]].round(2))
print("Predicted churn rates:", model.predict_proba(probe)[:, 1].round(2))Скрипт выводит истинные доли 0.05 и 0.60 и предсказанные доли 0.06 и 0.59. Модель восстановила долю оттока для каждого плана по исходному строковому столбцу, используя всего около 100 обучающих строк на план.
Упорядоченный бустинг и симметричные деревья#
В стандартном градиентном бустинге цели новых деревьев — градиенты функции потерь — вычисляются на тех же строках, на которых обучались предыдущие деревья. Это смещает градиенты; авторы CatBoost называют этот эффект сдвигом предсказаний. Упорядоченный бустинг снова применяет трюк с перестановкой: градиент для каждой строки вычисляется моделью, обученной только на более ранних строках перестановки. Это параметр обучения boosting_type="Ordered", который обычно повышает качество на небольших наборах данных за счёт скорости. На CPU по умолчанию используется классическая схема "Plain", а при обучении на GPU для наборов данных размером до 50 000 строк по умолчанию используется "Ordered", кроме режима многоклассовой классификации.
По умолчанию CatBoost строит симметричные, или неупорядоченные, деревья, в которых все узлы на одной глубине используют одно и то же условие разбиения. Поэтому дерево глубины 6 — значение по умолчанию — состоит всего из шести проверок «да/нет», ответы на которые образуют 6-битный индекс одного из 64 листьев. Это ускоряет предсказания и ограничивает сложность каждого дерева, выполняя роль регуляризации. Параметр grow_policy переключает построение деревьев на уровнях или по листьям, если набору данных нужны менее ограниченные деревья.
Примеры применения в реальных условиях#
- Кредитный риск: кредиторы объединяют категориальные данные о заявителе — например, профессию, регион и цель кредита — с числовыми показателями дохода и долга, чтобы предсказать дефолт, не применяя one-hot-кодирование к сотням кодов профессий.
- Ранжирование и рекомендации: CatBoost предоставляет функции потерь для ранжирования, например YetiRank, которые позволяют упорядочивать результаты поиска или товары по прогнозируемой релевантности на основе признаков пользователя, объекта и контекста в рекомендательной системе.
- Оценка стоимости недвижимости: детектор YOLO26, обученный на пользовательских данных, может подсчитывать такие удобства, как бассейны или солнечные панели, на фотографиях объявлений. Эти подсчёты добавляются в модель цен CatBoost как числовые столбцы наряду с категориальными признаками, например районом и типом недвижимости.
CatBoost в сравнении с XGBoost и LightGBM#
Все три библиотеки последовательно строят ансамбль деревьев, каждое из которых исправляет ошибки предыдущих; этим они отличаются от случайного леса, деревья которого обучаются независимо друг от друга.
- XGBoost: по умолчанию строит деревья по уровням и добавляет в целевую функцию регуляризацию L1 и L2. Встроенная поддержка категориальных признаков появилась в более поздних версиях, но многие конвейеры по-прежнему кодируют категории перед обучением.
- LightGBM: строит деревья по листьям, разделяя тот лист, который сильнее всего уменьшает функцию потерь, и разбивает признаки на гистограммные интервалы, что ускоряет работу на больших наборах данных. Также библиотека напрямую принимает категориальные столбцы, закодированные целыми числами.
- CatBoost: строит симметричные деревья, кодирует категории с помощью упорядоченной статистики целевых значений и показывает хорошие результаты без настройки гиперпараметров. По умолчанию используются 1 000 деревьев глубины 6, а скорость обучения автоматически выбирается по числу итераций для функций потерь log loss, многоклассовой классификации и RMSE.










