ROC曲线和AUC---------分类模型指标,也可以推广用于目标检测语义分割等等用了分类的网络

 

目录

 

1.ROC曲线简介

2. AUC(ROC曲线的线下面积)

3.ROC曲线的优点

4. ROC曲线和PR曲线的区别:

5. ROC曲线的绘制


1.ROC曲线简介

ROC曲线从图标上看,是以TPR为纵轴,FPR为横轴的图标:

要绘制ROC曲线,除了要计算TPR和FPR,还要不断调整置信度阈值,来得到不同的分类数据,从而得到多组TPR和FPR来绘制ROC曲线。

为什么要调整置信度阈值?因为不同的阈值,网络的输出结果数量会不一样,阈值低,输出结果就多,阈值高,输出结果就少。

然后再通过输出结果来计算TPR和FPR。

TPR(True Position Rate,真阳率):即一堆数据中,正样本被网络成功识别出它是正样本的比例

         

           TP:(True Postion,真阳样本):即本来是正样本,被网络识别为正的样本

           P:所有的正样本

FPR(False Position Rate,假阳率):即一堆数据中,负样本被网络误识别成正样本的比例

          

           FP:(False Postion,假阳样本):即本来是负样本,但被网络识别为正的样本

           N:所有的负样本

可以看出,当一个样本被分类器判为正例,若其本身是正例,则TPR增加;若其本身是负例,则FPR增加。

可以看到曲线越靠左上角,网络性能越好。因为越靠左上角,TPR越大,代表正样本被正确识别的比例越高,同时FPR也越小,代表负样本被误识别成正样本的比例越小。例越小。细心的朋友可以发现,上图的ROC曲线中,有一条对角虚线,这表示TPR=FPR的随机线,意思是这时候所有样本(无论是正样本还是负样本)都会被网络识别出正样本,这就表示这时候的网络是没有识别能力的。

 

2. AUC(ROC曲线的线下面积)

ROC曲线是一个图标曲线,但要量化地评估模型,即用一个数值来评价模型,还要用AUC,AUC是ROC的线下面积:

一般来说,AUC越高越好。

AUC物理意义:

先说结论:网络的分类结果按置信度从高到低排序,其中肯定有正样本的也有负样本的,AUC越高,代表排在负样本前的正样本就越多,换句话说,就是在正样本中置信度比负样本置信度高的正样本个数就越多。下面举个例子证明:

现在假设有一个训练好的二分类器对10个正负样本(正例5个,负例5个)预测,得分按高到低排序得到的最好预测结果为[1, 1, 1, 1, 1, 0, 0, 0, 0, 0],即5个正例均排在5个负例前面,正例排在负例前面的概率为100%。然后绘制其ROC曲线,由于是10个样本,除开原点我们需要描10个点,如下:

可以看到ROC曲线为高度是1的横线。AUC=1,为完美分类器,表示正例排在负例前面的概率的确为100%

但当网络的预测排序结果为:[1, 1, 1, 1, 0, 1, 0, 0, 0, 0]。ROC曲线就变成了:

自然AUC也变小了。

在看如果网络的预测排序结果为:[1, 1, 1, 0, 1, 0, 1, 0, 0, 0],ROC的曲线就又变成了:

AUC也进一步变小了。所以AUC的意义就是,网络的预测结果排序后,真正样本能排在真负样本前面的概率,换句话说就是,真正样本置信度能比真负样本置信度高的概率。

而阴影面积就是,真负样本置信度比真正样本置信度高的概率。

AUC值对模型性能的判断标准

  1. AUC = 1,是完美分类器,采用这个预测模型时,存在至少一个阈值能得出完美预测。绝大多数预测的场合,不存在完美分类器。
  2. 0.5 < AUC < 1,优于随机猜测。这个分类器(模型)妥善设定阈值的话,能有预测价值。
  3. AUC = 0.5,跟随机猜测一样(例:丢铜板),模型没有预测价值。
  4. AUC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

不同模型之间选择最优模型:

不同的模型对应的ROC曲线中,AUC值大的模型性能自然相对较好。而当AUC值近似相等时,有两种情况:第一种是ROC曲线之间没有交点;第二种是ROC曲线之间存在交点。在两个模型AUC值相等时,并不代表两个模型的分类性能也相等。

ROC曲线之间没有交点

​ 如下图所示,A,B,C三个模型对应的ROC曲线之间交点,且AUC值是不相等的,此时明显更靠近(0,1)(0,1)(0,1)点的A模型的分类性能会更好。

敏感度:即TPR,代表了正样本被分对的比例,衡量了网络对正样本的识别能力(数值上等于召回率)

               举例若现在的目的是要识别出病人,则病人是正样本,正常人是负样本。

               敏感度越高,模型识别出的病人就越多,漏诊的几率就越小。

特异度:即1-FPR,代表了将负样本识别为负样本的情况占所有负样本的比例,衡量了分类器对负样本的识别能力

                特异度越高,则模型识别出的正常人就越多,误判的几率就越小。

