AUC两种计算方式
时间:2021-09-04
本文章向大家介绍AUC两种计算方式,主要包括AUC两种计算方式使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
1.通过ROC曲线面积计算AUC
AUC(Area Under Curve)被定义为ROC曲线下的面积。
ROC 曲线横坐标:假正率=FPR=FP/N: 预测为负 and 实际为正 / 实际为负
ROC 曲线纵坐标:真正率=TPR= TP/P :预测为正 and 实际为正 / 实际为正
注意:有相同预估值时,需要等当前预估值作为阈值的所有 tp,fp 算完,再更新最终 auc
def calcAUC_byRocArea(label,pred): P = 0.0 N = 0.0 TP = 0.0 FP = 0.0 TPR = 0.0 FPR = 0.0 LAST_TRP = 0.0 LAST_FPR = 0.0 auc = 0.0 for l in label: if l == 0: N+=1 else: P+=1 sample = zip(label,pred) sample_sorted = sorted(sample,key=lambda x: -x[1]) for i,info in enumerate(sample_sorted): l,p = info if l == 1: TP+=1 else: FP+=1 if i !=0 and i+1 < len(sample) and p == sample_sorted[i+1][1]: continue TPR = TP/P FPR = FP/N auc+=0.5*(TPR+LAST_TRP)*(FPR-LAST_FPR) LAST_FPR=FPR LAST_TRP=TPR return auc
2.通过计算概率计算AUC
AUC还有一种解释就是任取一对正负样本,正样本的预测值大于负样本的预测值的概率。
2.1 暴力 时间复杂度 o(n2)
(1)遍历 label, 选出正样本、负样本。
(2)遍历正负样本 pair,记录正样本 pred> 负样本 pred 的个数为 cnt
(3) auc = cnt / 正样本个数* 负样本个数。
1 from sklearn.metrics import roc_auc_score 2 import numpy as np 3 4 def calcAUC_byProb(label,pred): 5 pos_porb = [] 6 neg_prob = [] 7 for i in range(len(label)): 8 if label[i] == 1: 9 pos_porb.append(pred[i]) 10 elif label[i] == 0: 11 neg_prob.append(pred[i]) 12 cnt = 0.0 13 for p in pos_porb: 14 for n in neg_prob: 15 if (p>n): 16 cnt+=1 17 elif(p == n): 18 cnt+=0.5 19 return cnt / float(len(pos_porb)*len(neg_prob)) 20 21 y = np.array([1, 1, 1, 0,0]) 22 pred = np.array([0.6,0.3, 0.5 ,0.2,0.4]) 23 print("sklearn auc:",roc_auc_score(y, pred)) 24 #print("my auc calc by area:", calcAUC_byRocArea(y, pred)) 25 print("my auc calc by prob:", calcAUC_byProb(y, pred))
2.2 动态规划,时间复杂度0(nlogn)
(1)按照预估值降序,组成 pair。
(2)遍历pair, 如果 label==1,记录正样本个数 pos,
如果 label==0, 对于当前样本来说,前面所有的正样本个数pos就是 当前样本与所有正样本预估值大于当前负样本预估值的个数。
(3)auc = pos / (pos *n-pos)
1 def calcAUC_byProb(label,pred): 2 sample = zip(label,pred) 3 sample_sorted = sorted(sample,key=lambda x: -x[1]) 4 pos = 0 5 cnt = 0 6 last_pred = 0 7 print(sample_sorted) 8 for i in range(len(sample_sorted)): 9 l,p = sample_sorted[i] 10 if l == 1: 11 pos+=1 12 elif l == 0: 13 cnt += pos 14 if (i!=0 and last_pred ==p): 15 cnt-=0.5 16 last_pred = p 17 negs = len(label) - pos 18 print (cnt,pos,negs) 19 return float(cnt) / float(pos*negs)
原文地址:https://www.cnblogs.com/zle1992/p/15227396.html
- 简化Swagger使用的自制Starter:spring-boot-starter-swagger,欢迎使用和吐槽
- demo3同通讯录展示的方式分组排序
- Android手势研究(textview及listview对比验证)
- demo2动态加载显示商品详情页
- demo1 动态显示view或弹框 动态隐藏view或弹框
- ios 继承UITableViewController,更改tableview样式
- demo1 动态显示view或弹框 动态隐藏view或弹框
- 从零开始的Spring Security Oauth2(一)
- 细说Android事件传递
- swift基础_ set get方法 理解
- 高仿今日头条(2)
- ios tableview 上加 textfiled
- Spring Cloud实战小贴士:Feign的继承特性(伪RPC模式)
- 仿淘宝购买详情页购买缩小动画
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Packetdrill的简明使用手册
- Laravel5.1 框架模型远层一对多关系实例分析
- Linux系统中时间的获取和使用
- thinkphp5.1验证码及验证码验证功能的实现详解
- LNMP部署及HTTPS服务开启教程
- Laravel5.1 框架模型多态关联用法实例分析
- Laravel5.1 框架分页展示实现方法实例分析
- composer安装的方法步骤(图文)
- Linux双网卡绑定脚本的办法示例
- thinkphp调用sqlserver储存过程返回多个结果集
- php命名空间设计思想、用法与缺点分析
- Laravel5.1 框架登录和注册实现方法详解
- linux中叹号命令(!)的使用小结
- 基于opencv的selenium滑动验证码的实现
- Laravel5.1 框架文件管理操作实例分析