1. 什么是ROC 曲线?
1.1 曲线的横纵轴
sensitivity, recall, hit rate, or true positive rate (TPR)
TPR = TP/P = TP/(TP + FN)
fall-out or false positive rate (FPR)
FPR = FP/N = FP/(FP + TN)
1.2 ROC曲线:wiki
在信号检测理论中,接收者操作特征曲线(receiver operating characteristic curve,或者叫ROC曲线)是一种坐标图式的分析工具,用于 (1) 选择最佳的信号侦测模型、舍弃次佳的模型。 (2) 在同一模型中设定最佳阈值。
设置不同的阈值,可以得到不同的TPR和FPR
- 当阈值设定为最高时,亦即所有样本都被预测为阴性,没有样本被预测为阳性,此时在伪阳性率 FPR = FP / ( FP + TN ) 算式中的 FP = 0,所以 FPR = 0%。同时在真阳性率(TPR)算式中, TPR = TP / ( TP + FN ) 算式中的 TP = 0,所以 TPR = 0%
→ 当阈值设定为最高时,必得出ROC座标系左下角的点 (0, 0)。
- 当阈值设定为最低时,亦即所有样本都被预测为阳性,没有样本被预测为阴性,此时在伪阳性率FPR = FP / ( FP + TN ) 算式中的 TN = 0,所以 FPR = 100%。同时在真阳性率 TPR = TP / ( TP + FN ) 算式中的 FN = 0,所以 TPR=100%
→ 当阈值设定为最低时,必得出ROC座标系右上角的点 (1, 1)。
- 因为TP、FP、TN、FN都是累积次数,TN和FN随着阈值调低而减少(或持平),TP和FP随着阈值调低而增加(或持平),所以FPR和TPR皆必随着阈值调低而增加(或持平)。
→ 随着阈值调低,ROC点 往右上(或右/或上)移动,或不动;但绝不会往左下(或左/或下)移动。
1.3 AUC值是什么?它的意义是什么?
AUC值就是正样本排在负样本前面的几率(When using normalized units, the area under the curve (often referred to as simply the AUC) is equal to the probability that a classifier will rank a randomly chosen positive instance higher than a randomly chosen negative one (assuming 'positive' ranks higher than 'negative').[17])不是特别懂里面提到的公式,可以去wiki里看。
理论上来说当两条ROC曲线重合的时候,我们可以通过他们的AUC大小来判定哪个分类器更好。
所以AUC越大,代表分类器越好。(wiki)
从AUC判断分类器(预测模型)优劣的标准:
- AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
- 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
- AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
- AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。
2. 如何使用PRROC画彩虹ROC曲线?
了解完基础知识后,我们在呈现ROC曲线有多种方式,其中一种就是使用彩虹色来标记阈值,
这样做的好处是:我们可以知道什么养的阈值表现出的sensitivity是什么FPR是什么。
又或者我希望我的真阳率优于假阳率,我们可以通过观察阈值决定,哪个阈值更好。我们的阈值是不是接近0.5。
总结一下:
ROCR和pROC是引用比较多的,紧随其后的是14年新发表的。ROCR 04年就出现了一直都是主力马,尽管没有vignette文档,但是documentation说明文档也很好。
pROC是10年发表的,可以在图里面画出来置信曲线。
PRROC是14年新发表的,有超过前两个老牌软件的趋势,特点是它也可以计算precision-recall曲线
ROCR和PRROC都可以画彩色的ROC图片,这里使用PRROC举例子:
input file
Disease | Disease | 0.032 | 0.968 | 2 | 4 | Fold4 | 1 | |
2 | Disease | Disease | 0.096 | 0.904 | 6 | 4 | Fold4 | 1 |
3 | Control | Control | 0.850 | 0.150 | 18 | 4 | Fold4 | 0 |
4 | Disease | Control | 0.138 | 0.862 | 21 | 4 | Fold4 | 0 |
5 | Disease | Disease | 0.088 | 0.912 | 28 | 4 | Fold4 | 1 |
6 | Disease | Disease | 0.030 | 0.970 | 30 | 4 | Fold4 | 1 |
7 | Disease | Disease | 0.518 | 0.482 | 31 | 4 | Fold4 | 1 |
8 | Control | Control | 0.922 | 0.078 | 41 | 4 | Fold4 | 0 |
9 | Disease | Disease | 0.356 | 0.644 | 42 | 4 | Fold4 | 1 |
10 | Disease | Disease | 0.048 | 0.952 | 43 | 4 | Fold4 | 1 |
11 | Disease | Disease | 0.342 | 0.658 | 49 | 4 | Fold4 | 1 |
12 | Disease | Disease | 0.030 | 0.970 | 51 | 4 | Fold4 | 1 |
code
library(PRROC)
library(tidyverse)
# filter the prediction output of model object (rf_forest) from R package caret by using the best tunning
prediction_df <- filter(rf_forest$pred, mtry == 4)
# change the positive group to 1
(prediction_df 就是我们前面粘贴的表格了)
prediction_df$test <- ifelse(prediction_df$obs == "Disease",1,0 )
roc_curve_prediction_df <- PRROC::roc.curve(scores.class0 = prediction_df$Disease, weights.class0=prediction_df$test,
curve=TRUE,rand.compute = TRUE) # rand.compute 是0.5的随机分类器,为了画对角线的
#画图
par(cex.axis=2, cex.lab =1.6,font.axis =1.6)
plot(roc_curve_prediction_df,rand.plot = TRUE,auc.main=FALSE,legend =4,lwd=5)
text(1, 0.5, paste('AUC =', ' ',round(roc_curve_prediction_df$auc, digits = 3), sep =""), cex=1.4, font=2, col='black')
# 如果想用ggplot2自己画图,可以把这个矩阵提取出来
roc_curve_prediction_df$auc
# 三列 分别对应 x轴坐标 y轴坐标 阈值颜色
图片示例:
可以看到阈值越大,那么sensitivity越小,FPR也越小;阈值越小,sensitivity越大,FPR也越大。
Ref: (感谢下面的帖子!)
https://rviews.rstudio.com/2019/03/01/some-r-packages-for-roc-curves/
https://www.jianshu.com/p/c61ae11cc5f6
https://en.wikipedia.org/wiki/Receiver_operating_characteristic#Area_under_the_curve
https://zh.wikipedia.org/wiki/ROC%E6%9B%B2%E7%BA%BF