You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在函数多次迭代中全局保存xgboost交叉验证所有折的结果?

我明白你的问题了——用<<-只能保存最后一个折的evaluation_log,是因为每次折的结果会覆盖之前的数据,而默认的xgboostModelCV$evaluation_log其实是所有折的平均指标,不是单个折的详细训练/测试误差。要拿到nfold=2时所有折的完整评估结果,得换个思路从交叉验证返回的对象里提取每个折的独立日志:

首先,你需要在调用xgb.cv的时候加上keep = TRUE参数,这个参数会让xgboost保留每个折的训练模型,这是我们能拿到单个折评估日志的前提:

# 替换成你的实际参数与数据
xgboostModelCV <- xgb.cv(
  params = your_model_params,
  data = your_training_data,
  nfold = 2,
  nrounds = your_iteration_num,
  keep = TRUE,  # 关键:保留每个折的训练模型
  verbose = 0   # 可选,避免打印过多中间信息
)

接下来,我们可以提取每个折的评估日志,添加折的标识后合并成一个完整的数据框,方便后续分析:

方法1:基础循环实现

# 初始化空数据框存储所有折的结果
all_fold_logs <- data.frame()

# 遍历每个折
for (fold_idx in 1:xgboostModelCV$params$nfold) {
  # 提取当前折的评估日志
  current_fold_log <- as.data.frame(xgboostModelCV$folds[[fold_idx]]$evaluation_log)
  # 添加折编号,方便区分不同折的结果
  current_fold_log$fold <- fold_idx
  # 将当前折的日志追加到总数据框
  all_fold_logs <- rbind(all_fold_logs, current_fold_log)
}

方法2:用purrr包简化实现(推荐)

如果你熟悉tidyverse工具链,可以用purrr::map_dfr省去手动循环的步骤:

library(purrr)

all_fold_logs <- map_dfr(1:xgboostModelCV$params$nfold, function(fold_idx) {
  fold_log <- as.data.frame(xgboostModelCV$folds[[fold_idx]]$evaluation_log)
  fold_log$fold <- fold_idx
  fold_log
})

现在all_fold_logs里就包含了所有折每一轮迭代的训练/测试误差,你可以通过fold列区分不同折的结果,轻松对比分析模型在不同折上的表现。

为什么之前的方法不行?因为xgboostModelCV$evaluation_log是xgboost计算的所有折的平均指标,而单个折的详细日志存在$folds列表的子对象中;如果没加keep=TRUE,$folds会是空的,自然拿不到每个折的独立结果。

内容的提问来源于stack exchange,提问作者user113156

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 06:53:53