Average Precision名称中的“平均”,容易被读成把各个阈值的精确率直接相加再除以点数。scikit-learn 1.9.1的average_precision_score文档给出的定义并非如此:每个阈值处的精确率,要按相对于前一个阈值的召回增加量加权,再汇总成AP。[1] 权重来自召回变化,而不是每个阈值天然占同样一份。

文档的公式分别用精确率与召回表示当前阈值对应的量,并用相邻召回的差作为该项精确率的权重。[1] 这说明单个阈值处的精确率,不能独自说明它对汇总AP贡献多少;还需要知道这一项覆盖了多少新增召回。只留下几个精确率数值而删掉相邻召回关系,会遗漏定义中真正参与加权的部分。

可以直接从定义作一项定性理解:若某一项的召回增加量为零,该项便不因精确率数值存在而取得正的增量权重。[1] 这不是本文另造的一份模型成绩,也没有选择业务阈值;它只是说明为何按点数等权平均,与官方所述AP不是同一种汇总方式。

实现方式还有另一个明确限制。该接口说明采用不插值的AP,区别于用梯形规则计算Precision-Recall曲线面积;后者在点之间作线性插值,文档说可能过度乐观。[1] 这里的“可能”不能删成任何数据上梯形结果必然严格更大。两种说法的关键区别,是是否在相邻工作点之间补出线性变化,而不是只看最终都得到一个小数分数。

输入也应与这层定义对应。y_score可以是正类概率估计,或者未经阈值化的decision值,而不是只有最终离散类别标签。[1] 概率估计与decision分数由文档分别列出,不能把任意decision值直接抄为概率百分比。本文采用的是评分输入的类型说明,没有训练分类器或重新选择阈值。

参数average属于另一个汇总层次。它控制多标签或多类别资料的聚合方式,而AP定义中按召回变化加权的是阈值之间的关系;二分类y_true下,文档明确说average会被忽略。[1] 本文不重述各类别平均策略,也不把两个位置都出现“平均”就视为同一项权重。辨认是在跨阈值还是跨类别汇总,才能知道名称实际在回答什么。

版本注记把这项行为变化追溯到0.19:改为按召回变化加权,而不是在工作点之间线性插值。[1] 这是历史实现变化的说明,不是当前网页首次发布日期。采用时实际文档题首为1.9.1,首发仍未知。

对AI开发资料阅读,AP的具体用途是把一组阈值对应的精确率与召回变化按既定规则汇总。本文没有执行示例、从图取值、比较真实模型优劣,亦不作医疗、金融或部署可靠性判断。报告若要说明取得的是什么分数,应保留实现版本与汇总规则,而不只留下一个“平均精确率”的中文名称。

资料:[1] https://scikit-learn.org/stable/modules/generated/sklearn.metrics.average_precision_score.html

信息来源

本文基于上述公开资料整理,未使用来源页面的图片、视频或嵌入媒体。