使用ggroc绘制ROC列表时出现非单调曲线的原因排查
问题描述
我在R环境中训练了一个10折交叉验证的随机森林模型,通过循环计算每折的ROC对象并存入列表,使用pROC包的ggroc函数绘制各折的ROC曲线时,出现了理论上不可能存在的非单调ROC曲线。该问题仅出现在当前数据中,无法复现,已提供ROC对象文件my_roclist.rds及完整绘图代码,现寻求错误原因排查方向。
绘图代码:
library(pROC) library(ggplot2) # 加载提供的my_roclist.rds文件 hochgerner.roc.list <- loadRDS("my_roclist.rds") # 绘图 jpeg('hochgerner2018_earlysig_roc.jpeg', width = 600, height=600) ggroc(hochgerner.roc.list, alpha = 1, colour = "red", linetype = 'solid', size = 4, legacy.axes = TRUE) + theme_classic() + ggtitle("Hochgerner et al., (2018) ROC") + xlab("FPR") + ylab("TPR") + geom_segment(aes(x = 0, xend = 1, y = 0, yend = 1), linewidth = 2, color="darkgrey", linetype="dashed") + theme(plot.title = element_text(size = 20, face = "bold", hjust = 0.5), axis.text=element_text(size=20, face = "bold", colour="black"), axis.title =element_text(size=20, face = "bold", colour="black"), panel.border = element_rect(color = "black", fill = NA, linewidth = 2), plot.margin = margin(t = 10, r = 10, b = 10, l = 10) ) + scale_x_continuous(expand = expansion(mult = c(0, 0)), breaks = c(0,0.25,0.5,0.75,1)) + scale_y_continuous(expand = expansion(mult = c(0, 0)), breaks = c(0.25,0.5,0.75,1)) dev.off()
错误排查方向
- 检查ROC对象的计算逻辑:确认循环中计算ROC时,
response(真实标签)和predictor(预测值/概率)的对应关系是否正确,是否存在标签和预测值错位、颠倒的情况(比如把负类概率当成了正类概率)。 - 验证pROC的参数设置:计算ROC时是否指定了正确的
direction参数?如果真实标签和预测值的关联方向不符合默认假设,可能导致ROC曲线异常。可以尝试手动指定direction="<"或direction=">"重新计算单折ROC,观察是否恢复单调。 - 排查数据极端情况:当前数据是否存在类别样本量极小、大量重复预测值,或者标签分布严重失衡的情况?这些情况可能导致pROC计算阈值点时出现异常,进而生成非单调曲线。可以提取异常ROC的阈值、FPR、TPR数据,查看是否存在FPR上升但TPR下降的点。
- 检查ROC列表的合法性:确认
my_roclist.rds中的每个元素都是合法的pROC对象,有没有循环中生成的无效对象(比如某折模型预测完全失败,导致ROC计算出错)。可以用lapply(hochgerner.roc.list, function(x) class(x))检查每个元素类型,或打印单折ROC的详细信息。 - 测试ggroc绘图参数:暂时移除
legacy.axes = TRUE参数,或检查是否开启了平滑相关参数,判断是否是绘图逻辑导致的曲线显示异常。另外,用pROC原生的plot()函数绘制单折ROC,对比ggroc的结果,区分是计算问题还是绘图问题。 - 验证随机森林的预测输出:确认随机森林输出的是正类的预测概率,而非分类标签或负类概率。可以提取某折的预测值,和真实标签做交叉验证,检查排序逻辑是否合理。
内容的提问来源于stack exchange,提问作者Angus Campbell
相关产品推荐
相关产品推荐

