[Python] 二元分类结果之PR曲线的AUC与AP如何计算?
程序员文章站
2022-07-14 14:52:19
...
【预备知识】
- 关于二元分类结果度量/评价指标PR、ROC曲线,可以参考博客(强烈推荐):[一文让你彻底理解准确率,精准率,召回率,真正率,假正率,ROC/AUC]
- Pyhotn中对于ROC以及PR曲线绘制、AUC/AP的计算均可在 sklearn.metrics 中实现(绘制依靠matplotlib.pyplot)。
【指标计算】
代码先行:
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
# ======================== data ===============================
y = np.array([0, 0, 1, 1]) # label
pred = np.array([0.1, 0.4, 0.35, 0.8]) # probability or score
# ======================= metrics ============================
precision, recall, threshold = metrics.precision_recall_curve(y, pred)
print(recall)
print(precision)
print(threshold)
pr_auc = metrics.auc(recall, precision) # 梯形块分割,建议使用
pr_auc0 = metrics.average_precision_score(y, pred) # 小矩形块分割
print(pr_auc)
print(pr_auc0)
# ======================= PLoting =============================
plt.figure(1)
plt.plot(recall, precision, label=f"PR_AUC = {pr_auc:.2f}\nAP = {pr_auc0:.2f}",
linewidth=2, linestyle='-', color='r', marker='o')
plt.fill_between(recall, y1=precision, y2=0, step=None, alpha=0.2, color='b')
plt.title("PR-Curve")
plt.xlabel("Recall")
plt.ylabel("Precision")
plt.ylim([0, 1.05])
plt.legend()
plt.show()
运行结果:
>>
[1. 0.5 0.5 0. ]
[0.66666667 0.5 1. 1. ]
[0.35 0.4 0.8 ]
0.7916666666666666
0.8333333333333333
【解惑】
- AUC表明的是PR曲线下面积,是对分类结果的综合评价;AP是平均精确率(Average Precision)二者差异?
ROC采用梯形计算法则(Trapezoidal rule),计算图中淡蓝色区域面积,而使用线性插值(linear interpolation).如下图绿色区域所示。
【结论】
- 单纯计算平均精确率可以用AP,更进一步,若是计算曲线下方面积来进行精细的性能对比,则使用AUC。对于非线性曲线,二者一般不能替换。
上一篇: [Python] 使用约登指数寻找最佳ROC曲线阈值
下一篇: GDAL图像分割算法实现