R高级绘图 | P8 | 最最最最最简单的ROC曲线绘制并计算AUC的方法

不知为何!这两天超多小伙伴们询问ROC曲线相关问题,有的小伙伴觉得ROC曲线很复杂,画起来很麻烦;有的小伙伴提到不同模型训练得到的预测结果进行ROC曲线绘制时各种格式报错;也有来自非生物医学领域的小伙伴们也用到了ROC曲线,所以前来学习!今天,咱们就给大家介绍一种最最最最最最最最最简单的ROC曲线绘制方法!不管你是什么模型跑出来的结果,咱都百搭!不仅简单,而且万能!

前面碎碎念

ROC曲线到底是什么嘞

ROC(Receiver Operating Characteristic)曲线是一种用于评估分类模型性能的工具。它以二分类模型为基础,比如说医学诊断中的正常/异常、信用评分中的违约/不违约等。ROC曲线以真正例率(True Positive Rate,也称为灵敏度)为纵轴,假正例率(False Positive Rate)为横轴绘制而成。

在了解ROC曲线之前,需要先了解两个重要的概念:

  1. 真正例率(True Positive Rate,TPR):指分类器正确地将正例预测为正例的比率,即TPR = TP / (TP + FN),其中TP是真正例(True Positive)的数量,FN是假负例(False Negative)的数量。TPR也被称为“灵敏度”(Sensitivity)或“召回率”(Recall)。
  2. 假正例率(False Positive Rate,FPR):指分类器错误地将负例预测为正例的比率,即FPR = FP / (FP + TN),其中FP是假正例(False Positive)的数量,TN是真负例(True Negative)的数量。FPR也被称为“误报率”(False Alarm Rate)。

其实这些概念已经在之前的文章中详细介绍过啦!如下图所示,有兴趣的小伙伴们可以去看看哟!

大家可以查看:

怎么判断你的模型是好是坏?模型性能评估指标大全!

怎么判断你的模型是好是坏?模型性能评估指标大全!(二)

ROC曲线是根据不同的分类阈值绘制出来的。分类阈值决定了模型将某个样本归为正例还是负例的界限。ROC曲线上的每个点代表着在不同的阈值下模型的TPR和FPR。理想情况下,ROC曲线靠近左上角(0,1),意味着模型在所有阈值下都能实现较高的TPR和较低的FPR,即在保持高灵敏度的同时尽量减少误报率。

ROC曲线有什么用嘞

ROC曲线的应用场景包括但不限于:

  1. 评估分类器性能:ROC曲线能够直观地展示分类器在不同阈值下的性能表现。比较不同模型的ROC曲线可以帮助选择最佳模型。
  2. 选择最佳分类阈值:通过ROC曲线,可以选择最合适的分类阈值,以满足特定的需求。比如在医学诊断中,我们可能更重视减少误报率,而在搜索引擎中可能更重视提高召回率。
  3. 比较不同特征集的效果:通过绘制不同特征集对应的ROC曲线,可以评估不同特征对分类器性能的影响,从而选择最具有区分度的特征集。
  4. 调整不平衡样本的分类器:在处理不平衡样本(正负例数量差异很大)时,ROC曲线能够更好地评估分类器的性能,因为ROC曲线不受类别分布的影响。总的来说,ROC曲线是一种非常有效的工具,可以帮助理解和评估分类模型的性能,并且在各种领域的应用中都有着广泛的应用。

关于ROC的曲线,咱们今天就先介绍到这里啦!毕竟今天最最最最最重要的是,向大家介绍最最最最最最最简单的ROC曲线绘制方法!咱们往下看!

绘图代码

咱们今天主打一个简单高效!所以,只要你手头有预测结果和分组信息,咱就能帮你搞出漂亮的ROC曲线!

今日份绘图所用到的数据我已经上传到了GitHub,大家可以在公众号后台回复ROC,即可获得存放数据的链接。不过我在分享过程中也会把每一步的输入数据和输出结果进行展示,大家可以作为参考并调整自己的数据格式,然后直接用自己的数据跑,也是没有任何问题的!


##################### 最最最最最最简单的ROC曲线绘制方法 ########################

# 加载包,没有的记得安装一下哟!
library(pROC)

# 加载数据
roc_data <- readRDS("./roc_data.rds")

dim(roc_data)
# [1] 1470   81

# 我们所用的数据有:1470行、81列

