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

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

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

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

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

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

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

Подбор гиперпараметров — критический этап, который часто определяет успех модели. Существует несколько стратегий, от простых до продвинутых.

Два подхода: Sequential vs Grid Search

Sequential (рекомендуется):

  1. Сначала фиксируем базовые параметры
  2. Подбираем параметры регуляризации
  3. Затем оптимизируем learning rate
  4. Финально настраиваем дерево

Этот подход экономит время и часто дает лучше результаты, чем random search.

Пошаговая процедура

Шаг 1: Базовые параметры (10-15 минут)

from xgboost import XGBClassifier
from sklearn.model_selection import cross_val_score

# Стартовая конфигурация
model = XGBClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=6,
    min_child_weight=1,
    subsample=1,
    colsample_bytree=1,
    random_state=42,
    tree_method=hist  # быстрее
)

# Оцениваем baseline
scores = cross_val_score(model, X_train, y_train, cv=5, scoring=auc)
print(f"Baseline AUC: {scores.mean():.3f}")

Шаг 2: max_depth и min_child_weight (регуляризация)

from sklearn.model_selection import GridSearchCV

# Сетка параметров
param_grid = {
    max_depth: [3, 5, 7, 9],
    min_child_weight: [1, 3, 5, 7]
}

base_model = XGBClassifier(
    n_estimators=100,
    learning_rate=0.1,
    subsample=0.8,
    colsample_bytree=0.8,
    random_state=42
)

grid_search = GridSearchCV(
    base_model,
    param_grid,
    cv=5,
    scoring=auc,
    n_jobs=-1,
    verbose=1
)

grid_search.fit(X_train, y_train)
print(f"Best params: {grid_search.best_params_}")
print(f"Best AUC: {grid_search.best_score_:.3f}")

Шаг 3: subsample и colsample_bytree (sampling)

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

best_model = XGBClassifier(
    n_estimators=100,
    learning_rate=0.1,
    max_depth=best_depth,  # из шага 2
    min_child_weight=best_child_weight,
    random_state=42
)

grid_search = GridSearchCV(best_model, param_grid, cv=5, scoring=auc, n_jobs=-1)
grid_search.fit(X_train, y_train)

Шаг 4: learning_rate и n_estimators

# Уменьшаем learning_rate, компенсируя деревьями
param_grid = {
    learning_rate: [0.001, 0.01, 0.05, 0.1],
    n_estimators: [200, 500, 1000, 2000]
}

best_model = XGBClassifier(
    max_depth=best_depth,
    min_child_weight=best_child_weight,
    subsample=best_subsample,
    colsample_bytree=best_colsample,
    random_state=42
)

# Рекомендуемое правило: при learning_rate /= 10 увеличиваем n_estimators в ~3 раза

Продвинутый метод: Bayesian Optimization

from optuna import create_study
from optuna.pruners import TrialPruner

def objective(trial):
    param = {
        max_depth: trial.suggest_int(max_depth, 3, 10),
        learning_rate: trial.suggest_float(learning_rate, 0.001, 0.3, log=True),
        subsample: trial.suggest_float(subsample, 0.5, 1.0),
        colsample_bytree: trial.suggest_float(colsample_bytree, 0.5, 1.0),
        min_child_weight: trial.suggest_int(min_child_weight, 1, 10),
        n_estimators: trial.suggest_int(n_estimators, 100, 1000)
    }
    
    model = XGBClassifier(**param, random_state=42)
    scores = cross_val_score(model, X_train, y_train, cv=5, scoring=auc)
    return scores.mean()

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

Важные хитрости

Вычисление оптимального n_estimators:

from xgboost import cv

# Используем early stopping
xgb_cv = cv(
    {max_depth: 5, learning_rate: 0.1, n_estimators: 500},
    dtrain,
    num_boost_round=1000,
    early_stopping_rounds=50,
    metrics=auc,
    as_pandas=True
)

optimal_n = xgb_cv.shape[0]
print(f"Optimal n_estimators: {optimal_n}")

Feature importance для отбора признаков:

importances = model.feature_importances_
# Удали слабые признаки (< 1% от суммы)
strong_features = X_train.columns[importances > importances.sum() * 0.01]

Быстрый чеклист

  • ✓ Начни с кросс-валидацией (как минимум 5-fold)
  • ✓ Используй early stopping для поиска n_estimators
  • ✓ Регуляризация (max_depth, min_child_weight) важнее, чем learning_rate
  • ✓ Уменьши learning_rate для более стабильной модели
  • ✓ Для большых датасетов используй LightGBM вместо XGBoost
  • ✓ Проверяй переобучение на hold-out set
  • ✓ Сохраняй best model, не финальный

Время рекомендации

Если у тебя есть 30 минут: используй GridSearchCV с 2-3 параметрами Если час: Sequential подход с 4 шагами Если много времени: Bayesian Optimization (Optuna)

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