Spark - AUC、Accuracy、Precision、Recall、F1-Score 理论与实战

news/2024/4/28 16:49:05/文章来源:https://blog.csdn.net/BIT_666/article/details/129965706

一.引言

推荐场景下需要使用上述指标评估离、在线模型效果,下面对各个指标做简单说明并通过 spark 程序全部搞定。

二.指标含义

1.TP、TN、FP、FN

搜广推场景下最常见的就是 Ctr 2 分类场景,对于真实值 real 和预测值 pre 分别有 0 和 1 两种可能,从而最终 2x2 产生 4 种可能性:

- TP 真正率 对的预测对,即 1 预测为 1,在图中体现为观察与预测均为 Spring

- FP 假正率 错的预测对,即 0 预测为 1,在图中体现为 NoSpring 预测为 Spring

- FN 假负率 对的预测错,即 1 预测为 0,在图中体现为 Spring 预测为 NoSpring

- TN 真阴率 错的预测错,即 0 预测为 0,在图中体现为 NoSpring 预测为 NoSpring

整理后如下图所示:

2.Accuracy、Precision、Recall、F1-Score

根据上面提到的 TP、TN、FP、FN,有了上述几个指标的定义:

- Accuracy 准确率

即不管是0还是1,预测正确即可

Accuracy=\frac{TP + TN }{TP + FP + FN + TN}

- Precision 精度

即预测为1的样本中确实为1的样本比例,该指标只管预测为1的样本

Precsion=\frac{TP}{TP + FP}

- Recall 召回率

即样本中正样本有多少预测为正,该指标只管真实为1的样本

Recall=\frac{TP}{TP+FN}

- F1-Score

平衡分数,用于定义 Precision 与 Recall 的调和平均数

F_1Score=2\cdot \frac{Precision\cdot Recall}{Precision+Recall}

- Fβ-Score

平衡分数,相比于 F1 更加灵活的调和平均数

F_{\beta}Score=(1+\beta^2)\cdot \frac{Precision\cdot Recall}{(\beta^2\cdot Precision)+Recall}

通过调节 β 参数,可以使指标更偏向于不同的 metrics,β>1 例如 F2-Score 时,Recall 的权重高于 Precision,相反如果 β < 1例如 F0.5-Score 则 Precision 权重高于 Recall,这个把分子拆分开即可轻松得出结论。

3.AUC

AUC(Area Under Curve)被定义为ROC曲线下的面积,针对给定的一批对正负样本,用分类器分别预测一对正负样本,正样本预测概率大于负样本预测概率的概率即对应面积大小。

3.1 常规计算

假定这批样本中存在 M 个正样本,N 个负样本,分类器为 Tk,则 AUC 计算公式如下:

AUC=\frac{\sum I(P_{positive},P_{Nagative})}{M\cdot N}

其中 P 的计算根据学习器 Tk:

P = T_k(x)

I 为示性函数:

