在点击数据中计算精度和召回

时间:2015-01-26 16:28:02

标签: python machine-learning information-retrieval evaluation precision-recall

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

  1. 第一个数据源包含基于给定query_id的所有用户单击的item_ids。
  2. 第二个数据源包含给定query_id的所有相关item_id。
  3. 我使用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)中的文章,并尝试遵循公式,但真的很混淆真的设置假阳性和假阴性。

    遵循scikit-learn中的等式:根据以上示例预设项目101

    P = T_positive/ (T_positive + F_positive)
    
    >>> float(len(clicked_data[101]))/float(len(all_relevant_data[101]))
    0.5555555555555556
    

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

    R = T_positive / (T_positive + F_negative)
    

    如何正确计算精度和回忆率,以便我可以构建图形。

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

2 个答案:

答案 0 :(得分:3)

您可以根据数据集计算精度@ k,调用@k。但是您需要对文档进行排名才能计算出来。

<强>数据集

众所周知的数据集是AOL Search Query Logs,您可以使用它来构建基于检索的系统(您只需要数据集和检索功能)来计算精度,召回率,平均精度和平均精度。我简要解释了上述术语。

文件排名/检索功能

Okapi BM25 (BM代表最佳匹配)是搜索引擎根据其与给定搜索查询的相关性对匹配文档进行排名的排名函数。它基于概率检索框架。 BM25是bag-of-words检索函数,其基于出现在每个文档中的查询项来对一组文档进行排名,而不管文档内的查询项之间的相互关系(例如,它们的相对接近度)。有关详细信息,请参阅Wikipedia页面。

精确度和召回

我们检索的所有文件的精确度量&#34;与实际相关的文件数量有多少相关?&#34;。

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

召回措施&#34;在所有实际相关文件中,我们检索了多少相关文件?&#34;。

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

假设,当查询&#34; q&#34;提交给具有100个相关文档的信息检索系统(例如,搜索引擎)w.r.t。查询&#34; q&#34;,系统从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得分反映了这一点。

举一个例子:

enter image description here

  

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是多个查询/排名的平均精度的平均值。举例说明。

enter image description here

  

两个查询的平均平均精度:

对于查询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@krecall@k作为检索系统的效果衡量标准。您应该为此类测试构建检索系统。如果您想用Java编写程序,则应考虑Apache Lucene来构建索引。

答案 1 :(得分:0)

只需单击(TP)和相关数据(TP + FN),您就可以计算召回 - 但不是精确度。您没有可以告诉您FP值的数据集。