使用梯形规则或矩形方法计算平均精度更好吗?

机器算法验证 机器学习 scikit-学习 模型评估 平均精度
2022-03-13 23:13:59

背景

平均精度是一种流行且重要的性能指标,广泛用于例如检索和检测任务。它测量精度召回曲线下的面积,该曲线绘制所有可能检测阈值的精度值与各自的召回值。

典型的精确召回曲线看起来有点像这样。

精确召回曲线

混乱

由于在任何给定的有限数据集上只需要评估有限数量的阈值,因此精确召回曲线是分段线性函数。因此,我一直认为计算该曲线下面积的正确方法是使用梯形规则

ap = sum( (recall[k+1] - recall[k]) * (precision[k+1] - precision[k]) / 2 )

显然,不仅我这么认为,因为用于评估牛津建筑数据集结果的官方代码(这是基于内容的图像检索中广泛使用的基准)也以这种方式计算 AP。

但是,scikit-learnPython 的包在函数中计算平均精度的方式不同sklearn.metrics.average_precision_score,遵循Wikipedia 中对 AP 的定义他们使用矩形方法

ap = sum( (recall[k+1] - recall[k]) * precision[k+1] )

在上面给出的示例中,这将使用下图中的红色函数来近似精确召回曲线下的面积:

使用矩形法逼近 AP

的文档scikit-learn对此进行了以下说明:

这种实现不同于使用梯形规则计算精确召回曲线下的面积,梯形规则使用线性插值并且可能过于乐观。

另一方面,牛津建筑数据集的一位策展人在 StackOverflow 上的一个相关问题中解释说,矩形方法将是“常用的更差近似”。

问题

糟糕的是,不同的基准和不同的包使用不同的平均精度变体来比较方法,但现在我想知道:

  • 这两个版本中的哪一个是“更好”的做法?梯形法则还是矩形法?
  • 各有什么优缺点?
  • scikit-learn文档中关于梯形规则“过于乐观”的说法是什么意思?
2个回答

对于分段线性函数,使用在“片段”的每个末端都具有端点的梯形规则将产生曲线下的确切面积——即,它相当于曲线下的积分。当梯形与分段线性函数中的线完全对应时,就会发生这种情况。(当然,如果函数中的片段的端点不是梯形的端点,则这不成立。)相反,矩形方法不会给出曲线下的确切面积,但如果使用它应该是接近的大量的矩形。

至于哪种方法更好,如果计算上可行,精确方法(梯形)更好。我不知道为什么它不应该比矩形方法在计算上更昂贵,因为唯一的区别是它使用每个端点的平均高度而不是最大高度。如果我们使用端点划分召回值r0<r1<<rn那么我们有:

矩形区域=ķ=1n(rķ-rķ-1)×最大限度((rķ),(rķ-1)),梯形面积=ķ=1n(rķ-rķ-1)×(rķ)+(rķ-1)2.

假设这些端点包含分段线性函数的端点,很容易证明梯形面积是曲线下的精确面积。

更新

这篇期刊文章解释了由于 Precision-Recall 曲线的非线性特性,为什么线性插值既“过于乐观”又“不正确”:https ://www.biostat.wisc.edu/~page/rocpr .pdf

这篇文章在 scikit-learn 文档中被称为“[Davis2006]”,以解释为什么线性插值在这里不合适和“过于乐观”。请参阅:https ://scikit-learn.org/stable/modules/model_evaluation.html#precision-recall-f-measure-metrics

还,

该函数sklearn.metrics.average_precision_score不使用矩形规则,或任何黎曼和,无论是否正确。它使用“平均精度”。公式非常不同。

在此处输入图像描述

请注意,f(x) 与 Pi 非常非常不同。由于精度和召回率的公式,平均精度实际上是计算平均值,离散值介于 0 和 1 之间。关于黎曼,f(x) = y。这为您提供了乘以增量的高度。那里没有平均。

平均精度最类似于中点规则,因为它们都在做平均。

请注意,R 对平均精度使用相同的公式:https ://www.rdocumentation.org/packages/yardstick/versions/0.0.4/topics/average_precision