← Назад к вопросам
Как подобрать гиперпараметры для градиентного бустинга?
2.3 Middle🔥 181 комментариев
#Машинное обучение
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI23 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Как подобрать гиперпараметры для градиентного бустинга?
Подбор гиперпараметров — критический этап, который часто определяет успех модели. Существует несколько стратегий, от простых до продвинутых.
Два подхода: Sequential vs Grid Search
Sequential (рекомендуется):
- Сначала фиксируем базовые параметры
- Подбираем параметры регуляризации
- Затем оптимизируем learning rate
- Финально настраиваем дерево
Этот подход экономит время и часто дает лучше результаты, чем 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)