小白也能看懂的 AUC 详解

这篇具有很好参考价值的文章主要介绍了小白也能看懂的 AUC 详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

简介

上篇文章 小白也能看懂的 ROC 曲线详解 介绍了 ROC 曲线。本文介绍 AUC。AUC 的全名为Area Under the ROC Curve,即 ROC 曲线下的面积,最大为 1。

小白也能看懂的 AUC 详解

根据 ROC 和 AUC 的关系,我们可以得到如下结论

  • ROC 曲线接近左上角 ---> AUC 接近 1:模型预测准确率很高
  • ROC 曲线略高于基准线 ---> AUC 略大于 0.5:模型预测准确率一般
  • ROC 低于基准线 ---> AUC 小于 0.5:模型未达到最低标准,无法使用

二分类 AUC

由 AUC 名称可知,可以先计算 ROC 曲线,得到 TPR 和 FPR 的坐标后再分段计算面积即可得到 AUC

小白也能看懂的 AUC 详解

下面是对应的 Python 代码

def auc_from_roc(fpr, tpr):
    """
    计算ROC面积
    fpr: 从小到大排序的fpr坐标
    tpr: 从小到大排序的tpr坐标
    """
    area = 0
    for i in range(len(fpr) - 1):
        area += trapezoid_area(fpr[i], fpr[i + 1], tpr[i], tpr[i + 1])
    return area
    
def trapezoid_area(x1, x2, y1, y2):
    """
    计算梯形面积
    x1, x2: 横坐标 (x1 <= x2)
    y1, y2: 纵坐标 (y1 <= y2)
    """
    base = x2 - x1
    height_avg = (y1 + y2) / 2
    return base * height_avg

也可以直接从真实标签和模型预测分数中计算 ROC,算法的时间复杂度为\(O(n\log n)\),参考文献 1 中的算法 2

# import numpy as np
def auc_binary(y_true, y_score, pos_label):
    """
    y_true:真实标签
    y_score:模型预测分数
    pos_label:正样本标签,如“1”
    """
    num_positive_examples = (y_true == pos_label).sum()
    num_negtive_examples = len(y_true) - num_positive_examples

    tp, fp, tp_prev, fp_prev, area = 0, 0, 0, 0, 0
    score = -np.inf

    for i in np.flip(np.argsort(y_score)):
        if y_score[i] != score:
            area += trapezoid_area(fp_prev, fp, tp_prev, tp)
            score = y_score[i]
            fp_prev = fp
            tp_prev = tp

        if y_true[i] == pos_label:
            tp += 1
        else:
            fp += 1

    area += trapezoid_area(fp_prev, fp, tp_prev, tp)
    area /= num_positive_examples * num_negtive_examples

    return area

多分类 AUC

现在考虑多分类的情况,假设类别数为\(C\)

一种想法是将某一类别设为正样本类别,其余类别设为负样本类别,然后计算二分类下的 AUC。这种方法叫做一对多,即 One-Vs-Rest (OVR)。可以得到\(C\)个二分类的 AUC,然后计算平均数得到多分类的 AUC。

另一种想法是将某一类别设为正样本类别,另外一个类别(非自身)设为负样本类别计算二分类的 AUC。这种方法叫做一对一,即 One-Vs-One (OVO)。可以得到\(C(C-1)\)个二分类的 AUC,然后计算平均数。

小白也能看懂的 AUC 详解

当计算平均数时,可以考虑算数平均数(称为 macro),或者加权平均数(称为 weighted)。其中,加权为各类别的样本所占比例。因此,两两组合可以的得到四种计算多分类 AUC 的方法。值得一提的是,知名机器学习库 scikit-learn 的 roc_auc_score 函数 包含了上述四种方法。

  1. 一对多 + 算数平均数(OVR + macro)
  2. 一对多 + 加权平均数(OVR + weighted)
  3. 一对一 + 算数平均数(OVO + macro)
  4. 一对一 + 加权平均数(OVO + weighted)

一对多 + 算数平均数

多分类 AUC 的计算公式为

\[\text{AUC}_\text{total}=\frac{1}{C}\sum_{c_i\in C}\text{AUC}(c_i) \]

其中\(\text{AUC}(c_i)\)是将类别\(c_i\)作为正样本类别(剩余作为负样本类别),计算的二分类 AUC。

# sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', multi_class='ovr')
def auc_ovr_macro(y_true, y_score):
    auc = 0
    C = max(y_true) + 1

    for i in range(C):
        auc += auc_binary(y_true, y_score[:, i], pos_label=i)

    return auc / C

一对多 + 加权平均数

多分类 AUC 的计算公式为

\[\text{AUC}_\text{total}=\sum_{c_i\in C}\text{AUC}(c_i)p(c_i) \]

