首页 > 编程语言 >Python利用Seaborn绘制ROC和PR曲线以及AUC与AUPR的计算

Python利用Seaborn绘制ROC和PR曲线以及AUC与AUPR的计算

时间:2024-06-01 17:28:48浏览次数:27  
标签:PR AUPR AUC 曲线 text ROC TP plt

目录

一、ROC和PR曲线定义

1.1 ROC曲线与AUROC

  ROC曲线 [1], [2](Receiver Operating Characteristic Curve,接收者操作特征曲线)是一种用于评估二分类模型性能的重要工具。ROC曲线通过不同阈值下的真阳性率(True Positive Rate, TPR)和假阳性率(False Positive Rate, FPR)的变化情况,直观地展示模型的分类能力。具体而言,ROC曲线的横轴表示假阳性率,纵轴表示真阳性率。假阳性率是指将负样本错误地分类为正样本的比例,而真阳性率是指将正样本正确地分类为正样本的比例。通过调整分类阈值,可以得到一系列不同的假阳性率和真阳性率,从而绘制出ROC曲线

TPR = TP TP + FN ,FPR = FP TN + FP \text{TPR} = \frac{\text{TP}}{\text{TP} + \text{FN}},\text{FPR} = \frac{\text{FP}}{\text{TN} + \text{FP}} TPR=TP+FNTP​,FPR=TN+FPFP​
其中,TP为真阳性,TN为真阴性,FN为假阴性,FP为假阳性。

  一个理想的分类器应该在ROC曲线上尽可能接近左上角,即假阳性率为0,真阳性率为1。ROC曲线下的面积(AUROC, Area Under ROC)是衡量分类器性能的一个重要指标, AUROC (或称AUC)的值介于0和1之间。AUROC值越接近1,说明分类器的性能越好;值为0.5时,说明分类器的表现与随机猜测相当。AUROC < 0.5,比随机猜测还差;但只要总是反预测而行,就优于随机猜测。

  在实际应用中,ROC曲线和AUC可以帮助我们选择最合适的分类阈值,比较不同分类器的性能,并判断模型是否具有较高的鉴别能力。

1.2 PR曲线与AUPRC

  PR曲线 [3], [4](Precision-Recall Curve,精确率-召回率曲线)是另一种用于评估二分类模型性能的工具,特别适用于数据不平衡的情况。PR曲线通过展示不同阈值下的精确率(Precision)和召回率(Recall),帮助评估模型在识别少数类样本时的表现。具体而言,PR曲线的横轴表示召回率纵轴表示精确率

  • 精确率(Precision):也称为正预测值(Positive Predictive Value),是指模型预测为正的样本中实际为正的比例。计算公式为:

    Precision = TP TP + FP \text{Precision} = \frac{\text{TP}}{\text{TP} + \text{FP}} Precision=TP+FPTP​

    其中,TP为真阳性,FP为假阳性。

  • 召回率(Recall):也称为敏感性(Sensitivity)或真阳性率(True Positive Rate),是指实际为正的样本中被正确预测为正的比例。计算公式为:
    Recall = TP TP + FN \text{Recall} = \frac{\text{TP}}{\text{TP} + \text{FN}} Recall=TP+FNTP​
    其中,FN为假阴性。

  PR曲线通过调整分类阈值,得到一系列不同的精确率和召回率,从而绘制出曲线。在PR曲线中,高精确率和高召回率都是理想的目标,但两者通常存在权衡关系。通过PR曲线,可以观察模型在不同阈值下的精确率和召回率的变化情况,从而选择最合适的阈值。

  AUPRCArea Under Precision-Recall Curve,PR曲线下的面积)是衡量PR曲线性能的一个重要指标。AUPRC (或称AUPR) 的值介于0和1之间,值越接近1,说明分类器的性能越好。AUPRC特别适用于评估少数类样本,因为它更关注模型在少数类上的表现。

  总的来说,PR曲线和AUPR提供了一种评估分类模型性能的有效手段,特别是在数据不平衡的情况下,它们能够更准确地反映模型在识别少数类样本时的能力 [3], [4]。