ROC曲线之间存在交点

​ 如下图所示,模型A、B对应的ROC曲线相交却AUC值相等,此时就需要具体问题具体分析:当需要高Sensitivity值(敏感度,TPR)时,A模型好过B;当需要高Specificity值(特异度,1-FPR)时,B模型好过A。

3.ROC曲线的优点

ROC曲线和AUC这个评价标准最大的优势所是:

其他的评价标准如准确率、召回率都会受到测试集样本分布的影响,即对于同一模型,采用这些指标进行性能评估的话,如果输入的样本中正负样本分布发生变化,则最终的这些评价标准的数值也会变化,这种最终结果会被输入样本分布影响的特性,显然使得这些指标在评估某个样本性能时会对输入样本产生依赖,不能很客观的反应模型的性能

而ROC则很小受输入样本比例影响,即就算负样本增大10倍,ROC曲线也是几乎不变的,而其他如PR曲线就会变化剧烈。

下面来解释这个原因:

下图是一个混淆矩阵。我们已知ROC的横轴和纵轴分别是FPR和TPR。从(b)看出,TPR只受TP和FN影响,从混淆矩阵看出,TP和FN都属于正样本,所以增加负样本,对TPR是没影响的。而FPR只受FP和TN影响,从混淆矩阵看出,FP和TN都是负样本,所以增加10倍负样本的话,FP和FP+TN也是按比例增加的,所以实际来说,几乎没变化。因此ROC曲线变化不大。

接下来我们看看PR曲线,PR曲线横轴是召唤率(Recall),纵轴是准确率(Precision),若增大10倍负样本,TP和FN都不变,因为都属于正样本,所以召回率Recall是不变的。但是Precision呢,负样本增加,FP也会增加,所以Precision是会变的。所以PR曲线会受到正负样本比例的影响。

详细地我们来看一下下面这张图:

(a)和(b)为在初始测试集上的ROC曲线和PR曲线,(c)和(d)为增加10倍负样本后的ROC曲线和PR曲线,可以看到ROC曲线并没怎么变化,但是PR曲线则变化剧烈。

 

4. ROC曲线和PR曲线的区别:

1. PR更关注正样本的分类情况,因为准确率和召回率都是算预测出正样本的比例。而ROC则兼顾正样本和负样本的分类情况。

2. 在测试样本的正负分布发生变化时,ROC基本不变,PR则会改变。当正负样本比例失调时,比如正样本1个,负样本100个,则ROC曲线变化不大,此时用PR曲线更加能反映出分类器性能的好坏。则ROC则能撇除正负样本分布的影响,来判断模型的能力。

 

5. ROC曲线的绘制

ROC计算过程如下:
1)首先每个样本都需要有一个label值,并且还需要一个预测的score值(即置信度,取值0到1);
2)然后按这个score对样本由大到小进行排序,假设这些数据位于表格中的一列,从上到下依次降序;
3)现在从上到下按照样本点的取值进行划分,位于分界点上面的我们把它归为预测为正样本,位于分界点下面的归为负样本;
4)分别计算出此时的TPR和FPR,然后在图中绘制(FPR, TPR)点。

ROC的线下面积就是AUC,AUC量化了ROC曲线表达的分类能力。这种分类能力是与概率、阈值紧密相关的,分类能力越好(AUC越大),那么输出概率越合理,排序的结果越合理。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在R语言中,可以使用plotly包来可视化二分类模型ROC曲线。首先,你需要计算出模型的真正率(True Positive Rate)和假正率(False Positive Rate),然后使用plotly函数来画出ROC曲线。在曲线中添加AUC(Area Under the Curve)值可以使用annotate函数来实现。以下是一个示例代码: ```R # 加载plotly包 library(plotly) # 计算真正率和假正率 true_positive_rate <- c(0.2, 0.4, 0.6, 0.8, 1) false_positive_rate <- c(0, 0.2, 0.4, 0.6, 1) # 绘制ROC曲线 roc_curve <- plot_ly(x = false_positive_rate, y = true_positive_rate, type = "scatter", mode = "lines") roc_curve <- roc_curve %>% add_trace(x = c(0,1), y = c(0, 1), mode = "lines", line = list(dash = "dash"), name = "Random") # 添加AUC值 roc_curve <- roc_curve %>% layout(annotations = list(x = 0.5, y = 0.5, text = paste("AUC =", auc, sep = ""), showarrow = FALSE)) # 显示ROC曲线 print(roc_curve) ``` 这段代码会生成一个二分类模型ROC曲线,并在曲线上方添加了AUC值。你可以将真正率和假正率替换为你的实际模型结果。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [R语言plotly可视化:使用plotly可视化二分类模型ROC曲线、计算并在曲线中添加AUC值(basic binary ROC ...](https://blog.csdn.net/zhongkeyuanchongqing/article/details/122774804)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [二分类模型性能评价(R语言,logistic回归,ROC曲线,lift曲线,lorenz曲线)](https://blog.csdn.net/mousever/article/details/46944479)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值