Ответ
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)
Вот и весь базовый набор. Главное — не бросаться сразу всё крутить. Начни с дефолтных значений, потом меняй по одному параметру и смотри, что происходит. А то можно так закрутить, что модель станет хитрожопой и бесполезной. Удачи, экспериментируй!