使用 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 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
如果验证指标连续 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 反馈 — 无需本地设置。
此课程中的所有课时
- 决策树:集成模型的基础
- 使用 ranger 构建随机森林
- 使用 xgboost 进行梯度提升
- 特征重要性与模型解读