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

如何为Bootstrapped方法训练的Caret模型绘制ROC曲线?

绘制Caret中Boot632抽样XGBoost模型的ROC曲线

首先,我先帮你理清Caret在Boot632抽样下的ROC计算逻辑,再一步步教你画ROC曲线,同时优化你筛选最优参数预测结果的代码。

一、Caret Boot632抽样的ROC计算逻辑

当你设置method="boot632"时,Caret会按以下流程计算ROC:

  • 每次从原数据中有放回抽取和原数据量相同的样本作为训练集,剩下未被抽到的~36.8%样本作为测试集
  • 用当前参数的模型对该测试集做预测,计算单次bootstrap迭代的ROC值
  • 最终模型的metric="ROC"是所有迭代ROC值的平均值
  • 你设置的savePredictions=T会保存最优参数组合下,所有bootstrap迭代中每个样本被当作测试集时的预测结果(所以同一个样本可能出现在多个迭代的测试集中,model$pred里会有对应多行记录)

二、优化最优参数预测结果的筛选代码

你写的循环逻辑是对的,但可以用更简洁的方式实现,避免循环:

# 筛选出最优参数对应的所有预测结果
best_pred <- model$pred[
  apply(model$pred[, colnames(model$bestTune)], 1, function(row) all(row == model$bestTune)),
]

这段代码会逐行检查model$pred中的调优参数列是否和model$bestTune完全匹配,直接筛选出最优参数下的所有预测记录。

三、绘制ROC曲线(用pROC包,最灵活)

我们用pROC包来计算和绘制ROC曲线,这是R中处理ROC最常用的工具:

1. 安装并加载pROC包

install.packages("pROC")
library(pROC)

2. 提取真实标签和正类预测概率

Sonar数据集的Class是二分类(M/R),model$pred里会包含两个类别的概率列(M和R),你只需要选择其中一类作为正类的概率即可(这里以M为例):

true_labels <- best_pred$obs  # 真实类别标签
pred_probs <- best_pred$M     # 正类(M)的预测概率

3. 计算ROC对象并绘制曲线

# 计算ROC曲线对象
roc_obj <- roc(true_labels, pred_probs)

# 绘制ROC曲线,同时显示AUC值
plot(roc_obj, 
     main = "ROC Curve for XGBoost Model (Boot632 Sampling)",
     col = "darkblue", 
     lwd = 2, 
     print.auc = TRUE,  # 在图上显示AUC值
     auc.polygon = TRUE,  # 填充AUC下方的区域
     auc.polygon.col = adjustcolor("darkblue", alpha.f = 0.2))

# 添加对角线参考线(随机猜测的ROC线)
abline(a = 0, b = 1, lwd = 1, lty = 2, col = "gray")

四、额外:查看单个Bootstrap迭代的ROC

如果你想观察每个bootstrap迭代的ROC表现,可以用dplyr按迭代分组计算:

library(dplyr)

# 按Resample(迭代)分组,计算每个迭代的ROC
roc_per_iter <- best_pred %>%
  group_by(Resample) %>%
  do(roc_result = roc(.$obs, .$M))

# 查看第一个迭代的ROC曲线
plot(roc_per_iter$roc_result[[1]], main = "ROC Curve for Bootstrap Iteration 1")

这样你就能看到模型在不同bootstrap样本上的泛化稳定性了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:34:52