ROC曲线和AUC,推荐系统中常用AUC作为排序模型的评估指标

文章目录

  • 1、ROC曲线
  • 2、AUC计算及代码

1、ROC曲线

  • 在不同的应用任务中,我们可根据任务需求来采用不同的截断点。如果我们更重视“查准率”,则可选择排序中靠前的位置进行截断;如果更重视“查全率”,则可选择靠后的位置进行截断。 ROC 曲线就是从这个角度出发来研究学习器泛化性能的有力工具。
  • 计算TPR和FPR:
    在这里插入图片描述
  • ROC 曲线的横轴是假正例率 FPR,纵轴是真正例率 TPR

事实上,机器学习模型的一个特点是:在模型性能固定的前提下,如果模型将更多的正例预测为正例,那么也必然会将更多的反例预测为正例。即 TPR越大,则 FPR 也会越大。

  • ROC曲线的绘制流程:

(1)给定 m+个正例和m-个反例,通过分类器得到每个样本的预测概率,对其从高到低进行排序
(2)将分类阈值设为最大,即把所有样例均预测为反例。此时真正例率和假正例率均为0,则 ROC 曲线的起点为 (0,0)
(3)将分类阈值依次设为每个样例的预测值,即依次将每个样例划分为正例。通过该阈值计算(FPR,TPR)坐标,并使用线段连接这些坐标。
(4)将分类阈值设为最小,即把所有样例均预测为正例。此时真正例率和假正例率均为1,则 ROC 曲线的终点为 (1,1)

  • 若一个学习器的 ROC 曲线被另一个学习器的曲线完全“包住”,则可断言后者的性能优于前者; 若两个学习器的 ROC 曲线发生交叉,则难以一般性地断言两者孰优孰劣此时如果一定要进行比较,则较为合理的判据是比较 ROC 曲线下的面积即 AUC (Area Under ROC Curve)

2、AUC计算及代码

  • AUC的意义可以理解为:

解释1:随机采样一对样本(一个正样本,一个负样本),模型将正样本预测为正例的概率大于将负样本预测为正例的概率,即将正样本排在负样本之前的概率。
解释2:模型给一堆样本(正负类别标签已知)预测打分,然后将他们从大到小排序,正样本能够正确排在负样本前面的概率就是AUC,例如下图所示的AUC为 7 9 \frac{7}{9} 97
在这里插入图片描述
(上图来自《互联网大厂推荐算法实战》)

  • 可以把AUC理解为区分正类和负类的能力,当AUC越大,表示区分正负类的能力越强。当模型对正负样本没有区分能力时,模型会将一个样本随机预测为正类或负类,此时AUC=0.5,因此 AUC 的有效范围是(0.5,1]。
  • 根据AUC的意义,可得出如下计算公式:
    在这里插入图片描述
    在这里插入图片描述
  • 根据计算公式,有如下代码:
import numpy as np
from sklearn.metrics import roc_auc_score


# 使用 sklearn 计算 auc
def get_auc_func1(label, pred):
    return roc_auc_score(label, pred)


# 使用物理意义计算 AUC
def get_auc_func2(label, pred):
	# 查找正负样本索引
    pos_sample_ids = [i for i in range(len(label)) if label[i] == 1]
    neg_sample_ids = [i for i in range(len(label)) if label[i] == 0]
	# 计算指示函数值
    sum_indicator_value = 0
    for i in pos_sample_ids:
        for j in neg_sample_ids:
            if pred[i] > pred[j]:
                sum_indicator_value += 1
            elif pred[i] == pred[j]:
                sum_indicator_value += 0.5
    auc = sum_indicator_value / (len(pos_sample_ids) * len(neg_sample_ids))
    return auc


if __name__ == '__main__':
    label = np.array([1, 0, 0, 0, 1, 0])
    pred = np.array([0.9, 0.4, 0.3, 0.1, 0.3, 0.6])
    print(f"auc = {get_auc_func1(label, pred):6f}")  # auc = 0.687500
    print(f"auc = {get_auc_func2(label, pred):6f}")  # auc = 0.687500

  • AUC的优缺点:

优点:
1)AUC 是根据所有分类阈值得到的,不依赖于分类阈值的选取。AUC体现的是对样本的排序能力,与具体的分值无关。因此 AUC 和推荐系统中的大多数业务场景更贴合,因为大多数业务场景关心 item 之间的相对顺序而不关心 item 的预测分。
2)根据 AUC 的物理意义可知,它是对正负样本随机采样计算得到的,因此 AUC 对正负样本分布不敏感

缺点:
1)AUC 是全局性指标,对于某个用户的 AUC 值不准确。
2)AUC 会忽略模型对正负样本的拟合能力:例如当模型对正样本预测概率均为0.55,对负样本预测概率均为0.45时,此时AUC=1,从 AUC 角度来看是一个完美的模型,但模型对正负样本的拟合能力差。
3)AUC通常用于二分类问题,对于多类别分类问题,需要进行适当的处理,如将其拆分成多个二分类任务

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

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

相关文章

C++怎么根据变量名称返回变量的值?

在开始前刚好我有一些资料,是我根据网友给的问题精心整理了一份「C的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家!!! 有点好奇你这么做是为了什么。…

184.二叉树:二叉树的最近公共祖先(力扣)

