PR曲线阈值规则及sklearn average_precision计算mAP结果合理性问询
PR曲线阈值规则与sklearn average_precision接口计算行为说明
PR曲线的阈值设置规则
PR曲线的阈值没有通用的自定义统一规则,主流实现的统一逻辑为:基于输入的所有唯一预测置信度/概率值降序排列生成阈值,每个阈值对应「大于等于该阈值的样本判定为正样本,小于的判定为负样本」的分类规则,确保覆盖所有可能的分类切分点对应的精度、召回组合。
sklearn接口的计算行为判定
该计算行为符合标准实现逻辑,属于正确行为。
针对你给出的测试数据:
y_true = np.array([0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]) y_scores = np.array([ 0.7088982, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0])
属于极端边界场景,所有正样本的预测得分均为0,仅1个负样本得分更高:
- sklearn会自动合并相同的预测得分,最终生成
0.7088982和0两个阈值 - 阈值取
0.7088982时,仅得分最高的负样本被判定为正,此时精度为0,召回为0 - 阈值取
0时,所有样本被判定为正,此时真阳性为14,假阳性为1,精度为14/(14+1)=0.93333,召回为1 - sklearn的
average_precision接口采用PR曲线下面积的标准计算逻辑,在这种相同得分批量合并的场景下,最终计算得到的面积就是0.93333,和输出结果一致。
不符合业务预期时的调整方案
如果你的使用场景不允许阈值低至0,可通过以下方式调整:
- 手动过滤预测得分低于自定义最低阈值的样本,再传入接口计算
- 自行实现AP计算逻辑,自行控制阈值生成规则
- 将低于业务最低阈值的预测得分统一设置为极小值(如-1),避免接口生成过低的阈值
内容的提问来源于stack exchange,提问作者lolololo
相关产品推荐
相关产品推荐

