在这个问题中,我询问了有关精度-召回率曲线的澄清。
特别是,我问我们是否必须考虑固定数量的排名来绘制曲线,或者我们可以合理地选择自己。根据答案,第二个是正确的。
但是,现在我对平均精度(AP)值有很大的怀疑:AP用于在给定某个查询的情况下以数字方式估计我们的算法有多好。平均精度 (MAP) 是多个查询的平均精度。
我的疑问是:如果 AP 根据我们检索的对象数量而变化,那么我们可以调整此参数以发挥我们的优势,以便我们尽可能显示最佳 AP 值。例如,假设 p-r 曲线在 10 个元素之前表现得非常出色,然后非常糟糕,我们可以"欺骗"仅考虑前 10 个元素计算 (M)AP 值。
我知道这听起来可能令人困惑,但我在任何地方都没有找到任何关于这个的东西。
AP 是精度-召回率曲线下的面积,精度-召回率曲线应该在整个返回的排名列表中计算。
无法通过调整返回的排名列表的大小来欺骗 AP。AP 是精度-召回率曲线下方的区域,它将精度绘制为召回率的函数,其中召回率是相对于基本事实中存在的阳性总数的返回正数数,而不是相对于返回列表中的阳性数。因此,如果您裁剪列表,您所做的只是裁剪精度-召回率曲线并忽略绘制其尾部。由于 AP 是曲线下的面积,因此裁剪列表会减少 AP,因此调整排名列表大小并不明智 - 如果返回整个列表,则可实现最大 AP。例如,您可以从您在另一个问题中引用的代码中看到这一点 - 裁剪列表只是对应于
for ( ; i<ranked_list.size(); ++i) {
更改为
for ( ; i<some_number; ++i) {
这导致ap
增量减少(所有增量都是非负的,因为old_precision
和precision
是非负的,recall
是非减少的),因此 AP 值更小。
实际上,出于纯粹的计算原因,您可能希望以某个合理的数字(例如 10k)裁剪列表,因为 AP 不太可能发生太大变化,因为除非您有异常多的正数,否则precision@large_number很可能为 0。
您的困惑可能与一些流行的函数(例如VLFeat的vl_pr
计算精度召回率曲线的方式有关,因为它们假设您已经为他们提供了整个排名列表,因此仅通过查看排名列表而不是基本事实本身来计算基本事实中的正数总数。因此,如果你在裁剪列表中天真地使用vl_pr
,你确实可以欺骗它,但那将是一个无效的计算。我同意从函数的描述中不是 100% 清楚,但如果您更详细地查看文档,您会发现它提到了NUMNEGATIVES
和NUMPOSITIVES
,因此,如果您给出不完整的排名列表,您应该设置这两个数量,让函数知道如何正确计算精度-召回率曲线/AP。现在,如果您使用vl_pr
绘制排名列表的不同作物,但对所有函数调用使用相同的 NUMNEGATIVES 和 NUMPOSITIVES,您将看到精度-召回率曲线只是彼此的裁剪,正如我上面解释的那样(我还没有检查这个,因为我这里没有 matlab,但我确定是这种情况,如果不是,我们应该提交一个错误)。
你说的是部分正确的。如果您在检索到N
文档的顶部获得合理的MAP或AP,则很好。它没有作弊,因为您的 IR 系统正在检索前N
返回文档中的大量相关文档,但是是的,它仍然缺少一些相关文档。请注意,对于IR系统,如果它无法检索所有相关文档,而是将所有检索到的相关文档排名在更高的等级中,则更好,这就是AP的衡量标准。(更高的等级意味着等级 1 或 2,而不是 100 或 101)
考虑一个示例,您有两个相关文档,一个以等级 1 返回,另一个以等级 50 返回。现在,如果您为返回的前 10 个文档计算 MAP 或 AP,则必须将答案报告为MAP@10
或AP@10
。通常,AP 表示所有返回文档的平均精度,但如果您考虑排名前N
的文档,您的指标将是AP@N
而不仅仅是 AP,请注意,这不是作弊!但是,是的,如果您计算AP@N
并报告为 AP,那么您正在向读者提供部分信息。
关于MAP的重要事实是 - 如果相关文档从未被检索到,我们假设与该相关文档对应的精度为零。在计算AP时,我们将累积精度除以相关文档总数。因此,当您计算MAP@N
或AP@N
时,这意味着您只关心IR系统返回的N
文档。例如,我在我的一项研究著作中使用了MAP@100
。
如果您对AP或MAP有困惑,可以在此处查看我的简短回答。希望它能帮助您澄清您的困惑。