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

一、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+FNTPFPR=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.”

  • 33
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用seaborn绘制小提琴图时,可以通过`sns.violinplot()`函数的参数来控制各个元素的样式和布局。下面是一些常用的参数: - `x`, `y`: 指定数据的横纵坐标,可以是DataFrame或Series中的列名,也可以是numpy数组。 - `hue`: 按照某个分类变量对数据进行分组,并用不同颜色的小提琴图表示不同组别的数据。 - `data`: 指定数据源,可以是DataFrame或Series。 - `split`: 是否将小提琴图分成两半,分别表示两个分类变量的数据。默认为False。 - `inner`: 小提琴图内部的样式,可以是“box”,“quartile”,“point”和“stick”中的一种。默认为“box”,表示绘制小提琴图的中位数和四分位数范围。 - `scale`: 小提琴图的宽度缩放因子,可以是“area”,“count”,“width”中的一种。默认为“area”,表示根据样本数量自适应调整小提琴图的宽度。 - `bw`: 控制内核密度估计的带宽大小。默认为"scott",可选值有"scott"、"silverman"和float类型的数值。 - `cut`: 控制小提琴图的截断方式,可以是numpy.percentile的参数或者是一个浮点数。默认为None,表示不截断。 - `color`: 小提琴图的颜色。 - `palette`: 用于绘制分类变量的小提琴图的颜色调色板。 - `linewidth`: 小提琴图边缘线宽度。 - `width`: 小提琴图的宽度。 - `outer`: 是否在小提琴图外部绘制观测值的分布。 - `inner_c`: 小提琴图内部的颜色。 - `ax`: 用于绘制小提琴图的matplotlib子图对象。 使用这些参数可以灵活控制小提琴图的样式和布局。例如,可以通过以下代码绘制一个带有两个分类变量和观测值散点图的小提琴图: ```python import seaborn as sns import matplotlib.pyplot as plt tips = sns.load_dataset("tips") sns.violinplot(x="day", y="total_bill", hue="sex", data=tips, split=True, inner="stick") sns.swarmplot(x="day", y="total_bill", hue="sex", data=tips, dodge=True, color=".2") plt.show() ``` 输出结果如下所示: ![image.png](attachment:image.png) 在这个例子中,我们使用了`tips`数据集中的`day`和`total_bill`两个变量,按照`sex`变量进行了分组,并使用`split=True`将小提琴图分成了两半。另外,我们使用了`inner="stick"`将小提琴图的内部样式设置为“stick”,同时使用`sns.swarmplot()`函数绘制观测值散点图,并使用`dodge=True`将散点图按照`hue`变量进行了分组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值