ROC(全称为Receiver operating characteristic,意为受试者特征曲线)是一个二维平面空间中一条曲线,而AUC则是曲线下方面积(Area Under Curve)的计算结果,是一个具体的值

x轴是FPR,y轴是TPR,曲线上的每个点就对应着一组(FPR,TPR)坐标,所以我们的任务就是计算出所有的(FPR,TPR)坐标然后用线把他们连接起来就形成了ROC曲线,而AUC可以通过曲线下面积计算而来。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.metrics import RocCurveDisplay

首先手动创建一组预测值和对应的真实值,0一般为负类,1为正类,而且正类多设置为研究中较为关心的标签,比如把1设置为肿瘤,或者疾病。

np.random.seed(1314)
geneA = np.random.uniform(size=10)
label = [0]*5 + [1]*5
df = pd.DataFrame({'geneA':geneA,'label':label})
df = df.sort_values('geneA',ascending=False)
df.reset_index(drop=True,inplace=True) # 恢复行索引从0开始递增
df
  geneA  label
0 0.928483 1
1 0.864400 0
2 0.828642 1
3 0.749421 0
4 0.464414 1
5 0.407268 1
6 0.210935 0
7 0.140796 0
8 0.082719 0
9 0.012973 1

从1开始降低阈值,当geneA小于阈值时被预测为0类,当geneA大于阈值时被预测为1类;

当阈值为1时,所有样本被预测为0类,则可以算得FPR=FP/AN;TPR= TP/AP

  • FP:(假阳性)真实为0类,但是却被预测为1类的样本个数;
  • AN:(真阴性)真实为0类的样本个数;
  • TP:(真阳性)真实为1类,被预测为1类的样本个数;
  • AP:(真阳性)真实为1类的样本个数;

此时FPR=0/5=0; FPR=0/5=0。因此,可以得到第一个坐标(0,0)

降低阈值,当阈值=0.9时, 第0条数据被预测为1类,而且其真实标签也为1;此时FPR=0/5=0; TPR=1/5=0。因此,可以得到第一个坐标(0,0.2)

降低阈值,当阈值=0.8时,第0、2条数据真实标签为0,但是却被预测为1;第2、3、5条数据真实标签为1,也被预测为1,因此,此时FPR=1/5=0.2; TPR=2/5=0.4。因此,可以得到下一个坐标(0.2,0.4)

# 定义ROC曲线绘制函数
def plot_ROC(y_true, y_pred, threds, title='ROC_curve'):
   """
   ROC绘制曲线函数:
   :param y_true: 样本真实类别
   :param y_pred: 模型输出的类别概率判别结果
   :param threds: 阈值1Darray
   :param title: 折线图的图例
   :return: no return
   """
   TPR_l = []
   FPR_l = []
   for i in threds:
       y_cla = np.array(y_pred>i,dtype=int)  # True 转变成1, False = 0
       Positive = y_cla[y_true > 0.5]
       TPR_l.append(Positive.mean())
       Negtive = y_cla[y_true < 0.5]
       FPR_l.append(Negtive.mean())
   plt.plot(FPR_l, TPR_l, label=title)
   plt.plot([0,1], [0,1], '--')
   plt.xlabel('FPR')
   plt.ylabel('TPR')
   # p = plt.gcf()
   # p.set_size_inches(4, 4)

为了模仿sklearn中的ROC图,这里的阈值列表设置为[0,1]之间随机取1000个数,可以看到图形和sklearn的一模一样。

plot_ROC(y_true=np.array(label),y_pred=geneA,
 threds=np.linspace(0,1,1000,endpoint=True))

# sklearn 绘图
RocCurveDisplay.from_predictions(label,geneA)
plt.plot([0,1], [0,1], '--');

计算AUC,AUC的定义是曲线下面积,按道理可以计算面积就行,但是如果样本较多,则会变成一条近似的曲线,计算了太大,因此有更好的方法计算AUC,比如

  • P:正样本个数,1类;
  • N:负样本个数,0类;
  • ri: 正样本的排序号,下边dataframe中rank那一列
df = df.sort_values('geneA',ascending=True)
df.reset_index(drop=True,inplace=True) # 恢复行索引从0开始递增
df['Rank'] = df.index + 1 # 新增加一列是geneA排序大小
df
geneA  label  Rank
0 0.012973 1 1
1 0.082719 0 2
2 0.140796 0 3
3 0.210935 0 4
4 0.407268 1 5
5 0.464414 1 6
6 0.749421 0 7
7 0.828642 1 8
8 0.864400 0 9
9 0.928483 1 10

按照公式分别计算,得到AUC为0.6,下边我们把auc计算写成一个函数

P = 5; N =5; PP = P*(P+1)/2
((1+5+6+8+10) - PP) / (P * N)
def auc(y_true, y_pred):
df = pd.DataFrame({'y_true':y_true,'y_pred':y_pred})
df = df.sort_values('y_pred',ascending=True)
df.reset_index(drop=True,inplace=True) # 恢复行索引从0开始递增
df['Rank'] = df.index + 1 # 新增加一列是geneA排序大小
P = np.nansum(df.y_true > 0.5)
N = df.shape[0] - P
PP = P*(P+1)/2
r = map(lambda x: np.mean(df.Rank[df.y_pred == df.y_pred[x]]), df.index[df.y_true == 1])
AUC = (np.nansum(list(r))-PP)/(P*N)
return AUC

map这样写是因为,如果有一个1类的y_pred数值(本例中geneA)和另一个0类的geneA数值相同的话,需要计算他们两个的Rank数值的均值