I(P_{positive}, P_{negative})=\left\{\begin{matrix} 1, P_{positive} > P_{negative} \\ 0.5, P_{positive}=P_{negative}\\ 0, P_{positive}<P_{negative} \end{matrix}\right.

3.2 快速计算

上面是基础的 AUC 计算公式,由于需要对每一对正负样本预测概率进行比对,而实际场景下 M 与 N 都非常大从而造成运行速度缓慢的问题,优化后公式如下:

AUC=\frac{\sum_{i\in Positive} rank_i - \frac{M(M+1)}{2}}{M \cdot N}

简单约分下:

AUC=\frac{\sum_{i\in Positive} rank_i}{M \cdot N}-\frac{(M+1)}{2N}

这个公式也比较好理解,由于 AUC 并不关注分数而是关注正负样本的序,因此我们将全部预测样本排序,针对每个正样本,其序就代表了它超过了多少个样本的预测值,针对每个正样本可以得到总的序为:

\sum _{_i\in Positive} rank_i

但是由于每一次序的排列中,除了负样本外还有正样本,针对 rank 最高的正样本,其下有 M-1 个正样本,rank 第二高的,其下有 M-2 个正样本,依次类推,共有:

0+1+...+(M-1) = \frac{(M-1)\cdot M}{2}

所以需要在 ∑ rank 的基础上再减去 (M-1)·M / 2,至于为什么有公式是 M·(M+1) 有的是 (M-1)·M,这个其实和你计算的序即 rank 是从 0 开始还是从 1 开始,如果从 1 开始,则等差数列求和公式结果就是 M·(M+1) 反之即为  (M-1)·M。

3.3 手推计算

按照 M-1 即从 0 开始的 rank 计算:

AUC = \frac{5 + 4 + 2}{3 \cdot 3} - \frac{2}{2 \cdot 3}=\frac{11}{9}-\frac{1}{3}=\frac{8}{9}\approx 0.8889

按照 M+1 即从 1 开始的 rank 计算:

AUC = \frac{6+5+3}{3\cdot3} - \frac{4}{2 \cdot 3} = \frac{14}{9}-\frac{2}{3}=\frac{8}{9}\approx 0.8889

最后用最原始的方法计算一下,即将所有组合进行遍历:

AUC = \frac{I_{0,9} \cdot 3 + I_{0.7}\cdot3+I_{0.55}\cdot2}{3 \cdot 3} = \frac{8}{9} \approx 0.8889

这里 I 为上面提到的示性函数。

Tips:

这里还有一种特殊情况即有多个正负样本分值相同,此时排序后其 rank 值可以取所有相同分数的 rank 值平均代表其 rank,不过在大数据且 CTR 精度较高条件下,这个 rank 带来的影响可以近似忽略。

三.Spark 实现

1.数据预处理

    val rankResult = inputRdd.map { case (realLabel, preLabel, preScore) => {// val preLabel = if (preScore > 0.5) "1" else "-1"(realLabel, preLabel, preScore)}}.filter(_._3 >= 0)rankResult.persist(StorageLevel.MEMORY_AND_DISK_SER_2)

原始数据格式为 realLabel 和 preScore,这里可以通过 preScore + 阈值进行推理推断出 preLabel,即可得到三列元组的 RDD。实际计算过程中,你的 RDD 元祖只要有:

- Real Label 真实标签

- Predict Score 模型预测分

两个元素即可。

2.计算 TP、FP、FN、TN

    /*计算相关数值TP: 真正率 对的预测对FP: 假正率 错的预测对FN: 假负率 对的预测错TN: 真阴率 错的预测错*/val threshold = 0.5val dataTP = rankResult.filter(x => x._1 == 1 && x._3 >= threshold).cache()val dataFP = rankResult.filter(x => x._1 != 1 && x._3 >= threshold).cache()val dataFN = rankResult.filter(x => x._1 == 1 && x._3 < threshold).cache()val dataTN = rankResult.filter(x => x._1 != 1 && x._3 < threshold).cache()val TP = dataTP.count()val FP = dataFP.count()val FN = dataFN.count()val TN = dataTN.count()val total = TP + FN + FP + TN

根据定义计算指标即可:

- TP 真正率 对的预测对

- FP 假正率 错的预测对

- FN 假负率 对的预测错

- TN 真阴率 错的预测错

Tips:

这里阈值常规为 0.5,大家也可以根据自己场景的需求进行阈值调整,对于 AUC 而言,其计算只关注序不关注分数,而 TP、TN 这些指标则与阈值分数相关。其次这里一定要加 persist,否则性能会慢很多。

3.计算 Precision、Recall、Accuracy、F1-Score

基于 TP、FP、FN、TN 计算 Precision、Recall 与 Accuracy,最后计算 F1-Score,大家也可以自定义 β,实现 F-β 参数。

    val Precision = if ((TP + FP) > 0) (TP * 1.0) / (TP + FP) else 0.0val Recall = if ((TP + FN) > 0) (TP * 1.0) / (TP + FN) else 0.0val Accuracy = if (total > 0) (TP + TN) * 1.0 / total else 0.0val F1Score = if ((Precision + Recall) > 0.0) (2 * Precision * Recall) / (Precision + Recall) else 0.0

4.计算 AUC

    // sort by predictval sorted = rankResult.sortBy(x => x._3)val numTotal = sorted.count() // M + Nval numPositive = rankResult.filter(x => x._1 == 1).count // Mval numNegative = numTotal - numPositive // Nval sumRanks = sorted.zipWithIndex().filter(x => x._1._1 == 1).map(x => x._2 + 1).reduce(_ + _)val AUC = if (numNegative > 0 & numPositive > 0) {sumRanks * 1.0 / numPositive / numNegative - (numPositive + 1.0) / 2.0 / numNegative} else 0.0

直接根据 predict  分排序即可,这也再次呼应前面 Tips 提到的,AUC 只关注正负样本的序,最后套用约分后的公式即可:

AUC=\frac{\sum_{i\in Positive} rank_i}{M \cdot N}-\frac{(M+1)}{2N}

其中 M = numPositive,N = numNegative。

四.总结

AUC  评估的优点是:

- 对数据不平衡的情况有很好的适应能力,不受正负样本比例影响

- 评估结果简单,易于理解

- 不会受到分类器的阈值选择的影响

AUC 评估的缺点是:

- 不直接给出分类器的分类阈值

- 不适用于多分类问题

针对不同问题,除了 AUC 还有很多指标可供参考,大家需要根据自己的场景需求选择最优的评估指标,或者基于现有指标进行拓展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_283938.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Windows内核开发

Windows内核开发 Unit01对话框 对话框是一种很特殊的窗口&#xff0c;体现在消息的处理上 //普通窗口处理消息:自定义函数调用缺省消息处理函数 WndProc(...){...DefWindowProc(...); }//对话框窗口处理消息&#xff1a;缺省函数调用自定义函数 缺省函数(...){...自定义函数…

从繁琐的采集工作中解放出来,让拓客变得更高效

近年来&#xff0c;企业拓客发展越来越受到重视&#xff0c;但是拓客的过程中却面临着很多的挑战&#xff0c;其中最为繁琐的工作就是采集工作。采集工作不仅耗费大量的时间和精力&#xff0c;还容易出现误差和遗漏&#xff0c;影响到整个拓客的效率和质量。为了解决这个问题&a…

6.Swagger的实战使用

六.Swagger的实战使用 1.什么是swagger 2.swagger的基本使用 3.swagger实战使用 六.Swagger的实战使用 1.什么是swagger swagger是后端接口文档的生成并且提供ui界面进行测试过去用postman测试 缺点&#xff1a;需要自己写地址&#xff0c;如果项目变了需要自己更改 2.sw…

MySQL事务 【事务操作丨事务四大特性丨事务隔离级别丨事务原理】

在实际的开发过程中&#xff0c;一个业务操作如&#xff1a;转账&#xff0c;往往是要多次访问数据库才能完成的。转账是一个用户扣钱&#xff0c;另一个用户加钱。如果其中有一条 SQL 语句出现异常&#xff0c;这条 SQL 就可能执行失败。 事务是一组操作的集合&#xff0c;它…

计讯物联小型水库雨水情测报与大坝安全监测一体化解决方案,确保水库安全运行

方案背景 防洪治理工程是一项重大的民生工程&#xff0c;也是重大的生态工程。基于我国水灾频发的大背景下&#xff0c;小型水库作为防汛抗洪的重要基础设施&#xff0c;其雨水情测报与大坝安全监测是十分有必要的&#xff0c;不仅可为预防水灾、防汛决策提供大量可靠的数据和资…

深入浅出:理解 RPC 和 Dubbo 架构

简介 Apache Dubbo是一款高性能的Java RPC框架.其前身是阿里巴巴公司开源的一个高性能,轻量级的开源Java RPC框架,可以和Spring框架无缝集成. Dubbo 官网 RPC RPC介绍 Remote Procedure Call 远程过程调用,是分布式架构的核心,按响应方式分以下两种: 同步调用:客户端调用…

CAN通讯协议

1&#xff09; CAN介绍 a) 什么是CAN? b) CAN总线特点 c) CAN应用场景 2&#xff09;CAN物理层 a) CAN物理层特性 b) CAN收发器芯片介绍 3&#xff09;CAN协议层 a) CAN帧种类介绍 b) CAN数据帧介绍 c) CAN位时序介绍 d) CAN总线仲裁 a)、CAN介绍 CAN&#xff08;Controlle…

SpringBoot中配置文件加密及跨域支持

给application.properties文件中的某些值加密,比如数据库账号密码等. 引入依赖 <dependency><groupId>com.github.ulisesbocchio</groupId><artifactId>jasypt-spring-boot-starter</artifactId><version>3.0.3</version> </dep…

并行分布式计算 并行计算机体系结构

文章目录并行分布式计算 并行计算机体系结构并行计算机结构模型SIMD 单指令多数据流PVP 并行向量处理机SMP 对称多处理机MPP 大规模并行处理机DSM 分布式共享存储多处理机COW 工作站集群总结并行计算机访存模型UMA 均匀存储访问模型NUMA 非均匀存储访问模型COMA 全高速缓存存储…

Nestjs实战干货-概况-控制器-Controller

Controller 控制器 控制器负责处理传入的请求并向客户返回响应。 一个控制器的目的是接收应用程序的特定请求。路由机制控制哪个控制器接收哪些请求。通常&#xff0c;每个控制器有一个以上的路由&#xff0c;不同的路由可以执行不同的动作。 为了创建一个基本的控制器&#…

【游戏逆向】加密坐标浅析

这个游戏里面坐标有很多种存放方式。 例如明文存放的DOUBLE&#xff0c;加密的各种类型。 我们不知道哪一个对于我们是有用的,哪一些只是辅助UI或则掉到LUA虚拟机坑里的数据。 那就根据作用大小来决定,一一尝试吧。 最好去找修改之后有效果的地址&#xff0c;当然只是本地&…

MySQL中count(1)和count(*)哪个性能好?

当我们对某一张表中的数据需要统计数量的时候&#xff0c;我们通常会用到count(1)、count(*)或者count(字段)&#xff0c;而这三种哪个方式的count效率最高呢&#xff1f;先来说结论&#xff1a; count(1) count(*) > count(字段) 为什么会得到如上的结论&#xff0c;下面来…

1672_MIT 6.828 xv6中如何通过构建环境让系统中增加一个可执行调用文件

全部学习汇总&#xff1a; GreyZhang/g_unix: some basic learning about unix operating system. (github.com) 前面已经分析了如何实现一个系统调用&#xff0c;这个过程的梳理也已经整理成了一份学习笔记。这一次看一下&#xff0c;如何让OS的系统中增加这样的一个可执行的文…

Arduino2.0.4的安装以及上传错误:exit status2

一、安装并下载Arduino 可以进入到下面这个网站中下载会比较快。 Arduino IDE下载&#xff08;9月15日更新到2.0&#xff09;-Arduino爱好者 - Powered by Discuz! Arduino IDE下载&#xff08;9月15日更新到2.0&#xff09;-Arduino爱好者 - Powered by Discuz!Arduino IDE下…

【基于冗余缩减变换:Pan-Sharpening】

Pan-Sharpening Based on Transformer With Redundancy Reduction &#xff08;基于冗余缩减变换的全色锐化算法&#xff09; 基于深度神经网络&#xff08;DNN&#xff09;的泛锐化方法已经产生了最先进的结果。然而&#xff0c;在全色&#xff08;PAN&#xff09;图像和低空…

Python-Python基本用法(全:含基本语法、用户交互、流程控制、数据类型、函数、面向对象、读写文件、异常、断言等)

1 环境准备 编辑器&#xff1a;Welcome to Python.org 解释器&#xff1a;pycharm&#xff1a;Thank you for downloading PyCharm! (jetbrains.com) 2 Quick start 创建项目 new project create demo print(Dad!!)3 基本语法 3.1 print 直接打印 print(Dad!!)拼接打印…

AD20添加元件3D库

Altium Designer是画PCB常用的工具之一,为了PCB的美观性,我们可以采用3D的方式查看已经画好的PCB板。但在这之前需要准备好每个元器件的3D模型。 1、下载3D格式模型 http://www.3dcontentcentral.cn 当然要先注册账户。 在搜索栏输入你想要找的器件。 模型格式STEP AP214…

vue-cli 初始化工程

个人记录下vue-cli创建项目的步骤 卸载老版本的vue-cli (这不是必要的) npm uninstall vue-cli -g 如果本地使用 yarn的话,还需执行 yarn global remove vue-cli 安装全新的vue-cli npm install -g vue/cli 安装指定版本的vue-cli npm install -g vue/…

linux 安装git并拉取代码教程

#一步一步执行以下命令sudo apt install git #安装gitgit --version #查看安装版本号git config user.name jtr #设置用户名git config user.email jiangtrcloudskysec.com #设置邮箱ssh-keygen -t rsa -C "jiangtrcloudskysec.com" #生成秘钥&#xff0c;一直往下按…

自动化测试框架:DrissionPage(1)——安装与设置

发现了一款基于Python的网页自动化工具&#xff1a;DrissionPage。这款工具既能控制浏览器&#xff0c;也能收发数据包&#xff0c;甚至能把两者合而为一&#xff0c;简单来说&#xff1a;集合了WEB浏览器自动化的便利性和 requests 的高效率优点。 一、DrissionPage框架产生背…