
Введение
Методы ансамблирования вроде XGBoost (Extreme Gradient Boosting) — это мощные варианты градиентного бустинга на деревьях решений. Они собирают несколько слабых моделей в одну мощную для предсказаний. Такие ансамбли популярны из-за высокой точности, скорости и успеха на структурированных табличных данных. Библиотека scikit-learn не имеет встроенной реализации XGBoost, но отдельная библиотека XGBoost предлагает API, совместимый с ней.
Достаточно импортировать так:
from xgboost import XGBClassifierДалее приведены семь приёмов на Python, чтобы лучше использовать эту библиотеку, особенно для создания точных моделей предсказаний.
Для демонстрации приёмов возьмём датасет Breast Cancer из scikit-learn и базовую модель с параметрами по умолчанию. Сначала выполните этот код:
import numpy as np
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split, GridSearchCV
from sklearn.metrics import accuracy_score
from xgboost import XGBClassifier
# Data
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, random_state=42
)
# Baseline model
model = XGBClassifier(eval_metric="logloss", random_state=42)
model.fit(X_train, y_train)
print("Baseline accuracy:", accuracy_score(y_test, model.predict(X_test)))1. Настройка скорости обучения и числа деревьев
Хотя правило не всегда работает, снижение скорости обучения при росте числа деревьев в ансамбле XGBoost обычно повышает точность. Низкая скорость даёт модели возможность учиться постепенно, а дополнительные деревья покрывают меньшие шаги.
Вот пример. Запустите и сравните точность с базовой:
model = XGBClassifier(
learning_rate=0.01,
n_estimators=5000,
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)
print("Model accuracy:", accuracy_score(y_test, model.predict(X_test)))В следующих примерах опустим финальный print(). Добавьте его сами для проверки.
2. Ограничение максимальной глубины деревьев
Параметр max_depth, унаследованный от обычных деревьев решений, определяет максимальную глубину каждого дерева в ансамбле. Ограничение глубины кажется простым, но неглубокие деревья часто лучше обобщают данные.
В этом примере глубина не превышает 2:
model = XGBClassifier(
max_depth=2,
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)3. Снижение переобучения за счёт подвыборки
Параметр subsample случайным образом берёт долю обучающих данных (например, 80%) для роста каждого дерева. Этот подход служит хорошей регуляризацией и борется с переобучением.
По умолчанию значение 1.0 — все 100% данных:
model = XGBClassifier(
subsample=0.8,
colsample_bytree=0.8,
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)Метод эффективен на наборах данных среднего размера. На маленьких данных сильная подвыборка может вызвать недообучение.
4. Введение регуляризации
Для дополнительного контроля переобучения сложные деревья штрафуют с помощью L1 (Lasso) и L2 (Ridge). В XGBoost это параметры reg_alpha и reg_lambda.
model = XGBClassifier(
reg_alpha=0.2, # L1
reg_lambda=0.5, # L2
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)5. Применение раннего останавливания
Раннее останавливание останавливает обучение, когда качество на валидационной выборке перестаёт расти за заданное число итераций. Это экономит ресурсы.
В зависимости от среды и версии XGBoost может потребоваться обновление. Укажите early_stopping_rounds при создании модели, а не в fit().
model = XGBClassifier(
n_estimators=1000,
learning_rate=0.05,
eval_metric="logloss",
early_stopping_rounds=20,
random_state=42
)
model.fit(
X_train, y_train,
eval_set=[(X_test, y_test)],
verbose=False
)Для обновления библиотеки выполните:
!pip uninstall -y xgboost
!pip install xgboost --upgrade6. Поиск оптимальных гиперпараметров
Систематический поиск гиперпараметров находит лучшие комбинации для максимальной производительности. Пример с сеточным поиском по трём ключевым параметрам:
param_grid = {
"max_depth": [3, 4, 5],
"learning_rate": [0.01, 0.05, 0.1],
"n_estimators": [200, 500]
}
grid = GridSearchCV(
XGBClassifier(eval_metric="logloss", random_state=42),
param_grid,
cv=3,
scoring="accuracy"
)
grid.fit(X_train, y_train)
print("Best params:", grid.best_params_)
best_model = XGBClassifier(
**grid.best_params_,
eval_metric="logloss",
random_state=42
)
best_model.fit(X_train, y_train)
print("Tuned accuracy:", accuracy_score(y_test, best_model.predict(X_test)))7. Коррекция дисбаланса классов
Этот приём полезен для наборов с сильным дисбалансом классов (датасет Breast Cancer сбалансирован, изменения будут малы). Параметр scale_pos_weight помогает при соотношениях вроде 90/10 или 99/1.
Вычисление и применение на основе обучающих данных:
ratio = np.sum(y_train == 0) / np.sum(y_train == 1)
model = XGBClassifier(
scale_pos_weight=ratio,
eval_metric="logloss",
random_state=42
)
model.fit(X_train, y_train)Итоги
Мы разобрали семь полезных приёмов для усиления моделей ансамблей XGBoost через её Python-библиотеку. Грамотная подстройка скорости обучения, глубины деревьев, семплирования, регуляризации и весов классов вместе с поиском гиперпараметров превращает обычную модель в высокоэффективную.