利用caret的lift绘制两种算法ROC曲线,实现同图分色与AUC标注
同图展示双ROC曲线并标注AUC的最简方法
这事儿其实挺简单的,核心就是把两个模型的ROC数据合并,用ggplot的颜色映射区分曲线,再加上AUC标注就行。我给你捋个最简流程,附代码示例:
1. 合并ROC曲线数据
不管你是从caret的lift工具里提取的曲线点,还是其他方式生成的,先把两个模型的**FPR(假阳性率)和TPR(真阳性率)**数据合并到一个数据框里,同时新增一列标记模型名称,方便ggplot识别分组:
# 假设你从lift工具得到的两个ROC数据框是roc_model1和roc_model2(均包含fpr、tpr列) roc_combined <- rbind( cbind(roc_model1, model = "模型A"), cbind(roc_model2, model = "模型B") )
2. 计算AUC值
用pROC包的auc()函数就能快速算出AUC,如果你已有测试集的真实标签和模型的预测概率,直接计算即可:
library(pROC) # test_data为测试集,response是真实标签列,predict(...)获取模型的正类预测概率 auc_modelA <- auc(test_data$response, predict(modelA, test_data, type = "prob")[,2]) auc_modelB <- auc(test_data$response, predict(modelB, test_data, type = "prob")[,2])
3. 绘制双ROC曲线+AUC标注
这里提供两种标注AUC的方式,你可以按需选择:
方式一:AUC整合到图例(最简洁)
直接把AUC值加到模型名称后面,图例会自动展示,不用额外标注:
library(ggplot2) # 给模型名称添加AUC后缀 roc_combined$model <- factor(roc_combined$model, levels = c("模型A", "模型B"), labels = c(paste0("模型A (AUC = ", round(auc_modelA, 3), ")"), paste0("模型B (AUC = ", round(auc_modelB, 3), ")"))) # 绘制曲线 ggplot(roc_combined, aes(x = fpr, y = tpr, color = model)) + geom_line(linewidth = 1) + # 曲线加粗提升可读性 geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray50") + # 添加随机猜测基线 labs(x = "假阳性率 (FPR)", y = "真阳性率 (TPR)", title = "两种算法的ROC曲线对比", color = "模型") + theme_minimal()
方式二:图内指定位置标注AUC(更灵活)
如果不想占用图例空间,可以把AUC文本放到图的角落或其他位置:
library(ggplot2) ggplot(roc_combined, aes(x = fpr, y = tpr, color = model)) + geom_line(linewidth = 1) + geom_abline(intercept = 0, slope = 1, linetype = "dashed", color = "gray50") + labs(x = "假阳性率 (FPR)", y = "真阳性率 (TPR)", title = "两种算法的ROC曲线对比", color = "模型") + # 自定义标注位置,x/y值可根据你的曲线范围调整 annotate("text", x = 0.7, y = 0.2, label = paste0("模型A AUC = ", round(auc_modelA, 3)), color = "#F8766D") + annotate("text", x = 0.7, y = 0.15, label = paste0("模型B AUC = ", round(auc_modelB, 3)), color = "#00BFC4") + theme_minimal()
补充:如果你的ROC数据来自caret的
lift()对象,提取FPR和TPR的方式是lift_obj$x(对应FPR)和lift_obj$y(对应TPR),直接转成数据框即可使用。
内容的提问来源于stack exchange,提问作者Keshav M
相关产品推荐
相关产品推荐

