目录
一、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曲线,可以观察模型在不同阈值下的精确率和召回率的变化情况,从而选择最合适的阈值。
AUPRC(Area 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)输出结果:
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)输出结果:
(再次声明,代码中所涉及的数据可以从以下链接获取:
链接:https://pan.baidu.com/s/1R5X-_4kGuMXTc8Qi1Sc7xQ?pwd=rk45
提取码:rk45)
五、参考文献
标签:PR,AUPR,AUC,曲线,text,ROC,TP,plt From: https://blog.csdn.net/qq_45647530/article/details/139346525[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.”