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

如何用Tidymodels(Parsnip XGBoost)实现新数据重复预测模拟?

解决xgboost重复预测结果一致的问题,计算每行预测比例

问题根源

你用fit(workflow, training)训练的单个xgboost模型是确定性的——模型参数在训练完成后完全固定,所以无论重复多少次预测,输出结果都会完全一致。要得到有差异的预测结果来计算比例,你需要生成一组带有随机性的模型,再聚合它们的预测输出。

高效解决方案:训练多模型集成并批量预测

这里用tidymodels生态工具实现高效的多模型训练与预测,避免手动循环修改种子:

步骤1:生成带随机性的训练样本(Bootstrap)

用rsample::bootstraps生成多个训练子集,每个子集都是原训练数据的有放回抽样,天然引入随机性:

library(rsample)
library(tidymodels)
library(purrr)
library(dplyr)

# 生成100个bootstrap训练样本
boot_samples <- bootstraps(training, times = 100)

步骤2:批量训练xgboost模型

基于每个bootstrap样本训练模型,用purrr::map替代循环,效率更高:

# 复用你已定义的workflow(示例结构)
xgb_workflow <- workflow() %>%
  add_model(
    boost_tree(
      trees = 100,
      mtry = tune(),
      min_n = tune(),
      learn_rate = tune()
    ) %>%
      set_engine("xgboost") %>%
      set_mode("classification")
  ) %>%
  add_formula(Virginica ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width)

# 批量训练100个模型
boot_models <- boot_samples %>%
  mutate(model = map(splits, ~fit(xgb_workflow, data = analysis(.x))))

步骤3:对新数据批量预测并计算比例

用purrr::map批量生成每个模型的预测结果,再按行聚合计算预测为Virginica的比例:

# 假设new_data是你的目标新数据集,结构与training一致
predictions <- boot_models %>%
  mutate(pred = map(model, ~predict(.x, new_data = new_data, type = "class"))) %>%
  pull(pred) %>%
  bind_cols()

# 计算每行被预测为Virginica的比例
pred_proportions <- predictions %>%
  rowwise() %>%
  mutate(
    virginica_ratio = mean(c_across(everything()) == "Virginica")
  ) %>%
  select(virginica_ratio)

替代方案:利用xgboost的随机预测(仅适用于特定场景)

如果你的xgboost模型在训练时开启了subsample或colsample_bytree等随机采样参数,且使用predict的ntree_limit逐步输出结果,但这种方法的随机性有限,不如多模型集成稳定。更推荐上面的bootstrap多模型方案,结果更可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 05:40:25