Как регуляризуется CatBoost?

Ответ

В CatBoost я настраиваю регуляризацию через комбинацию гиперпараметров, чтобы контролировать переобучение и улучшать обобщающую способность модели.

Основные методы регуляризации в CatBoost:

  1. Регуляризация весов листьев (l2_leaf_reg):

    • Это L2-регуляризация (по умолчанию = 3). Штрафует большие значения в листьях деревьев.
    • Увеличение этого параметра делает модель более консервативной.
  2. Ограничение сложности деревьев:

    • depth: Максимальная глубина дерева (по умолчанию 6).
    • min_data_in_leaf: Минимальное количество объектов в листе.
  3. Стохастическое бустирование:

    • subsample: Доля случайно выбираемых объектов для построения каждого дерева (например, 0.8).
    • colsample_bylevel: Доля случайно выбираемых признаков на каждом уровне (разделении) дерева.
  4. Ранняя остановка (early_stopping_rounds):

    • Обучение автоматически останавливается, если качество на валидационной выборке не улучшается заданное число итераций.

Пример конфигурации с регуляризацией:

from catboost import CatBoostClassifier

model = CatBoostClassifier(
    iterations=1000,
    learning_rate=0.05,
    depth=5,                     # Ограничиваем глубину
    l2_leaf_reg=5,               # Усиливаем L2-регуляризацию
    subsample=0.8,               # Берём 80% данных для каждого дерева
    colsample_bylevel=0.8,       # Берём 80% признаков на каждом уровне
    random_strength=1,           # Добавляем случайность при выборе разделений
    verbose=100
)

# Обучение с ранней остановкой
model.fit(
    X_train, y_train,
    eval_set=(X_val, y_val),
    early_stopping_rounds=50,    # Остановка, если 50 итераций без улучшения
    use_best_model=True
)

Также CatBoost по умолчанию использует упорядоченное бустирование, которое само по себе снижает переобучение за счёт специального механизма обработки категориальных признаков и вычисления градиентов.

Ответ 18+ 🔞

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

Основные рычаги, за которые надо дёргать:

  1. Штраф за жирные листья (l2_leaf_reg):

    • Это типа как L2-регуляризация, только для деревьев. По умолчанию стоит 3. Если её увеличить, модель становится более скромной и осторожной, перестаёт выёживаться с какими-то запредельными значениями в листьях. Просто штрафует за слишком большие числа — и всё, элементарно.
  2. Чтобы дерево не уходило в запой (depth и min_data_in_leaf):

    • depth — это максимальная глубина. Ну, понятное дело, если дать дереву волю, оно докопается до каждой отдельной точки в данных, а потом будет на них залипать. Ограничиваем, пусть 5-6 будет, не больше.
    • min_data_in_leaf — это минимальное количество объектов в листе. Чтобы не получалось листьев, где сидит один чувак и охуевает от одиночества. Нельзя, чтобы в листе было меньше, скажем, 10 объектов.
  3. Метод "всем сестрам по серьгам" (subsample и colsample_bylevel):

    • subsample — берём не все данные для обучения каждого дерева, а только какую-то долю, например 0.8. Каждое дерево учится на своём случайном подмножестве, и модель в целом меньше залипает на шумах.
    • colsample_bylevel — аналогично, но для признаков. На каждом уровне (разделении) дерева берём не все фичи, а только случайную часть. Это как заставить модель не фокусироваться на одном-двух мощных признаках, а смотреть пошире.
  4. Стоп-кран (early_stopping_rounds):

    • Это вообще святое. Ты говоришь: "Слушай, если на отложенной выборке качество 50 итераций подряд не растёт — всё, закругляйся, не позорься". И модель послушно останавливается, не дожидаясь, пока её performance на валидации накроется медным тазом от переобучения.

Вот как это выглядит в коде, когда ты всё это собираешь в кучу:

from catboost import CatBoostClassifier

model = CatBoostClassifier(
    iterations=1000,          # Максимум итераций, но до них может не дойти
    learning_rate=0.05,       # Не гони коней, учись не торопясь
    depth=5,                  # Глубоко не копай, а то чертей найдёшь
    l2_leaf_reg=5,            # Штрафуй жирные листья посильнее
    subsample=0.8,            # Каждому дереву — 80% данных, и не ной
    colsample_bylevel=0.8,    # И признаков на каждом шаге только 80%
    random_strength=1,        # Немного хаоса в выбор split'ов не помешает
    verbose=100               # Чтобы раз в 100 итераций отчитывался, что не сдох
)

# Самое важное — обучение со стоп-краном
model.fit(
    X_train, y_train,
    eval_set=(X_val, y_val),      # Смотри сюда, умник, здесь тебя будут проверять
    early_stopping_rounds=50,     # 50 раз без улучшения — и свободен
    use_best_model=True           # Сохрани ту версию себя, где ты был лучшим, а не последним
)

И да, не забывай, что CatBoost сам по себе хитрая жопа — у него по умолчанию включено упорядоченное бустирование. Это такая его фишка, которая из коробки помогает бороться с переобучением, особенно когда в данных полно категориальных признаков. Оно там градиенты хитро считает, чтобы не подглядывать в будущее. В общем, доверия к нему в этом плане больше, чем к другим, но расслабляться всё равно нельзя.