Градиентный бустинг с xgboost
Настраивайте параметры xgboost, раннюю остановку и расписания скорости обучения
«Градиентный бустинг с xgboost» — бесплатный урок R Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения R Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс R Academy содержит 4 уроков всего.
Что такое градиентный бустинг?
Градиентный бустинг последовательно строит ансамбль. Каждое новое дерево исправляет остаточные ошибки предыдущего ансамбля, обучаясь по отрицательному градиенту функции потерь. В отличие от случайных лесов, где деревья строятся параллельно, бустинг строит их по одному, и каждое дерево учится на ошибках предыдущего.
library(xgboost)
# XGBoost expects data in a special matrix format
# We'll build a simple example step by step
cat('XGBoost version:', packageVersion('xgboost'))
# Key concept: each tree reduces the ensemble error
# Final prediction = sum of all tree predictionsxgb.DMatrix()
xgb.DMatrix(data, label) — это оптимизированный внутренний формат данных XGBoost. Он хранит матрицу признаков и вектор меток вместе, обеспечивая быстрые вычисления с эффективным использованием памяти. Перед обучением всегда преобразуйте данные в DMatrix.
library(xgboost)
library(MASS)
X_train <- as.matrix(Boston[1:400, -14]) # features
y_train <- Boston[1:400, 14] # medv (target)
X_test <- as.matrix(Boston[401:506, -14])
y_test <- Boston[401:506, 14]
dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest <- xgb.DMatrix(data = X_test, label = y_test)
cat('DMatrix rows:', nrow(dtrain))xgboost() — базовое обучение
xgboost(data, nrounds, eta, max_depth, objective) обучает модель. Основные параметры: eta (скорость обучения, меньшее значение делает модель устойчивее, но замедляет обучение), max_depth (глубина дерева, определяющая сложность модели) и nrounds (количество деревьев).
params <- list(
objective = 'reg:squarederror',
eta = 0.1, # learning rate
max_depth = 6, # tree depth
subsample = 0.8, # row subsampling
colsample_bytree = 0.8 # column subsampling
)
set.seed(42)
model <- xgboost(
data = dtrain,
params = params,
nrounds = 100,
verbose = 0
)
cat('Model trained with', model$niter, 'rounds')Watchlist — мониторинг потерь на проверочных данных
Аргумент watchlist принимает именованный список объектов DMatrix. XGBoost вычисляет и выводит значение потерь для каждого указанного набора данных после каждого раунда бустинга. Используйте его, чтобы отслеживать потери на обучающих и проверочных данных и выявлять начало переобучения.
watchlist <- list(train = dtrain, eval = dtest)
model <- xgb.train(
params = params,
data = dtrain,
nrounds = 200,
watchlist = watchlist,
verbose = 1
)
# The log shows train-rmse and eval-rmse per round
# Watch for eval-rmse increasing (overfitting signal)early_stopping_rounds
early_stopping_rounds = 20 останавливает обучение, если проверочная метрика не улучшалась 20 раундов подряд. Это автоматически находит оптимальное количество деревьев и позволяет избежать недообучения и переобучения без исчерпывающей ручной настройки.
model <- xgb.train(
params = params,
data = dtrain,
nrounds = 1000, # max rounds
watchlist = list(train = dtrain, eval = dtest),
early_stopping_rounds = 20, # stop if no improvement
print_every_n = 50,
verbose = 1
)
cat('Best iteration:', model$best_iteration)
cat('Best eval RMSE:', model$best_score)Бинарная классификация
Для бинарной классификации используйте objective = 'binary:logistic', который возвращает предсказанные вероятности. Метки должны быть числовыми значениями 0/1. Оценивайте модель с помощью AUC или логарифмической потери, используя параметр eval_metric.
# Binary classification example
library(MASS)
Pima <- MASS::Pima.tr
X_cl <- as.matrix(Pima[, -8])
y_cl <- as.numeric(Pima$type) - 1 # factor to 0/1
dt_cl <- xgb.DMatrix(data = X_cl, label = y_cl)
mod_cl <- xgboost(
data = dt_cl,
objective = 'binary:logistic',
eval_metric = 'auc',
eta = 0.05,
max_depth = 4,
nrounds = 100,
verbose = 0
)Предсказания
predict(model, dtest) возвращает исходные предсказанные значения: вероятности для классификации или вещественные предсказания для регрессии. В задачах классификации применяйте порог 0,5, чтобы преобразовать вероятности в метки классов.
# Regression predictions
reg_preds <- predict(model, dtest)
rmse <- sqrt(mean((reg_preds - y_test)^2))
cat('Test RMSE:', round(rmse, 3))
# Classification predictions
prob_preds <- predict(mod_cl, dt_cl)
class_preds <- ifelse(prob_preds > 0.5, 1, 0)
accuracy <- mean(class_preds == y_cl)
cat('Training Accuracy:', round(accuracy, 3))xgb.cv() — перекрёстная проверка
xgb.cv(params, data, nrounds, nfold) выполняет k-блочную перекрёстную проверку внутри XGBoost. Это быстрее, чем использовать rsample, поскольку XGBoost обрабатывает блоки внутри себя. В выводе для каждого раунда отображаются среднее значение метрики и SD.
cv_result <- xgb.cv(
params = params,
data = dtrain,
nrounds = 200,
nfold = 5,
early_stopping_rounds = 15,
print_every_n = 20,
verbose = 1
)
# Best nrounds from CV
best_nrounds <- cv_result$best_iteration
cat('Optimal nrounds:', best_nrounds)
# CV RMSE at best iteration
cat('CV RMSE:', cv_result$evaluation_log[best_nrounds, 'test_rmse_mean'][[1]])Основные гиперпараметры
Наибольшее влияние на XGBoost оказывают следующие гиперпараметры:
eta: скорость обучения (0.01–0.3). Меньшее значение требует большего числа деревьев и делает модель устойчивее.max_depth: глубина дерева (3–10). Большая глубина повышает сложность и ускоряет переобучение.subsample: доля строк для каждого дерева (0.5–1.0). Уменьшает переобучение.colsample_bytree: доля признаков для каждого дерева (0.5–1.0).lambda: L2-регуляризация весов листьев.alpha: L1-регуляризация весов листьев.
params_tuned <- list(
objective = 'reg:squarederror',
eta = 0.05,
max_depth = 5,
subsample = 0.75,
colsample_bytree = 0.75,
lambda = 1.0, # L2 regularization
alpha = 0.1, # L1 regularization
min_child_weight = 3 # min samples in leaf
)
model_tuned <- xgboost(
data = dtrain, params = params_tuned,
nrounds = best_nrounds, verbose = 0
)Сохранение и загрузка моделей
Модели XGBoost можно сохранить на диске в двоичном формате с помощью xgb.save(model, 'model.xgb'), а затем загрузить с помощью xgb.load('model.xgb'). Это рекомендуемый формат для развёртывания в рабочей среде, обеспечивающий побитовую воспроизводимость.
# Save model
xgb.save(model, '/tmp/xgb_boston.xgb')
# Reload and predict
loaded_model <- xgb.load('/tmp/xgb_boston.xgb')
new_preds <- predict(loaded_model, dtest)
# Verify predictions match
all.equal(reg_preds, new_preds) # TRUEМногоклассовая классификация
Для задач с несколькими классами используйте objective = 'multi:softprob' и задайте num_class равным количеству классов. Метки должны быть целыми числами с индексацией от 0. Результатом является матрица вероятностей для каждого класса.
X_mc <- as.matrix(iris[, -5])
y_mc <- as.integer(iris$Species) - 1 # 0, 1, 2
dt_mc <- xgb.DMatrix(data = X_mc, label = y_mc)
params_mc <- list(
objective = 'multi:softprob',
num_class = 3,
eta = 0.1,
max_depth = 3
)
mod_mc <- xgboost(
data = dt_mc, params = params_mc,
nrounds = 50, verbose = 0
)
# Predictions: matrix of shape (n, num_class)
prob_matrix <- matrix(predict(mod_mc, dt_mc), ncol = 3, byrow = TRUE)
head(prob_matrix)Быстрая проверка
Какова цель установки early_stopping_rounds = 20 в xgb.train()?
Повторение: XGBoost
Основные выводы из темы «Градиентный бустинг с XGBoost»:
xgb.DMatrix(data, label)создаёт оптимизированный формат данных XGBoost.- Основные параметры:
eta(скорость обучения),max_depth,subsample,colsample_bytree. watchlistотслеживает потери на обучающих и проверочных данных для каждого раунда.early_stopping_roundsавтоматически находит оптимальное количество деревьев.xgb.cv()выполняет k-блочную CV внутри XGBoost для быстрого поиска гиперпараметров.- Используйте
objective = 'binary:logistic'для бинарной классификации и'multi:softprob'для многоклассовой. - Сохраняйте и загружайте модели с помощью
xgb.save()/xgb.load().
# Production XGBoost pipeline
dtrain <- xgb.DMatrix(data = X_train, label = y_train)
dtest <- xgb.DMatrix(data = X_test, label = y_test)
params <- list(objective = 'reg:squarederror',
eta = 0.05, max_depth = 5, subsample = 0.8)
cv <- xgb.cv(params, dtrain, nrounds = 500, nfold = 5,
early_stopping_rounds = 20, verbose = 0)
model <- xgboost(data = dtrain, params = params,
nrounds = cv$best_iteration, verbose = 0)
preds <- predict(model, dtest)
cat('RMSE:', sqrt(mean((preds - y_test)^2)))Часто задаваемые вопросы
Урок «Градиентный бустинг с xgboost» бесплатный?
Да — полный текст урока «Градиентный бустинг с xgboost» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс R Academy, подпишись на CoddyKit PRO. Курс R Academy содержит 4 уроков всего.
Чему я научусь в уроке «Градиентный бустинг с xgboost»?
Настраивайте параметры xgboost, раннюю остановку и расписания скорости обучения Ты практикуешь R Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать R Academy?
Предыдущий опыт не требуется. R Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.
Сколько времени занимает урок «Градиентный бустинг с xgboost»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке R Academy?
Да. Каждый урок R Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Деревья решений: основа ансамблей
- Случайный лес с ranger
- Градиентный бустинг с xgboost
- Важность признаков и интерпретация моделей