[Python] 二元分类结果之PR曲线的AUC与AP如何计算?

【预备知识】

【指标计算】

代码先行:

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),计算图中淡蓝色区域面积S=\sum_{i=1}^{n-1}S_i=0.7917,而AP = \sum \left (R_n-R_{n-1})P_n \right=0.833使用线性插值(linear interpolation).如下图绿色区域所示。

 

【结论】

  • 单纯计算平均精确率可以用AP,更进一步,若是计算曲线下方面积来进行精细的性能对比,则使用AUC。对于非线性曲线,二者一般不能替换。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值