概念

在信号检测理论中,接收者操作特征曲线receiver operating characteristic curve,或者叫ROC曲线)是一种坐标图式的分析工具,在同一模型中设置最佳阈值。by Wikipedia

ROC曲线的画法如下图所示,每个点表示不同阈值下 TP(横坐标) FP(纵坐标)的值,

TP,FP的定义如下

    实际值
  ture 真的 false 假的
预测值 ture 真的 TP (true positive) FP (false positive)
false 假的 FN (false negative) TN (true negative)

TP rate = TP/(TP+FN),分母就是实际上是真的那一类,这个算出来的是预测的真的占真正的真的改率。我们想要预测的准确,这个应该越大越好。

FP rate = FP/(FP+TN),分母就是实际上假的那一类,这个算出来的是被错分成真的(其实是假的)占所有的错的概率,我们希望错分的越小越好,所以这个值越小越好。


例子

AUC计算过程:

下面用两个正态分布的例子说明问题,

下图中左边蓝色是一类,右边绿色是一类。

(目的)ROC的作用是找到两个类,让红色的这条线能够将两类最好地分开。AUC值越大的分类器,正确率越高

(过程)从左到→右移动移动这条红色的虚线,计算ROC中的每个点,一个虚线就是一个阈值,对应的就是ROC上面的一个点,将ROC连成曲线。在这个图中已经标明了TP,FP,TN,FN,可以很方便的计算出来。

-------------------------------------------------------------------------------------------------------------------------------

我们知道TP rate越大越好,FP rate越小越好。那么画了ROC之后,怎么判断哪两个类能分的最开呢?怎么找到哪个阈值最好呢?

下面这张图画出了解决办法。就是算出AUC(Area Under Curve,曲线下的面积),也就是ROC与坐标轴形成的面积。

AUC图反映的是两个类的重叠程度,AUC的面积反应了分类的好坏。

我们可以看到不同的两个分类的AUC截然不同,

第一个例子:可以分开大多数点,它的AUC在0.9左右

第四个例子:两个类完全重合时,一半的点都会分类错误,相当于没分,它的AUC是0.5左右。

因此AUC面积越大的分类器的分类效果最好,这样的分类器在找到阈值后可以有较高的分类正确率。

链接:
ROC Curves - YouTube

代码 ROCcurve及AUC

import matplotlib.pyplot as plt
import numpy as npdef gauss2D(x, m, C):Ci = np.linalg.inv(C)  #求矩阵的逆dC = np.linalg.det(C)  #求矩阵的行列式num = np.exp(-0.5 * np.dot((x-m).T, np.dot(Ci,(x-m))))den = 2 * np.pi * (dC**0.5) #计算矩阵的密度函数return num/dendef twoDGaussianPlot(nx, ny, m, C):x = np.linspace(-6, 6, nx)y = np.linspace(-6, 6, ny)X, Y = np.meshgrid(x, y, indexing='ij')Z = np.zeros([nx,ny])for i in range(nx):for j in range(ny):xvec = np.array([X[i,j], Y[i,j]])Z[i,j] = gauss2D(xvec, m, C)return X, Y, ZX = np.random.randn(200, 2)
C1 = np.array([[2,1],[1,2]])
C2 = np.array([[2,1],[1,2]])
m1 = np.array([0, 3])
m2 = np.array([3,2.5])
A = np.linalg.cholesky(C1)Y1 = X @ A.T + m1
Y2 = X @ A.T + m2plt.figure(1)
plt.scatter(Y1[:,0], Y1[:,1], c='c', s=4)
plt.scatter(Y2[:,0], Y2[:,1], c='m', s=4)Xp, Yp, Zp = twoDGaussianPlot(40,50,m1,C1)
plt.contour(Xp, Yp, Zp, 5)Xp2, Yp2, Zp2 = twoDGaussianPlot(40,50,m2,C2)
plt.contour(Xp2, Yp2, Zp2, 5)# uF = [(np.mean(Y1[:,0])+np.mean(Y2[:,0]))/2,(np.mean(Y1[:,1])+np.mean(Y2[:,1]))/2]
# uF = np.array([-1,5])
uF = np.array(m1-m2)
print(uF)
# print(uF.shape)
#plt.arrow(0, 0, *(uF), color='b', linewidth=2.0, head_width=0.30, head_length=0.35)
plt.arrow(0, 0, uF[0], uF[1], color='b', linewidth=2.0, head_width=0.30, head_length=0.35)plt.axis('equal')
plt.grid()
plt.xlim([-6,6])
plt.ylim([-5,8])plt.savefig('density graph.png')yp1 = Y1 @ uF
yp2 = Y2 @ uFplt.figure(2)
plt.rcParams.update({'font.size':16})
plt.hist(yp1, bins=40)
plt.hist(yp2, bins=40)
plt.savefig('histogramprojections.png')pmin = np.min( np.array( (np.min(yp1), np.min(yp2) )))
pmax = np.max( np.array( (np.max(yp1), np.max(yp2) )))
print(pmin, pmax)nRocPoints = 50
thRange = np.linspace(pmin, pmax, nRocPoints)
ROC = np.zeros((nRocPoints, 2))for i in range(len(thRange)):thresh = thRange[i]TP = len(yp2[yp2 > thresh]) * 100/len(yp2)FP = len(yp1[yp1 > thresh]) * 100/len(yp1)ROC[i,:] =[TP, FP]fig, ax = plt.subplots(figsize=(6,6))
ax.plot(ROC[:,0],ROC[:,1], c='m')
ax.set_xlabel('False Positive')
ax.set_ylabel('True Positive')
ax.set_title("Receive Operating Charateristics")
ax.grid(True)
plt.savefig('rocCure.png')print(np.trapz(ROC[:,1],x=ROC[:,0]))

