Ответ
В CatBoost я настраиваю регуляризацию через комбинацию гиперпараметров, чтобы контролировать переобучение и улучшать обобщающую способность модели.
Основные методы регуляризации в CatBoost:
-
Регуляризация весов листьев (
l2_leaf_reg):- Это L2-регуляризация (по умолчанию = 3). Штрафует большие значения в листьях деревьев.
- Увеличение этого параметра делает модель более консервативной.
-
Ограничение сложности деревьев:
depth: Максимальная глубина дерева (по умолчанию 6).min_data_in_leaf: Минимальное количество объектов в листе.
-
Стохастическое бустирование:
subsample: Доля случайно выбираемых объектов для построения каждого дерева (например, 0.8).colsample_bylevel: Доля случайно выбираемых признаков на каждом уровне (разделении) дерева.
-
Ранняя остановка (
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 эта вся регуляризация — это как раз тот самый спасательный круг, когда модель начинает вести себя как истеричка на шопинге и покупает всё подряд, то есть переобучается по самое не балуйся. Надо её взять за жабры и успокоить.
Основные рычаги, за которые надо дёргать:
-
Штраф за жирные листья (
l2_leaf_reg):- Это типа как L2-регуляризация, только для деревьев. По умолчанию стоит 3. Если её увеличить, модель становится более скромной и осторожной, перестаёт выёживаться с какими-то запредельными значениями в листьях. Просто штрафует за слишком большие числа — и всё, элементарно.
-
Чтобы дерево не уходило в запой (
depthиmin_data_in_leaf):depth— это максимальная глубина. Ну, понятное дело, если дать дереву волю, оно докопается до каждой отдельной точки в данных, а потом будет на них залипать. Ограничиваем, пусть 5-6 будет, не больше.min_data_in_leaf— это минимальное количество объектов в листе. Чтобы не получалось листьев, где сидит один чувак и охуевает от одиночества. Нельзя, чтобы в листе было меньше, скажем, 10 объектов.
-
Метод "всем сестрам по серьгам" (
subsampleиcolsample_bylevel):subsample— берём не все данные для обучения каждого дерева, а только какую-то долю, например 0.8. Каждое дерево учится на своём случайном подмножестве, и модель в целом меньше залипает на шумах.colsample_bylevel— аналогично, но для признаков. На каждом уровне (разделении) дерева берём не все фичи, а только случайную часть. Это как заставить модель не фокусироваться на одном-двух мощных признаках, а смотреть пошире.
-
Стоп-кран (
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 сам по себе хитрая жопа — у него по умолчанию включено упорядоченное бустирование. Это такая его фишка, которая из коробки помогает бороться с переобучением, особенно когда в данных полно категориальных признаков. Оно там градиенты хитро считает, чтобы не подглядывать в будущее. В общем, доверия к нему в этом плане больше, чем к другим, но расслабляться всё равно нельзя.