Python 计算点击数据的精度和召回率

Python 计算点击数据的精度和召回率,python,machine-learning,information-retrieval,evaluation,precision-recall,Python,Machine Learning,Information Retrieval,Evaluation,Precision Recall,我试图用点击数据建立一个精确性和召回率的图表。我有两个数据源 第一个数据源具有基于给定查询id的所有用户单击的项id 第二个数据源具有给定查询id的所有相关项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

我试图用点击数据建立一个精确性和召回率的图表。我有两个数据源

  • 第一个数据源具有基于给定查询id的所有用户单击的项id
  • 第二个数据源具有给定查询id的所有相关项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学习网站()上读了这篇文章,并试图遵循这个公式,但真的混淆了设置假阳性和假阴性

    遵循scikit学习中的方程式:根据上述示例预测项目
    101

    P = T_positive/ (T_positive + F_positive)
    
    >>> float(len(clicked_data[101]))/float(len(all_relevant_data[101]))
    0.5555555555555556
    
    但当我试图找出回忆时,我在获取点击数据的假阴性项方面遇到了麻烦。理论上,假阴性是指标记错误。我所拥有的只是给定id的用户点击数据以及与该id相关的所有项目

    R = T_positive / (T_positive + F_negative)
    
    如何正确计算精度和召回率,以便构建图表


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

    只需点击(TP)和相关数据(TP+FN),您就可以计算召回率,但不能计算准确率。您没有数据集可以告诉您FP值。

    您可以计算precision@k, recall@k基于您的数据集。但您需要对文档进行排序才能计算它们

    数据集

    一个众所周知的数据集可以用来构建一个基于检索的系统(您只需要一个数据集和一个检索函数)来计算精度、召回率、平均精度和平均精度。我将简要解释上述术语

    文档排名/检索功能

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

    精确性和召回率

    精度度量“在我们检索到的所有相关文档中,有多少是实际相关的?”

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

    假设,当一个查询“q”提交给一个信息检索系统(例如,搜索引擎)时,该系统有100个相关文档w.r.t.查询“q”,系统从总共600个文档的集合中检索68个文档。在检索到的68份文件中,有40份文件是相关的。因此,在这种情况下:

    精度=40/68=58.8%
    召回率=40/100=40%

    F-Score/F-measure是精确度和召回率的加权调和平均值。传统的F-测量或平衡F-分数为:

    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编写程序,你应该考虑建立索引。< / P>你的意思是说我可以计算精度而不记得。为了回忆,我需要假阴性。在推荐人/搜索结果中,用户单击列表中未推荐或未显示的内容。
    Recall = No. of relevant documents retrieved / No. of total relevant documents
    
    F-Score = 2 * Precision * Recall / Precision + Recall