ROC 曲线讲解 (Receiver Operarating Curve)相关推荐

  1. ROC曲线,曲线下的面积(Aera Under Curve,AUC),P-R曲线

    ROC曲线是Receiver Operating Characteristic Curve的简称,中文名为"受试者工作特征曲线".ROC曲线源于军事领域,而后在医学领域应用甚广,& ...

  2. 如何画ROC曲线和FROC曲线

    画ROC曲线代码 具体去看https://www.jianshu.com/p/5df19746daf9.,里面的代码讲的详细 例子 # coding=UTF-8 from sklearn import ...

  3. 人脸识别ROC曲线绘制1--生成人脸feature文本

    目录 一.ROC曲线 二.Feature文本生成 三.脚本调用 一.ROC曲线 ROC曲线(Receiver Operator characteristic Curve)是一种已经被广泛接受的系统匹配 ...

  4. ROC曲线,AUC面积

    AUC(Area under Curve):Roc曲线下的面积,介于0.1和1之间.Auc作为数值可以直观的评价分类器的好坏,值越大越好. 首先AUC值是一个概率值,当你随机挑选一个正样本以及负样本, ...

  5. 分类模型-评估指标(2):ROC曲线、 AUC值(ROC曲线下的面积)【只能用于二分类模型的评价】【不受类别数量不平衡的影响;不受阈值取值的影响】【AUC的计算方式:统计所有正负样本对中的正序对】

    评价二值分类器的指标很多,比如precision.recall.F1 score.P-R曲线等.但这些指标或多或少只能反映模型在某一方面的性能.相比而言,ROC曲线则有很多优点,经常作为评估二值分类器 ...

  6. 正确率/精度(precision),召回率(recall),F1-score,ROC 曲线,AUC值

    准确率(accuaracy)= (TP+TN)/ ALL 即(TP+TN+FP+FN),是我们最熟知的. 正确率/精度(precision),召回率(recall),F1-score,ROC 曲线,A ...

  7. 【杂纪】从ROC曲线到AUC值,再到Mann–Whitney U统计量

    统计检验中的两类错误 在进行假设检验时,分别提出原假设(Null Hypothesis)和备择假设(Alternative Hypothesis),检验结果可能出现的两类错误: 原假设实际上是正确的, ...

  8. 【性能评估】ROC曲线

    1.混淆矩阵(confusion matrix) 针对预测值和真实值之间的关系,我们可以将样本分为四个部分,分别是: 真正例(True Positive,TP):预测值和真实值都为1 假正例(Fals ...

  9. ROC曲线及其代码实现

    一.基本概念 ROC曲线(Receiver Operating Characteeristic Curve)是显示Classification模型真正率和假正率之间折中的一种图形化方法. 解读ROC图 ...

最新文章

  1. cv2.VideoCapture().set(propId, value)设置摄像头图片大小的用法
  2. GPT-2大战GPT-3:OpenAI内部的一场终极对决
  3. Windows Azure Marketplace入门教学-利用TabLeau Public构建可视化DataMarket应用
  4. 联想计算机农村,农村的联想
  5. 感知器python代码
  6. Java 7和Java 8之间的细微自动关闭合同更改
  7. 黑客借“甲型流感”传毒 挂马疾病预防控制中心网站
  8. 时间戳timestamp
  9. linux源代码阅读笔记 find_entry分析
  10. 2019年三峡大学计算机考研名单,三峡大学2019硕士研究生复试录取方案
  11. 微信小程序+vant Weapp Slider 滑块实现滑动拖动计数器
  12. 毕业论文格式(图片题注引用,表格,公式格式)
  13. 程序员在囧途之垃圾创业团队 .
  14. 浪潮配置ipim_浪潮服务器管理口IP设置_IPMI设置
  15. PPT导出高分辨率dpi图片
  16. selenium+chromedriver自动打开谷歌进行搜索
  17. c#操作excel方式三:使用Microsoft.Office.Interop.Excel.dll读取Excel文件
  18. PLC故障排查步骤的思路和方法
  19. 阿里云小程序时代来临,中小企业和商家该如何入局
  20. 寻求大量iOS app马甲包上架appstore

热门文章

  1. 【InstallShield】入门介绍
  2. 路由选择协议——RIP协议
  3. springboot 发邮件的方式
  4. oracle 月份是英文,月份单词怎么写
  5. U8入库单后台查询处理 常用 SQL 语句(持续更新)
  6. 阿里云邮件推送,邮件模板加EmailCamel退订链接,加速模板通过审核!
  7. 广州的程序员收入水平如何?我来和大家聊一聊真实情况
  8. 玩着也能学python素材_Python是个什么鬼?为什么设计大牛都在学它?!
  9. 调度:确定性模型中的符号
  10. markdown编辑器实现代码高亮