← Назад к вопросам

Как подобрать гиперпараметры к градиентному бустингу?

2.2 Middle🔥 172 комментариев
#Машинное обучение

Комментарии (2)

🐱
claude-haiku-4.5PrepBro AI29 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Как подобрать гиперпараметры к градиентному бустингу?

Стратегия подбора гиперпараметров

Подбор гиперпараметров для градиентного бустинга (XGBoost, LightGBM, CatBoost) — итеративный процесс. Важно понимать, как каждый параметр влияет на модель.

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

1. Параметры контроля сложности (Regularization)

params = {
    'max_depth': 5,
    'min_child_weight': 1,
    'gamma': 0,
    'lambda': 1,
    'alpha': 0,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
}

2. Параметры скорости обучения (Learning Rate)

params = {
    'learning_rate': 0.1,
    'n_estimators': 100,
}

Обратная зависимость: низкий learning_rate требует больше деревьев.

Процесс подбора: пошаговый подход

Шаг 1: Базовые параметры

Начните с консервативных значений:

from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score

base_params = {
    'learning_rate': 0.1,
    'max_depth': 5,
    'subsample': 0.8,
    'colsample_bytree': 0.8,
    'random_state': 42,
}

model = XGBClassifier(**base_params, n_estimators=100)
cv_scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
print(f'CV AUC: {cv_scores.mean():.4f}')

Шаг 2: Поиск оптимальной глубины

depths = range(3, 10)
best_depth = 5
best_score = 0

for depth in depths:
    params = {
        'learning_rate': 0.1,
        'max_depth': depth,
        'subsample': 0.8,
        'colsample_bytree': 0.8,
        'random_state': 42,
    }
    model = XGBClassifier(**params, n_estimators=100)
    scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
    
    if scores.mean() > best_score:
        best_score = scores.mean()
        best_depth = depth
    
    print(f'Depth={depth}: AUC={scores.mean():.4f}')

Шаг 3: Подбор learning_rate и n_estimators

from sklearn.model_selection import GridSearchCV

param_grid = {
    'learning_rate': [0.001, 0.01, 0.1, 0.3],
    'n_estimators': [100, 200, 500, 1000],
}

grid = GridSearchCV(
    XGBClassifier(max_depth=5, subsample=0.8, colsample_bytree=0.8),
    param_grid,
    cv=5,
    scoring='roc_auc',
    n_jobs=-1,
)

grid.fit(X_train, y_train)
print(f'Best params: {grid.best_params_}')

Шаг 4: Регуляризация (subsample, colsample)

param_grid = {
    'subsample': [0.6, 0.7, 0.8, 0.9],
    'colsample_bytree': [0.6, 0.7, 0.8, 0.9],
}

Шаг 5: Тонкая настройка (lambda, alpha, gamma)

param_grid = {
    'lambda': [0.1, 0.5, 1, 2, 5],
    'alpha': [0, 0.1, 0.5, 1],
    'gamma': [0, 0.1, 0.5, 1],
}

Рекомендации для разных фреймворков

XGBoost:

  • max_depth: 5-8
  • learning_rate: 0.01-0.1
  • subsample, colsample: 0.7-0.9

LightGBM:

  • num_leaves: 20-40
  • learning_rate: 0.01-0.1
  • feature_fraction: 0.8-0.9
from lightgbm import LGBMClassifier

lgb_params = {
    'num_leaves': 31,
    'learning_rate': 0.05,
    'feature_fraction': 0.8,
    'bagging_fraction': 0.8,
}

CatBoost:

  • depth: 4-10
  • learning_rate: 0.01-0.1
  • l2_leaf_reg: 1-10
from catboost import CatBoostClassifier

cat_params = {
    'depth': 6,
    'learning_rate': 0.05,
    'l2_leaf_reg': 3,
    'iterations': 100,
}

Автоматический подбор с Optuna

import optuna

def objective(trial):
    params = {
        'learning_rate': trial.suggest_float('learning_rate', 0.001, 0.3),
        'max_depth': trial.suggest_int('max_depth', 3, 10),
        'subsample': trial.suggest_float('subsample', 0.6, 0.9),
        'colsample_bytree': trial.suggest_float('colsample_bytree', 0.6, 0.9),
    }
    
    model = XGBClassifier(**params, n_estimators=100)
    scores = cross_val_score(model, X_train, y_train, cv=5, scoring='roc_auc')
    return scores.mean()

study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100, n_jobs=-1)
print(f'Best params: {study.best_params}')

Практические советы

  1. Используйте cross-validation — минимум 5-fold CV
  2. Ранняя остановка спасает время — останавливайте, если нет улучшений 50 итераций
  3. Начните простым — не усложняйте сразу все параметры
  4. Логируйте результаты — ведите таблицу экспериментов
  5. Не переусложняйте — малое улучшение качества часто не стоит потери простоты

Ошибки, которых нужно избежать

  • Подбор на тестовом наборе (data leakage)
  • Переобучение на валидационном наборе
  • Игнорирование ранней остановки
  • Не балансирование между bias и variance

Итого

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