map(lambda x: np.mean(df.Rank[df.y_pred == df.y_pred[x]]), df.index[df.y_true == 1])

手动计算ROC-AUC的更多相关文章

  1. 一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC

    参考资料:https://zhuanlan.zhihu.com/p/46714763 ROC/AUC作为机器学习的评估指标非常重要,也是面试中经常出现的问题(80%都会问到).其实,理解它并不是非常难 ...

  2. CRC校验码原理、实例、手动计算

    目录一.CRC16实现代码二.CRC32编码字符表三.CRC校验码的手动计算示例四.CRC校验原理五.CRC的生成多项式参考 一.CRC16实现代码 思路:取一个字符(8bit),逐位检查该字符,如果 ...

  3. ROC AUC

    1.什么是性能度量? 我们都知道机器学习要建模,但是对于模型性能的好坏(即模型的泛化能力),我们并不知道是怎样的,很可能这个模型就是一个差的模型,泛化能力弱,对测试集不能很好的预测或分类.那么如何知道 ...

  4. Python C3 算法 手动计算顺序

    Python C3 算法 手动计算顺序   手动计算类继承C3算法原则: 以所求类的直接子类的数目分成相应部分 按照从左往右的顺序依次写出继承关系 继承关系第一个第一位,在所有后面关系都是第一个出现的 ...

  5. 模型评测之IoU,mAP,ROC,AUC

    IOU 在目标检测算法中,交并比Intersection-over-Union,IoU是一个流行的评测方式,是指产生的候选框candidate bound与原标记框ground truth bound ...

  6. ROC & AUC笔记

    易懂:http://alexkong.net/2013/06/introduction-to-auc-and-roc/ 分析全面但难懂:http://mlwiki.org/index.php/ROC_ ...

  7. 分类器的评价指标-ROC&AUC

    ROC 曲线:接收者操作特征曲线(receiver operating characteristic curve),是反映敏感性和特异性连续变量的综合指标,roc 曲线上每个点反映着对同一信号刺激的感 ...

  8. keras 上添加 roc auc指标

    https://stackoverflow.com/questions/41032551/how-to-compute-receiving-operating-characteristic-roc-a ...

  9. Precision/Recall、ROC/AUC、AP/MAP等概念区分

    1. Precision和Recall Precision,准确率/查准率.Recall,召回率/查全率.这两个指标分别以两个角度衡量分类系统的准确率. 例如,有一个池塘,里面共有1000条鱼,含10 ...

  10. 准确率,召回率,F值,ROC,AUC

    度量表 1.准确率 (presion) p=TPTP+FP 理解为你预测对的正例数占你预测正例总量的比率,假设实际有90个正例,10个负例,你预测80(75+,5-)个正例,20(15+,5-)个负例 ...

随机推荐

  1. FastApi学习1

    先写路由文件: 其次通过ORM操作数据库相关:

  2. 实现Swaggera的在线接口调试

    1.访问Swagger的路径是:http://localhost:8080/swagger-ui.html 如果项目正常,则可看到如下界面: 2.点开下面的随意一个方法 如add添加数据的方法,展开: ...

  3. 2022春每日一题:Day 33

    题目:[USACO 6.1.3] Cow XOR 没找到这题具体网址,这个题就是求最大异或区间(总长度尽量小,右端点尽量大) 嗯很显然一个[l,r]的异或和=s[r]s[l-1],那么现在有了优秀的n ...

  4. Go语言核心36讲25

    你好,我是郝林,今天我分享的主题是:测试的基本规则和流程(上). 你很棒,已经学完了本专栏最大的一个模块!这涉及了Go语言的所有内建数据类型,以及非常有特色的那些流程和语句. 你已经完全可以去独立编写 ...

  5. C ++:树

    C++:树 树的概念: 所谓"树"是输就结构的一种,树大概可以分为两大类: 有根树 和 无根树 有根树使有一个确定的根节点,反之为无根树 · 子节点:从树根开始,通过树边向下扩展的 ...

  6. 万字 HashMap 详解,基础(优雅)永不过时

    本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 提问. 前言 大家好,我是小彭. 在上一篇文章里,我们聊到了散列表的整体设计思想,在后续几篇文章里,我们将以 Jav ...

  7. xml中出现< >&等特殊字符如何存储

    特殊字符用下面对应得符号代替. < <= > >= & ' " < <= > >= & &apos; "

  8. 【大数据面试】Flink 01 概述:包含内容、层次架构、运行组件、部署模式、任务提交流程、任务调度概念、编程模型组成

    一.概述 1.介绍 对无界和有界数据流进行有状态计算的分布式引擎和框架,并可以使用高层API编写分布式任务,主要包括: DataSet API(批处理):静态数据抽象为分布式数据集,方便使用操作符进行 ...

  9. 【CDH数仓】Day02:业务数仓搭建、Kerberos安全认证+Sentry权限管理、集群性能测试及资源管理、邮件报警、数据备份、节点添加删除、CDH的卸载

    五.业务数仓搭建 1.业务数据生成 建库建表gmall 需求:生成日期2019年2月10日数据.订单1000个.用户200个.商品sku300个.删除原始数据. CALL init_data('201 ...

  10. 单一JVM同步锁实现

    同步锁实现 一.背景 在并发场景下,需要单一线程或限定并发数操作某些逻辑,这时候就需要用到一个锁来保证线程安全. 二.思路 使用ConcurrentHashMap实现,但只支持同一个jvm下的线程(暂 ...