对(平均)平均精度的困惑

Confusion about (Mean) Average Precision

问题中,我询问了关于精确召回曲线的说明。

特别问我是不是要考虑固定数量的排名来画曲线还是自己合理选择。根据,第二个是正确的。

但是现在我对平均精度 (AP) 值有很大的疑问:AP 用于从数值上估计我们的算法在给定特定查询的情况下有多好。 Mean Average Precision (MAP) 是多个查询的平均精度。

我的疑问是:如果 AP 根据我们检索的对象数量而变化,那么我们可以调整此参数以使其对我们有利,以便我们显示可能的最佳 AP 值。例如,假设 p-r 曲线在 10 个元素之前表现出色,然后表现糟糕,我们可以 "cheat" 计算仅考虑前 10 个元素的 (M)AP 值。

我知道这听起来可能令人困惑,但我在任何地方都找不到任何相关信息。

你说的部分正确。如果您在前 N 个检索到的文档中获得合理的 MAP 或 AP,那很好。这不是作弊,因为您的 IR 系统正在检索返回的前 N 份文档中的大量相关文档,但是它仍然缺少一些相关文档。 请注意,对于 IR 系统来说,如果它不能检索所有相关文档,而是将所有检索到的相关文档排列在更高的等级,这就是 AP 衡量的,那么它会更好。(更高的等级意味着等级 1 或2 而不是 100 或 101)

考虑一个例子,您有两个相关文档,一个在排名 1 时返回,另一个在排名 50 时返回。现在,如果您计算前 10 个返回文档的 MAP 或 AP,那么您必须报告回答为 MAP@10AP@10。通常 AP 表示所有返回文档的平均精度,但如果您考虑排名前 N 的文档,您的指标将是 AP@N 而不仅仅是 AP 并且 请注意,这不是作弊 !但是,是的,如果您计算 AP@N 并报告为 AP,那么您就是在向读者提供部分信息。

关于 MAP 的重要事实是 - 如果从未检索到相关文档,我们假设与该相关文档对应的精度为零。在计算 AP 时,我们将累积精度除以相关文档总数。所以,当你在计算 MAP@NAP@N 时,这意味着你只关心 IR 系统返回的前 N 个文档。例如,我在 one of my research works.

中使用了 MAP@100

如果您对 AP 或 MAP 感到困惑,可以查看我对它们进行解释的简短回答。希望它能帮助你澄清你的困惑。

AP 是精确召回曲线下的面积,精确召回曲线应该在整个 returned 排名列表上计算。

不可能通过调整 returned 排名列表的大小来欺骗 AP。 AP 是精度-召回曲线下方的区域,该曲线将精度绘制为召回率的函数,其中召回率是 returned 阳性的数量相对于地面实况中存在的阳性总数,而不是相对于returned 列表中的正数。因此,如果您裁剪列表,您所做的就是裁剪精确召回曲线并忽略绘制其尾部。由于 AP 是曲线下的区域,裁剪列表会减少 AP,因此调整排名列表大小没有任何智慧 - 如果您 return 整个列表,则可以获得最大 AP。例如,您可以从 中看到这一点 - 裁剪列表仅对应于

for ( ; i<ranked_list.size(); ++i) {

改为

for ( ; i<some_number; ++i) {

导致 ap 的增量较少(所有增量都是非负的,因为 old_precisionprecision 是非负的,而 recall 是非递减的) AP 值更小。

实际上,出于纯粹的计算原因,您可能希望将列表裁剪为某个合理的数字,例如10k,因为 precision@large_number 很可能为 0,因此 AP 不太可能发生太大变化,除非你有异常多的正数。

您的困惑可能与某些流行函数的方式有关,例如 VLFeat 的 vl_pr 计算精确召回曲线的方式,因为它们假设您已经为它们提供了整个排名列表,因此计算了总数通过仅查看排名列表而不是地面实况本身来确定地面实况中的积极因素。因此,如果您天真地在裁剪列表上使用 vl_pr,您确实可以欺骗它,但这将是无效的计算。我同意函数的描述并不是 100% 清楚,但是如果你更详细地检查 documentation,你会看到它提到了 NUMNEGATIVESNUMPOSITIVES,所以如果你给出的排名列表不完整,您应该设置这两个量,让函数知道如何正确计算精确召回曲线/AP。现在,如果您使用 vl_pr 绘制排名列表的不同作物,但对所有函数调用使用相同的 NUMNEGATIVES 和 NUMPOSITIVES,您将看到精确召回曲线只是彼此的作物,正如我在上面解释的那样(我还没有检查过这个,因为我这里没有 matlab,但我确定是这样,如果不是,我们应该提交一个错误)。