分类排序里的 AP 怎么算:别把阶梯加权换成梯形面积
同一批分类预测,两个评测脚本都说自己在算“PR曲线下面积”,数字却对不上。先别归因于浮点误差:一个可能计算非插值平均精确率AP,另一个把曲线点用直线连接后做梯形积分。把五条记录列出来,差别就能追到每一次阈值变化。
AI生成的概念示意图:排序卡片随阈值进入候选,部分卡片并列;阶梯与位置不代表真实评测曲线。
从分数排序开始留下每一个分母
五条记录按分数从高到低为0.9、0.8、0.7、0.6、0.5,真实标签依次为1、0、1、0、1。共有三个正例。阈值逐步降低,每纳入一条,就计算精确率“已纳入的正例数除以已纳入总数”与召回率“已纳入的正例数除以三个正例”。
五个位置的精确率分别是1、1/2、2/3、1/2、3/5;召回率分别是1/3、1/3、2/3、2/3、1。第二和第四条是负例,加入它们会改变精确率,但召回率没有增加。
非插值AP按召回增量分配权重
按scikit-learn文档中的定义,AP把每个阈值的精确率乘以本次召回增量,再求和。这里只有三个正例位置产生各1/3的增量,因此AP=(1+2/3+3/5)/3=34/45,约0.755556。
对不存在并列分数的二分类排序,这也等于各正例所在位置的精确率平均值。分母是正例总数,不是五条记录的总数。把五个精确率一股脑取均值,会让不增加召回的负例位置也获得权重,算出另一个指标。
若把相邻PR点用直线连接,包含召回为0时精确率为1的惯例端点,再做梯形积分,本例得到32/45,约0.711111。两者差异不是四舍五入。插值方式改变了点与点之间怎样计面积,而且不能假定梯形法在每份数据上都固定高于AP。
并列分数必须作为同一个阈值组
再把第二条负例的分数从0.8改成0.9,让它与第一条正例并列。降到阈值0.9时两条一起进入,精确率为1/2、召回率为1/3。随后两个正例位置的精确率仍为2/3与3/5,AP变成(1/2+2/3+3/5)/3=53/90,约0.588889。
若先按记录ID把这个并列组拆开,恰好让正例排前,再套用逐条正例平均,可能错误得到原来的0.755556。模型没有给出组内优先次序,评测代码不能借真实标签替它选择有利排序。验收时应打乱并列组的输入行序,确认分数保持不变。
指标名称要和任务定义一起保存
可以请AI输出“每个不同阈值、该组新增正负例数、累计精确率、召回增量与AP贡献”,最后与库函数逐项对照。再对所有分数施加严格递增变换,比如平方本例的非负分数;排序和并列关系不变,AP也应不变,但概率校准含义可能已经改变。
检测任务里的AP还可能先按交并比匹配目标,再采用插值或多个阈值平均;多类别任务也涉及宏平均、微平均或类别权重。不能只看到“AP”三个字就拿本文数字去对比另一协议。报告需写清正类、样本集合、并列规则、权重以及库版本。
最后,AP评价的是整段排序表现,不直接替你选部署阈值。若实际只允许人工复核前十条,还应单独看那个工作点的精确率和召回率。把总排序指标与实际使用位置并列记录,才能解释一次模型更新究竟改善了哪里。
资料核对日期:2026年10月3日。本文数值为原创教学设定,已用本地程序复算,未进行真实网络训练或生产效果测试。
参考资料
scikit-learn:average_precision_score与非插值定义
scikit-learn:precision_recall_curve阈值与端点


