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