二、环境需求

  (1)使用Python绘图需要借助第三方库Matplotlib以及Seaborn。(2)绘制ROC曲线和PR曲线前的数据预处理,以及AUROC与AUPRC的计算需要借助机器学习库scikit-learn。因此,需要在已有Python环境中安装这三个库,安装方式如下:

pip install matplotlib
pip install seaborn
pip install scikit-learn

三、样例数据

   在绘制ROC曲线和PR曲线前,博主准备了两个预训练二分类模型,并在测试集上测试它们,获得对应的预测分数和预测标签,其部分数据如下:

数据样式
在这里插入图片描述

(注:数据可以从此处获取
链接:https://pan.baidu.com/s/1R5X-_4kGuMXTc8Qi1Sc7xQ?pwd=rk45
提取码:rk45)

四、Seaborn绘制ROC和PR曲线

4.1 ROC曲线绘制和AUROC计算

(1)代码:

"""导入所需的python工具包"""
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.metrics import roc_curve, auc

if __name__ == "__main__":
    """数据格式转换为DataFrame格式"""
    modelData1 = pd.read_csv("./model1.csv")
    modelData2 = pd.read_csv("./model2.csv")

    """设置样式"""
    sns.set_theme("paper", font_scale=1.5)
    sns.set_style("darkgrid")

    """model1 计算AUROC和准备绘制ROC曲线数据"""
    #model1
    fpr, tpr, thresholds =roc_curve(modelData1["y_true"], modelData1["y_score"], pos_label=1)
    model_auroc = auc(fpr, tpr)
    sns.lineplot(x=fpr, y=tpr, color="red", label=f"model1 (AUROC={model_auroc:0.4f})")

    #model2
    fpr, tpr, thresholds = roc_curve(modelData2["y_true"], modelData2["y_score"], pos_label=1)
    model_auroc = auc(fpr, tpr)
    sns.lineplot(x=fpr, y=tpr, color="blue", label=f"model2 (AUROC={model_auroc:0.4f})")
    #设置标题,x,y标签
    plt.title("ROC")
    plt.xlabel("FPR")
    plt.ylabel("TPR")
    """注:先保存再显示,否则保存图片为空"""
    #保存
    plt.savefig("./AUROC.png", dpi=300)
    #显示
    plt.show()

(2)输出结果:
ROC

4.2 PR曲线绘制和AUPRC计算

(1)代码:

"""导入所需的python工具包"""
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
from sklearn.metrics import precision_recall_curve, average_precision_score, auc

if __name__ == "__main__":
    """数据格式转换为DataFrame格式"""
    modelData1 = pd.read_csv("./model1.csv")
    modelData2 = pd.read_csv("./model2.csv")

    """设置样式"""
    sns.set_theme("paper", font_scale=1.5)
    sns.set_style("whitegrid")

    """model1 计算AUPRC和准备绘制PR曲线数据"""
    #model1
    # fpr, tpr, thresholds =roc_curve(modelData1["y_true"], modelData1["y_score"], pos_label=1)
    precision, recall, thresholds = precision_recall_curve(modelData1["y_true"], modelData1["y_score"])
    model_auprc = average_precision_score(modelData1["y_true"], modelData1["y_score"])
    """或以下方式计算AURPC"""
    #model_auprc = auc(recall, precision)
    sns.lineplot(x=recall, y=precision, color="red", label=f"model1 (AUPRC={model_auprc:0.4f})")

    #model2
    precision, recall, thresholds = precision_recall_curve(modelData2["y_true"], modelData2["y_score"])
    model_auprc = average_precision_score(modelData2["y_true"], modelData2["y_score"])
    sns.lineplot(x=recall, y=precision, color="blue", label=f"model2 (AUPRC={model_auprc:0.4f})")

    #设置标题,x,y标签
    plt.title("PRC")
    plt.xlabel("Recall")
    plt.ylabel("Precision")
    """注:先保存再显示,否则保存图片为空"""
    #保存
    plt.savefig("./AUPRC.png", dpi=300)
    #显示
    plt.show()

(2)输出结果:
PRC

