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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 02:52:52