0Pricing
R Academy · 课时

使用 xgboost 进行梯度提升

配置 xgboost 参数、提前停止和学习率调度

使用 xgboost 进行梯度提升 是 CoddyKit 上的免费 R Academy 课时。 这是第 3 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 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 predictions

xgb.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

如果验证指标连续 20 轮没有改善,early_stopping_rounds = 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 数值。使用 eval_metric 参数,通过 AUC 或对数损失进行评估。

# 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) 在 XGBoost 内部运行 k 折交叉验证。这比使用 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)

快速检查

在 xgb.train() 中设置 early_stopping_rounds = 20 的目的是什么?

XGBoost 回顾

《使用 XGBoost 的梯度提升》要点:

  • xgb.DMatrix(data, label) 创建 XGBoost 优化后的数据格式。
  • 关键参数包括:eta(学习率)、max_depth、subsample 和 colsample_bytree。
  • watchlist 按轮监控训练损失和验证损失。
  • early_stopping_rounds 会自动找出最佳树数量。
  • xgb.cv() 在 XGBoost 内部运行 k 折 CV,从而快速搜索超参数。
  • 二分类使用 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 进行梯度提升」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。

「使用 xgboost 进行梯度提升」这节课中我会学到什么?

配置 xgboost 参数、提前停止和学习率调度 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。

学习 R Academy 需要有经验吗?

无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 3 节课,共 4 节。

「使用 xgboost 进行梯度提升」课时需要多长时间?

大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。

我能在这节 R Academy 课中编写并运行代码吗?

能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。

此课程中的所有课时

  1. 决策树:集成模型的基础
  2. 使用 ranger 构建随机森林
  3. 使用 xgboost 进行梯度提升
  4. 特征重要性与模型解读
← 返回 R Academy