Какие ключевые гиперпараметры CatBoost вы знаете?

Ответ

CatBoost имеет множество гиперпараметров для тонкой настройки. Вот основные, с которыми я чаще всего работаю:

Основные гиперпараметры:

  • iterations (n_estimators в sklearn-стиле): Количество деревьев в ансамбле. По умолчанию 1000.
  • learning_rate: Темп обучения. Меньшие значения (0.01-0.1) обычно требуют больше итераций, но могут улучшить обобщающую способность.
  • depth: Максимальная глубина деревьев. Контролирует сложность модели. По умолчанию 6.
  • l2_leaf_reg: Коэффициент L2-регуляризации. Помогает бороться с переобучением.
  • random_strength: Сила рандомизации при выборе разбиений. Полезен для увеличения разнообразия деревьев.
  • border_count (max_bin): Количество границ для квантования числовых признаков. Большее значение может повысить точность, но замедлит обучение.
  • loss_function: Функция потерь. Для классификации — Logloss, CrossEntropy. Для регрессии — RMSE, MAE, Quantile.
  • cat_features: Список индексов или имен категориальных признаков. Ключевая особенность CatBoost — он эффективно обрабатывает их без предварительного кодирования.
  • early_stopping_rounds: Количество раундов без улучшения метрики на отложенной выборке для остановки обучения.

Пример настройки для задачи бинарной классификации:

from catboost import CatBoostClassifier, Pool

# Создаем пул данных с указанием категориальных признаков
train_pool = Pool(X_train, y_train, cat_features=['category1', 'category2'])
eval_pool = Pool(X_val, y_val, cat_features=['category1', 'category2'])

model = CatBoostClassifier(
    iterations=2000,
    learning_rate=0.05,
    depth=8,
    l2_leaf_reg=4,
    random_strength=0.5,
    border_count=128,
    loss_function='Logloss',
    early_stopping_rounds=50,
    verbose=100
)

model.fit(train_pool, eval_set=eval_pool)

Ответ 18+ 🔞

А, CatBoost, говоришь? Ну, это, блядь, как крутой таз с наворотами — можно просто сунуть туда всё, что есть, а можно и покрутить ручки, чтобы он не жрал бензина дохуя и не гонял как угорелый вхолостую. Слушай, вот тебе основные прибамбасы, с которыми обычно и танцуют.

Главные крутилки-настройки:

  • iterations (а в мире sklearn это n_estimators): Сколько деревьев насажать. По дефолту — тыща. Думаешь, чем больше, тем лучше? Не всегда, чувак. Можно и пересажать, тогда лес будет как мартышлюшка — шумный и дурацкий.
  • learning_rate: Скорость обучения. Если поставить маленькую (типа 0.01), то модель будет учиться медленно, но, возможно, умнее. Это как с водкой — если пить по стопочке, дольше продержишься, но и до состояния "ёпта" дольше идти. Нужно больше итераций.
  • depth: Насколько глубоко каждое дерево может залезть в твои данные. Глубже — сложнее модель, больше шансов найти все твои косяки и на них переобучиться. По умолчанию 6 — вроде норм.
  • l2_leaf_reg: Это такой наш сдерживающий фактор, регуляризация. Чтоб модель не выёбывалась и не считала себя самой умной. Помогает от переобучения, реально.
  • random_strength: Сила рандома. Добавляет немного хаоса при выборе, где дерево будет разветвляться. Это чтобы все деревья в ансамбле не были как близнецы-братья, а немного отличались. Разнообразие — сила.
  • border_count (он же max_bin): На сколько кусков резать числовые признаки перед тем, как их анализировать. Больше — точнее, но и медленнее. Тут уже смотри по своим ресурсам.
  • loss_function: Функция потерь, она же "критерий, по которому мы понимаем, что накосячили". Для "угадай-ка 0 или 1" (классификация) — Logloss или CrossEntropy. Для "предскажи цену" (регрессия) — RMSE, MAE и другие радости.
  • cat_features: А вот это, блядь, фишка CatBoost'а, его конёк! Ты просто говоришь ему: "Смотри, вот эти колонки — категориальные, там текстовые значения". И он сам, ёпта, с ними разбирается, без всякого One-Hot Encoding'а. Вообще красота.
  • early_stopping_rounds: Мой любимый стоп-кран. Если модель на отложенных данных (eval set) уже 50 раундов подряд не улучшается, она говорит "да похуй" и прекращает учиться. Экономит кучу времени и не дает делать лишние итерации.

Вот тебе пример, как это может выглядеть в коде, если ты хочешь отличить котиков от собачек:

from catboost import CatBoostClassifier, Pool

# Готовим данные, явно указывая, где категориальные признаки
train_pool = Pool(X_train, y_train, cat_features=['category1', 'category2'])
eval_pool = Pool(X_val, y_val, cat_features=['category1', 'category2'])

model = CatBoostClassifier(
    iterations=2000,        # Давай попробуем 2000 деревьев
    learning_rate=0.05,     # Со средней скоростью
    depth=8,                # Чуть поглубже, чем по умолчанию
    l2_leaf_reg=4,          # Чтоб не выёбывалась
    random_strength=0.5,    # Немного рандома для разнообразия
    border_count=128,       # Покусочнее порежем числа
    loss_function='Logloss', # Логистическая функция потерь
    early_stopping_rounds=50, # Если 50 раундов без улучшений — закругляемся
    verbose=100              # Выводи инфу каждые 100 итераций, чтобы не скучать
)

model.fit(train_pool, eval_set=eval_pool)

Вот и весь базовый набор. Главное — не бросаться сразу всё крутить. Начни с дефолтных значений, потом меняй по одному параметру и смотри, что происходит. А то можно так закрутить, что модель станет хитрожопой и бесполезной. Удачи, экспериментируй!