其中,权重\(p(c_i)=\frac{\sum\mathbb{I}\{y=c_i\}}{n}\),即标签为\(c_i\)的样本所占比例,权重之和为 1。

# sklearn.metrics.roc_auc_score(y_true, y_score, average='weighted', multi_class='ovr')
def auc_ovr_weighted(y_true, y_score):
    auc = 0
    C = max(y_true) + 1
    n = len(y_true)

    for i in range(C):
        p = sum(y_true == i) / n
        auc += auc_binary(y_true, y_score[:, i], pos_label=i) * p

    return auc

一对一 + 算数平均数

多分类 AUC 的计算公式为

\[\text{AUC}_\text{total}=\frac{2}{C(C-1)}\sum_{\{c_i,c_j\}\in C,\ c_i<c_j}\text{AUC}(c_i,c_j) \]

其中,\(\text{AUC}(c_i,c_j)=\frac{\text{AUC}(c_i|c_j)+\text{AUC}(c_j|c_i )}{2}\)。即将\(c_i\)作为正样本类别、\(c_j\)作为负样本类别计算二分类\(\text{AUC}(c_i|c_j)\);然后将\(c_j\)作为正样本类别、\(c_i\)作为负样本类别计算二分类\(\text{AUC}(c_j|c_i)\)\(\text{AUC}(c_i,c_j)\)为其计算的算数平均值。由于将\(c_i\)\(c_j\)组合计算,共得到\(C(C-1)/2\) 个二分类 AUC。

# sklearn.metrics.roc_auc_score(y_true, y_score, average='macro', multi_class='ovo')
def auc_ovo_macro(y_true, y_score):
    auc = 0
    C = max(y_true) + 1

    for i in range(C - 1):
        i_index = np.where(y_true == i)[0]
        for j in range(i + 1, C):
            j_index = np.where(y_true == j)[0]
            index = np.concatenate((i_index, j_index))

            auc_i_j = auc_binary(y_true[index], y_score[index, i], pos_label=i)
            auc_j_i = auc_binary(y_true[index], y_score[index, j], pos_label=j)
            auc += (auc_i_j + auc_j_i) / 2

    return auc * 2 / (C * (C - 1))

一对一 + 加权平均数

多分类 AUC 的计算公式为

\[\text{AUC}_\text{total}=\sum_{\{c_i,c_j\}\in C,\ c_i<c_j}\text{AUC}(c_i,c_j)p(c_i,c_j) \]

其中,权重\(p(c_i,c_j)=\frac{\sum\mathbb{I}\{y=c_i\}+\sum\mathbb{I}\{y=c_j\}}{(C-1)n}\),即标签为\(c_i\)\(c_j\)的样本所占比例,分母中的系数\(C-1\)使得权重之和为 1。

# sklearn.metrics.roc_auc_score(y_true, y_score, average='weighted', multi_class='ovo')
def auc_ovo_weighted(y_true, y_score):
    auc = 0
    C = max(y_true) + 1
    n = len(y_true)

    for i in range(C - 1):
        i_index = np.where(y_true == i)[0]
        for j in range(i + 1, C):
            j_index = np.where(y_true == j)[0]
            index = np.concatenate((i_index, j_index))

            p = len(index) / n / (C - 1)
            auc_i_j = auc_binary(y_true[index], y_score[index, i], pos_label=i)
            auc_j_i = auc_binary(y_true[index], y_score[index, j], pos_label=j)
            auc += (auc_i_j + auc_j_i) / 2 * p

    return auc

参考文献

  1. Fawcett, Tom. "An introduction to ROC analysis." Pattern recognition letters 27, no. 8 (2006): 861-874. https://www.researchgate.net/profile/Tom-Fawcett/publication/222511520_Introduction_to_ROC_analysis/links/5ac7844ca6fdcc8bfc7fa47e/Introduction-to-ROC-analysis.pdf
  2. Hand, David J., and Robert J. Till. "A simple generalisation of the area under the ROC curve for multiple class classification problems." Machine learning 45 (2001): 171-186. https://link.springer.com/content/pdf/10.1023/A:1010920819831.pdf

作者:PrimiHub-Kevin文章来源地址https://www.toymoban.com/news/detail-736599.html