head(roc_data)[1:4, c(1:3,81)]
#                                      BP10MB[0] BP10MB[1] BP10MB[2] type
# 0040b1b6-b07a-4b6e-90ef-133523eaf412       287        17        17    0
# 00508f2b-36bf-44fc-b66b-97e1f3e40bfa       278         6        14    0
# 005794f1-5a87-45b5-9811-83ddf6924568       314         0         0    0
# 005e85a3-3571-462d-8dc9-2babfc7ace21       305         4         5    0

# 可以看出,行名为样本名,前80列为特征名,最后一列`type`列为类别标签,也就是分组信息
# 这里选用这个数据集是为了给大家展示多条ROC曲线的绘制
# 大家可以把特征列看作是预测得分,就假装咱们这里一共有80个模型得到了80种预测得分
# 当然,也可以理解为每一列都是一个特征,咱们以单个特征为指标进行分类预测

# 绘制 ROC 曲线
plot.roc(
  roc_data$type,              # 通常是实际的类别标签,例如阳性或阴性,这里是`type`列
  roc_data$`BP10MB[1]`,       # 通常是预测的概率或分数,这里我们假设`BP10MB[1]`列为预测得分
  col = "#A31621",            # 曲线的颜色
  percent = TRUE,             # 将 x 轴的刻度标签转换为百分比
  lwd = 2,                    # 曲线的线宽
  print.auc = TRUE,           # 是否打印 AUC 值
  print.auc.cex = 1,          # AUC 文本的大小
  print.auc.pattern = "BP10MB[1]: %.1f%%",      # 打印 AUC 的格式,可以是预测概率或分数,也可以的单个特征指标
  print.auc.y = 50            # 打印 AUC 文本的 y 坐标,也就是 AUC 显示在图中的位置,试试你就知道啦!
)

哎嘿!一条曲线就搞定啦!

那要是有的小伙伴们想在一个图图上展示多条ROC曲线以对比不同模型或特征的预测性能该怎么办嘞!

请继续往下看!

# 咱们添加另一条 ROC 曲线
plot.roc(
  roc_data$type,              # 还是`type`列,咱们的类别标签,也就是分组信息
  roc_data$`SS[>7 & <=8]`,    # 这条 ROC 曲线咱们以`SS[>7 & <=8]`列为预测得分
  col = "#2694ab",
  percent = TRUE,
  lwd = 2,
  print.auc = TRUE,
  print.auc.cex = 1,
  print.auc.pattern = "SS[>7 & <=8]: %.1f%%",
  print.auc.y = 45,
  add = TRUE                  # 添加到已有的图上
)

可以看到图中多了一条线,就是以SS[>7 & <=8]列作为分类依据进行预测的结果。

那我们还想要更多的线该怎么做嘞!超简单!咱们继续往下看!

# 继续添加其他 ROC 曲线,参数与上述相似
plot.roc(roc_data$type, roc_data$`SS[>5 & <=6]`, col = "#8134af",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "SS[>5 & <=6]: %.1f%%",
         print.auc.y = 40, add = T)

plot.roc(roc_data$type, roc_data$`CN[>8]`, col = "#667572",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CN[>8]: %.1f%%",
         print.auc.y = 35, add = T)

plot.roc(roc_data$type, roc_data$`CN[2]`, col = "#d0a727",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CN[2]: %.1f%%",
         print.auc.y = 30, add = T)

plot.roc(roc_data$type, roc_data$`CN[1]`, col = "#de4307",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CN[1]: %.1f%%",
         print.auc.y = 20, add = T)

plot.roc(roc_data$type, roc_data$`CN[4]`, col = "#005995",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CN[4]: %.1f%%",
         print.auc.y = 25, add = T)

plot.roc(roc_data$type, roc_data$`CNCP[2]`, col = "#051181",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CNCP[2]: %.1f%%",
         print.auc.y = 15, add = T)

plot.roc(roc_data$type, roc_data$`BPArm[4]`, col = "#8bc24c",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "BPArm[4]: %.1f%%",
         print.auc.y = 10, add = T)

plot.roc(roc_data$type, roc_data$`CNCP[0]`, col = "#ea7070",
         percent = T,
         lwd = 2, print.auc = T, print.auc.cex = 1, print.auc.pattern = "CNCP[0]: %.1f%%",
         print.auc.y = 5, add = T)

喔豁!大功告成!漂亮!

文末碎碎念

那今天的分享就到这里啦!我们下期再见哟!

最后顺便给自己推荐一下嘿嘿嘿!

如果我的分享对你有用的话,欢迎关注点赞在看转发分享阿巴阿巴阿巴阿巴巴巴!这可是我的第一原动力!

蟹蟹你们的喜欢和支持!!!

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

生信小白要知道

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值