推荐系统 - 召回率@K和精确度@K

3
我正在为公司建立一个推荐系统,有一个关于计算精度@K和召回率@K的公式的问题,在谷歌上找不到相关信息。
对于精度@K,一般公式是在前k个推荐项中,有多少比例是相关的。
我的问题是如何定义哪些项目是相关的,哪些不相关,因为用户不一定与所有可用项目进行交互,而只是其中的一小部分。如果在前k个推荐项中缺乏基础真实数据,那么我们应该忽略它们还是认为它们是不相关的项目?
下面的文章建议忽略这些未交互的项目,但我对此并不确定。

https://medium.com/@m_n_malaeb/recall-and-precision-at-k-for-recommender-systems-618483226c54

提前非常感谢。

1个回答

2
您提到了“推荐项目”,因此我假设您正在谈论计算推荐引擎的精度,即前 k 个预测中准确预测用户未来互动的数量。
推荐引擎的目标是从过去的互动中建模未来的互动。这样的模型是在交互数据集上训练的,最后一个互动是目标,而过去的 n 个互动是特征。
因此,精度可以通过在已知地面真实情况(即最后一次互动)的测试集上运行模型,并将地面真实情况在前 k 个预测中的数量除以总测试项目数来计算。
未与用户互动的项目不会出现,因为我们正在训练其他用户的行为模型。

嗨@scign,感谢您的回复。如果我理解正确,您的意思是我们应该忽略所有没有基础事实的预测。用于计算precision@K的前k个推荐结果应该只包括有基础事实的那些。如果是这样的话,那么我的模型表现得非常好。 - Quan Nguyen
我的观点是,在没有基准数据的情况下,你不应该尝试计算预测的精度。只有在有基准数据的情况下,精度(准确预测的比例)才有意义。如果测试集中的用户没有与该项进行交互,则任何预测的前k个项目列表都将是不正确的。 - scign
@scign 请帮忙,我在推荐系统中使用了逻辑回归模型,现在想计算召回率@25。我的代码如下:val model = pipeline.fit(train),val predicted = model.transform(test),val predictionAndLabels = predicted.select("prediction", "label").rdd.map(x => (x(0).asInstanceOf[Array[Double]], x(1).asInstanceOf[Array[Double]]),val matrix = new RankingMetrics(predictionAndLabels),matrix.recallAt(25)。但是出现了异常java.lang.Double cannot be cast to [D,请问该如何纠正呢? - Salm
1
不要在别人的问题上留言来提出你自己的问题。 - scign

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接