ROC曲线
一、什么是ROC曲线
ROC曲线实际上就是一种用于评价所建立的模型优劣性的二维图像
1.相关概念
1.真阳性(TP):实际为正类,模型预测为正类
2.假阳性(FP):实际为负类,模型预测为正类
3.真阴性(TN):实际为负类,模型预测为负类
4.假阴性(FN):实际为正类,模型预测为负类
5.精确率: 真阳性 / (真阳性 + 假阳性) | 表示模型中预测的正类中实际为正类的比例,
6.召回率: 真阳性 / (真阳性 + 假阴性) | 与灵敏度相同
7.特异度: 真阴性 / (真阴性 + 假阳性) | 表示所有负类中被模型分对的比例,衡量了模型对负类的识别能力
8.灵敏度: 真阳性 / (真阳性 + 假阴性) | 表示所有正类中被模型分对的比例,衡量了模型对正类的识别能力
9.正确率: (真阳性 + 真阴性) / (真阳性 + 假阳性 + 真阴性 + 假阴性) | 表示模型预测正确的样本占总体的比例
10.预测概率:在模型对样本做出预测时,预测结果往往不是固定的,会呈现一个预测概率,即某样本在某一模型的预测下有p的概率为正类,1-p的概率为负类。最后模型会输出一个预测概率。
11.阈值:为了让模型得到准确的结果,可以设置一个阈值。例如,当某样本在模型预测概率大于 一个定值 时,我们认为这个样本为正类。这个值即阈值。
2.ROC曲线
ROC曲线是以灵敏度与特异度为指标对某一模型作出评价的二维图像。
以 1 - 特异度
作为横坐标,也可以称为伪正类率(False positive rate, FPR),表示模型对负类的识别能力,数值越小,模型对负类识别能力越好。
以 灵敏度
作为纵坐标 , 也可以称为真正类率(True positive rate, TPR) ,表示模型对正类的识别能力,数值越大,模型对正类识别能力越好
例如下图中蓝线是某一模型的ROC曲线。
红线的含义为 随机预测。即预测为正类与负类的概率为均为0.5左右,正负类判定取决于阈值。
而蓝线为某一模型的ROC曲线,表示当调整阈值使TPR(或FPR)为某一值时,TPR与FPR的关系符合曲线的函数关系。
举例来讲,在蓝色点处,表示在阈值设置为某一值时,TPR为0.9,而FPR为0.4。实际应用过程中,我们可以根据需求(更加需求TPR,还是FPR)来设置阈值。
3.AUC面积
AUC面积是指ROC曲线与 x = 1 与 x 轴 所围成区域的面积,即图中绿色部分。
AUC面积往往用于衡量一个模型的预测性的优劣,因为ROC曲线涉及阈值的选择,在一定情况下使用ROC曲线衡量不是很好比较。
一般地认为AUC面积越大,则模型的预测性越好。
二、ROC曲线如何绘制
1.算法介绍
这一部分是为了加深ROC曲线的理解,在用R绘制曲线过程中实际并不需要从0开发算法,有现成的包可以使用。
如图所示是一种ROC曲线的常用算法,先将预测概率按序排列。由上向下设置阈值,模型预测的正类数量会按梯度增加,依据这个规律计算处特异度与灵敏度,记录于内存之中,最后绘图。
2.用R进行ROC曲线的绘制
这里要介绍pROC包。一个专门用于绘制ROC曲线的模块。
其中有一个函数 roc()
可以用于计算ROC曲线各个阈值下的敏感度与特异度
=======数据格式======
===================
即最后roc函数计算的数据格式要如上图所示
roc(v1, v2)
v1 -训练集中实际正类还是负类的列向量
v2 -训练集中模型预测为正类的预测概率
1.简单绘制ROC曲线
# 加载R包
library(pROC)
library(ggplot2)
# 读取数据
df = read.delim("https://www.bioladder.cn/shiny/zyp/bioladder2/demoData/ROC/demo.txt",# 这里读取了网络上的demo数据,将此处换成你自己电脑里的文件
header = T # 指定第一行是列名
)
# ROC计算
rocobj <- roc(df[,1], df[,2])
# 绘图
plot(rocobj, col = "red", legacy.axes = T, print.auc = T, print.thres = T)
"""
print.auc -增加AUC面积
print.thres -增加临界点
legacy.axes -更改横坐标(以 1-敏感度 还是 敏感度 为横坐标)
"""
2.将两个ROC曲线绘制在一张图中,并添加标签
# 读取数据及ROC计算同 ###1 步骤。
# 绘图
plot(rocobj_1, col = "red", legacy.axes = T, print.thres = T)
plot(rocobj_2, col = "blue", legacy.axes = T, print.thres = T, add = T)
legend("bottomright", legend = c("roc1 AUC-0.731", "roc2 AUC-0.612"), col = c("red", "blue"), lty = c(1, 1)) # 添加图例
"""
====
plot:
rocobj_1, rocobj_2 -表示通过roc函数所计算出来的数据集
add -表示添加曲线,添加该参数后不会覆盖原图像,而是添加新的曲线到图像上
====
legend:
"bottomright" -设置标签所在位置
legend -设置标签的名字, 可以通过手动添加AUC数字
lty -改变标签线的类型, 可以设置通过与plot图像一一对应.
"""