1

我正在尝试使用点击数据构建精确度和召回率图表。我有两个数据源。

  1. 第一个数据源具有基于给定 query_id 的所有用户单击 item_ids。
  2. 第二个数据源具有给定 query_id 的所有相关 item_id。

我使用python并将它们放在两个数据源中的字典中,如下所示:

>>> print clicked_data
{101: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], 103: [20, 21, 22, 23, 24, 25, 26, 27, 28, 29]}

>>> print all_relevant_data
{101: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17], 103: [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49]}

我正在阅读 scikit-learn 网站 ( http://scikit-learn.org/stable/auto_examples/plot_precision_recall.html ) 中的文章,并尝试遵循公式,但在设置 False Positive 和 False Negative 时真的很困惑。

遵循 scikit-learn 中的方程式:根据上述示例预置项目101

P = T_positive/ (T_positive + F_positive)

>>> float(len(clicked_data[101]))/float(len(all_relevant_data[101]))
0.5555555555555556

但是当我试图弄清楚 Recall 时,我在获取点击数据的 False Negative 项目时遇到了麻烦。理论上,假阴性意味着错误标记。我所拥有的只是用户点击给定 ID 的数据以及与该 ID 相关的所有项目。

R = T_positive / (T_positive + F_negative)

如何正确计算精度和召回率,以便构建图表。

另一方面,如果这不是评估结果的好指标,考虑到我只有上述数据这一事实,那么好的指标是什么?

4

2 回答 2

3

您可以根据您的数据集计算precision@k、recall@k。但是您需要对文档进行排名来计算它们。

数据集

一个众所周知的数据集是AOL 搜索查询日志,您可以使用它来构建基于检索的系统(您只需要一个数据集和一个检索函数)来计算精度、召回率、平均精度和平均平均精度。我正在简要解释上面提到的术语。

文档排名/检索功能

Okapi BM25(BM 代表最佳匹配)是搜索引擎用来根据匹配文档与给定搜索查询的相关性对匹配文档进行排名的排名函数。它基于概率检索框架。BM25 是一种词袋检索功能,它根据每个文档中出现的查询词对一组文档进行排名,而不管文档中查询词之间的相互关系(例如,它们的相对接近度)。有关更多详细信息,请参阅维基百科页面。

精确度和召回率

精确测量“我们检索到的所有相关文档中有多少实际上是相关的?”。

Precision = No. of relevant documents retrieved / No. of total documents retrieved

召回措施“在所有实际相关文件中,我们检索到了多少相关文件?”。

Recall = No. of relevant documents retrieved / No. of total relevant documents

假设,当查询“q”被提交给具有 100 个相关文档的信息检索系统(例如,搜索引擎)时,系统会从 600 个文档的总集合中检索 68 个文档。在检索到的 68 个文档中,有 40 个文档是相关的。所以,在这种情况下:

Precision = 40 / 68 = 58.8%Recall = 40 / 100 = 40%

F-Score / F-measure 是准确率和召回率的加权调和平均值。传统的 F-measure 或平衡 F-score 是:

F-Score = 2 * Precision * Recall / Precision + Recall

平均精度

你可以这样想:你输入一些东西Google,它会显示 10 个结果。如果所有这些都是相关的,那可能是最好的。如果只有一些是相关的,比如五个,那么最好先显示相关的。如果前五个无关紧要,而好的只从第六个开始,那会很糟糕,不是吗?AP分数反映了这一点。

下面举个例子:

在此处输入图像描述

两个排名的 AvgPrec:

排名#1:(1.0 + 0.67 + 0.75 + 0.8 + 0.83 + 0.6) / 6 = 0.78

排名#2:(0.5 + 0.4 + 0.5 + 0.57 + 0.56 + 0.6) / 6 = 0.52

平均精度 (MAP)

MAP 是多个查询/排名的平均精度平均值。举个例子来说明。

在此处输入图像描述

两个查询的平均精度:

对于查询 1,AvgPrec: (1.0+0.67+0.5+0.44+0.5) / 5 = 0.62

对于查询 2,AvgPrec: (0.5+0.4+0.43) / 3 = 0.44

所以,MAP =(0.62 + 0.44) / 2 = 0.53

有时,人们使用precision@k,recall@k作为检索系统的性能度量。您应该为此类测试构建一个检索系统。如果您想用 Java 编写程序,您应该考虑使用Apache Lucene来构建您的索引。

于 2016-11-27T22:41:10.140 回答
0

只需单击 (TP) 和相关数据 (TP + FN),您就可以计算 Recall - 但不能计算 Precision 。您没有数据集告诉您 FP 值。

于 2015-01-28T10:00:52.070 回答