再次声明,代码中所涉及的数据可以从以下链接获取:
链接:https://pan.baidu.com/s/1R5X-_4kGuMXTc8Qi1Sc7xQ?pwd=rk45
提取码:rk45)

五、参考文献

[1] Hanley, J. A. and McNeil, B. J. (1982). “The Meaning and Use of the Area under a Receiver Operating Characteristic (ROC) Curve.”
[2] Fawcett, T. (2006). “An introduction to ROC analysis.”
[3] Davis, J. and Goadrich, M. (2006). “The Relationship Between Precision-Recall and ROC Curves.”
[4] Saito, T. and Rehmsmeier, M. (2015). “The precision-recall plot is more informative than the ROC plot when evaluating binary classifiers on imbalanced datasets.”

标签:PR,AUPR,AUC,曲线,text,ROC,TP,plt
From: https://blog.csdn.net/qq_45647530/article/details/139346525

相关文章

  • 报错信息:Unable to make field private final java.lang.Class java.lang.invoke.Seri
    jdk版本与当前MyBatisPlus版本不兼容解决方法:1.升级MyBatisPlus的版本。2.或者使用以下方法--add-opensjava.base/java.lang.invoke=ALL-UNNAMED......
  • css38 CSS Image Sprites
    https://www.w3schools.com/css/css_image_sprites.asp ImageSpritesAnimagespriteisacollectionofimagesputintoasingleimage.Awebpagewithmanyimagescantakealongtimetoloadandgeneratesmultipleserverrequests.Usingimagespriteswi......
  • 使用SpringBoot对Brc20 Ordinals铭文诊断管理系统全开源
    ......
  • CentOS Linux 8x 错误:为仓库 ‘appstream‘ 下载元数据失败 : Cannot prepare interna
    问题描述今天安装CentOS8.5安装完之后,准备更新源仓库环境的时候突然出现错误:为仓库'appstream'下载元数据失败:Cannotprepareinternalmirrorlist:NoURLsinmirrorlist,后面我找了好久没发现有解决这个问题的方法,后面无意看到了https://www.cnblogs.com/cainiaoaixuexi......
  • SpringMVC:@RequestMapping注解
    1.@RequestMapping作用@RequestMapping`注解是SpringMVC框架中的一个控制器映射注解,用于将请求映射到相应的处理方法上。具体来说,它可以将指定URL的请求绑定到一个特定的方法或类上,从而实现对请求的处理和响应。2. 出现位置的区别出现在类上//@RequestMapping注......
  • MapReduce学习之MapJoin案例实现
    MapReduce学习之MapJoin案例实现1.当前main方法所在的入口类packagecom.shujia.mr.mapJoin;importcom.shujia.mr.reduceJoin.ReduceJoin;importcom.shujia.mr.reduceJoin.ReduceJoinMapper;importcom.shujia.mr.reduceJoin.ReduceJoinReducer;importorg.apache.......
  • 基于SpringBoot+Vue的在线答疑管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的在线答疑管理系统,项目源码请点击文章末尾联系我哦~目前有各类成......
  • 基于SpringBoot+Vue的在线BLOG网管理系统设计与实现毕设(文档+源码)
            目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的在线BLOG网管理系统,项目源码请点击文章末尾联系我哦~目前有各类......
  • 基于SpringBoot+Vue的校园博客管理系统设计与实现毕设(文档+源码)
          目录一、项目介绍二、开发环境三、功能介绍四、核心代码五、效果图六、源码获取:        大家好呀,我是一个混迹在java圈的码农。今天要和大家分享的是一款基于SpringBoot+Vue的校园博客管理系统,项目源码请点击文章末尾联系我哦~目前有各类成品毕......
  • SpringBoot 中获取项目的路径和文件流
    SSMweb项目以工程名为TEST为例:(1)得到包含工程名的当前页面全路径:request.getRequestURI()结果:/TEST/test.jsp(2)得到工程名:request.getContextPath()结果:/TEST(3)得到当前页面所在目录下全名称:request.getServletPath()结果:如果页面在jsp目录下/TEST/jsp/test.jsp......