到了这里,关于小白也能看懂的 AUC 详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • [计算几何] 2 二维凸包/笨蛋(我)也能看懂的二维凸包算法

    二维凸包,这篇博客已经说得够好了,介绍了 斜率逼近法、Jarvis算法,Graham算法,还有Andrew算法 。我这篇博客只会非常详细的介绍 Andrew算法 。 数论小白都能看懂的平面凸包详解 - ShineEternal的笔记小屋 - 洛谷博客 (luogu.com.cn) 我相信凭借着我6个粉丝其中5个都是老熟人的传播

    2024年02月15日
    浏览(25)
  • YOLOv8预测参数详解(全面详细、重点突出、大白话阐述小白也能看懂)

    YOLOv8现在可以接受输入很多,如下表所示。包括图像、URL、PIL图像、OpenCV、NumPy数组、Torch张量、CSV文件、视频、目录、通配符、YouTube视频和视频流。表格✅指示了每个输入源是否可以在流模式下使用,并给出了每个输入源使用流模式的示例参数 预测参数 Key Value Description s

    2024年02月11日
    浏览(31)
  • 【计算机视觉】YOLOv8参数详解(全面详细、重点突出、大白话阐述小白也能看懂)

    comments description keywords true Master YOLOv8 settings and hyperparameters for improved model performance. Learn to use YOLO CLI commands, adjust training settings, and optimize YOLO tasks modes. YOLOv8, settings, hyperparameters, YOLO CLI commands, YOLO tasks, YOLO modes, Ultralytics documentation, model optimization, YOLOv8 training YOLO 设置和超参数

    2024年02月05日
    浏览(37)
  • GoogleTest从入门到入门,小白都能看懂的gtest详细教程

    单元测试 项目管理和技术管理中做单元测试,衡量一个软件是否正常的标准,良好的单元测试以及足够多的覆盖率,至少保证关键功能,关键业务的覆盖率接近100%。 gtest是谷歌公司发布的一个跨平台(Linux、Mac OS、Windows等)的C++单元测试框架,它提供了丰富的断言、致命和

    2024年02月07日
    浏览(36)
  • Java 零基础入门学习(小白也能看懂!)

    📚博客主页:爱敲代码的小杨. ✨专栏:《Java SE语法》 ❤️感谢大家点赞👍🏻收藏⭐评论✍🏻,您的三连就是我持续更新的动力❤️ 1.1.1什么是 Java Java是一种优秀的程序设计语言 ,它具有令人赏心悦目的语法和易于理解的语义。 不仅如此, Java还是一个有一系列计算机软

    2024年01月19日
    浏览(33)
  • STP生成树协议(超详细小白也能看懂)

    目录 一、为什么要用STP 二、STP的作用 三、STP操作 四、STP名词解释: 五、生成树选举办法 六、生成树选举因素 七、根桥选举: 八、根端口的选举 九、端口状态 十、定时器 十一、故障恢复时间         十二、广播风暴 十三、广播风暴危害 十四、BPDU组成 十五、STP的一

    2024年02月09日
    浏览(32)
  • 【外行也能看懂的RabbitMQ系列(三)】—— RabbitMQ进阶篇之死信队列(内含视频演示业务和业务代码)

    准备篇 RabbitMQ安装文档 第一章 RabbitMQ快速入门篇 第二章 RabbitMQ的Web管理界面详解 第三章 RabbitMQ进阶篇之死信队列 第四章 RabbitMQ进阶篇之通过插件实现延迟队列 恭喜所有看到本篇文章的小伙伴,成功解锁了RabbitMQ系列之高级特性 死信队列 的内容🎁通过本文,你将清楚的了解

    2024年02月07日
    浏览(29)
  • 纯小白也能看懂,十分钟帮你快速了解云原生概念

    随着云原生相关技术的蓬勃发展,不管你是刚入职的小白,还是多年经验的老手,都在关注这种技术趋势。但相关内容太多,导致一些小白无从入手,也没有一个全局的概念。那就花10分钟看完本文,帮你快速了解云原生的起源和发展,并介绍一些技术现状 📕作者简介:战斧

    2024年02月14日
    浏览(36)
  • 实际开发中常用的设计模式--------策略模式(知识跟业务场景结合)-----小白也能看懂(通俗易懂版本)

    1.策略模式定义: 策略模式是一种行为型设计模式,它允许在运行时动态地改变对象的行为。策略模式将将每一个算法封装到具有共同接口的独立的类中,从而使得它们可以相互替换从而使得算法的变化不会影响到客户端 2.简单的策略模式示例代码: 在上述代码中,SortStra

    2024年02月13日
    浏览(40)
  • 实际开发中常用的设计模式--------单例模式(知识跟业务场景结合)-----小白也能看懂(通俗易懂版本)

    1.定义 单例模式是一种创建型设计模式,它通过使用私有构造函数和静态方法来确保一个类只有一个实例,并且提供全局访问点来获取该实例。 通过使用单例模式,我们可以方便地管理全局唯一的对象实例,并且避免了多次创建相同类型的对象所带来的资源浪费问题 2.业务场

    2024年02月12日
    浏览(33)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包