Новости и статьи об искусственном интеллекте и нейросетях. Мы собираем и обрабатываем самую актуальную информацию из мира AI. О проекте

Статьи

7 приёмов XGBoost для точных предсказаний

Ансамбли XGBoost доминируют на табличных данных благодаря точности и скорости. Семь приёмов на Python улучшают модели: настройка learning_rate с n_estimators, ограничение max_depth, subsample, регуляризация, раннее останавливание, GridSearchCV и scale_pos_weight для дисбаланса. Примеры даны на датасете Breast Cancer из scikit-learn.

20 февраля 2026 г.
4 мин
17
7 приёмов XGBoost для более точных предсказательных моделей

Введение

Методы ансамблирования вроде 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 --upgrade

6. Поиск оптимальных гиперпараметров

Систематический поиск гиперпараметров находит лучшие комбинации для максимальной производительности. Пример с сеточным поиском по трём ключевым параметрам:

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-библиотеку. Грамотная подстройка скорости обучения, глубины деревьев, семплирования, регуляризации и весов классов вместе с поиском гиперпараметров превращает обычную модель в высокоэффективную.

Горячее

Загружаем популярные статьи...