如何用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
相关产品推荐
相关产品推荐