代码解决 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode(int x) : val(x), left(NULL), right(NULL) {}* };*/ class Solution { public:// 函数用于寻找二叉树中节点 p 和 q 的最低公…

聚类性能度量

在机器学习中,聚类是一种无监督学习,那对于聚类结果,我们应该如何评估其好坏呢?我们这里介绍两类性能度量。 1.外部指标 外部指标的意思是将聚类结果与某个“参考模型”进行比较。哎其实也很好理解,就相当于老师批改卷…

AGI时代引领未来,大模型重塑市场发展

前言 在数字化浪潮席卷全球的今天,人工智能(AI)技术正以前所未有的速度推动着各行各业的变革。其中,大模型作为AI领域的重要分支,正以其独特的优势,为程序员和企业产品经理这两大核心群体开辟出崭新的发展…

# RocketMQ 实战:模拟电商网站场景综合案例(十)

RocketMQ 实战:模拟电商网站场景综合案例(十) 一、RocketMQ 实战:模拟电商网站场景综合案例-- 创建支付订单流程 1、支付订单流程 2、在 shop-pay-service 工程模块中,创建 启动 类 PayServiceApplication.java /***…

MT7981B+MT7976C+MT7531A RF定频测试方法

1、从下面网址下载QA软件包,然后在WIN系统下安装QA环境。 https://download.csdn.net/download/zhouwu_linux/89428691?spm1001.2014.3001.5501 在WINDOWS 7系统下先安装WinPcap_4_1_3.exe。 2、搭建硬件环境,电脑先连接仪器,主板网络与电…

天地图开发实战:Vue结合OpenLayers实现动态点位地图

在Web开发中,地图功能是一个常见的需求,尤其是在需要展示地理位置信息的应用程序中。OpenLayers(简称OL)是一个强大的JavaScript库,用于创建交互式地图。本文将介绍如何利用OpenLayers和天地图API,实现一个…

Mybatis save、saveOrUpdate、update的区别

哈喽,大家好,我是木头左! 1. save方法 Mybatis的save方法用于插入一条新的记录。当数据库中不存在相同的记录时,会执行插入操作;如果已经存在相同的记录,则会抛出异常。 int result sqlSession.insert(&…

电脑桌面提醒做事的app 好用的桌面提醒app

在快节奏的现代生活中,我们每天都要通过电脑处理大量的工作事项。然而,繁忙的工作节奏有时会导致我们遗忘某些重要任务,从而带来不必要的损失。为了避免这种情况,选择一款好用的桌面提醒app显得尤为重要。 想象一下,你…

Java中Transactional在不同方法间的穿透性,rollbackFor参数含义

哈喽,大家好,我是木头左! 在Java开发中,经常会遇到需要在一个事务中执行多个操作的场景。为了确保这些操作的原子性,可以使用Spring框架提供的Transactional注解来实现事务管理。然而,在实际开发过程中&…

CVE-2012-2122-mysql未授权访问漏洞复现-vulhub

1.原理 参考:CVE-2012-2122 Mysql身份认证漏洞及利用-CSDN博客 简单来说,除了配置上的问题以外,是密码的验证出现了漏洞,导致尝试次数多了之后直接可以登入 使用:kalivulhub 2.复现 开一下镜像,用的是v…

代码随想录算法训练营第五十八天 | 392.判断子序列

392.判断子序列 题目链接:代码随想录 视频讲解:动态规划,用相似思路解决复杂问题 | LeetCode:392.判断子序列_哔哩哔哩_bilibili 解题思路 本题和求最长公共子序列是一样的,值就是s字符串的长度,如果一致…

拥抱开源,构建未来:王嘉树与 TDengine 的开源之旅

在当代的技术浪潮中,开源文化不仅催生了无数创新技术,也为广大技术爱好者提供了一个展示才华、相互学习的平台。我们今天采访到的这位北京邮电大学电子工程学院的研究生,就是在这样的背景下,通过开源活动不断探索、学习并实现自我…

C++中extern “C“的用法

目的 extern "C"是经常用到的东西,面试题目也经常出现,然则,实际用时,还是经常遗忘,因此,深入的了解一下,以增强记忆。 extern "C"指令非常有用,因为C和C的近亲…

python -- 异步、asyncio

文章目录 协程实现协成的方法greenlet实现协程yield 关键字asyncio async & await(**重点**) 协程的意义异步编程事件循环快速上手awaitTask对象asyncio.Future对象concurrent.futures.Future 对象 协程 协成不是操作系统提供的,是程序员…

LLM-不要错过,教你如何快速且精准生成提示词?(总结Singapore首届GPT-4提示工程获奖者Sheila Teo博客)

文章目录 前置理论精炼介绍1. CO-STAR框架CO-STAR框架简单介绍CO-STAR简单示例 2. 创建系统提示【优化LLM问答丰富度】何为系统提示?系统提示示例 3. 使用分隔符分段提示【优化问答准度】分割符作特殊字符及CO-STAR示例分割符作XML标记 仅数据的CO-STAR实操前置分析…

如何用西语问候呢,柯桥零基础西班牙语培训

正式问候 在正式场合,如工作会议、正式介绍或第一次见面时,通常使用更为尊敬和礼貌的问候语。以下是一些例子: 1. Buenos das(早上好):从早上到中午使用。这是一个非常常见和礼貌的问候。 2. Buenas tardes(下午好):…

HTML静态网页成品作业(HTML+CSS)—— 节日母亲节介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

2024年3月电子学会青少年软件编程 中小学生Python编程等级考试二级真题解析(判断题)

2024年3月Python编程等级考试二级真题解析 判断题(共10题,每题2分,共20分) 26、元组中的元素可以是不同的数据类型 答案:对 考点分析:考查元元组相关知识,元组里面的元素是可以出现不同的数据…

流程设计的基本步骤

背景 公司为什么要流程,已经有专门章节进行阐述; 什么是流程,已经有专门章节进行专门阐述; 那么接下来这个章节讨论,流程设计的基本步骤,那么谁来设计流程呢,让一个部门的员工来设计一份流程…