如何检查基于协作过滤算法的项目是否正确?

时间:2011-09-14 00:30:49

标签: php codeigniter recommendation-engine collaborative-filtering

我刚刚为基于项目的协同过滤创建了一个算法,该算法可以采用[username]=>[item]=>[rating]形式的数据数组,并根据用户评估/购买的当前项目推荐其他项目,方法是计算预测如果用户使用该项目并对其进行评级,则该用户将给予该评级。

我的问题是,如何检查推荐系统的准确性?

4 个答案:

答案 0 :(得分:4)

选择一些您实际拥有评分的随机用户和项目,并尝试使用您的算法预测评分。计算预测值与实际评级之间的RMSE。值越低越好。

根据您的算法,您对该项目进行评级的事实可能会给您的RMSE带来沉重的偏见。在这种情况下,执行您的计算,就像您不知道评级一样(例如:将所有内容移至单独的数据库并丢弃您尝试“预测”的记录)。

有趣的阅读:The Netflix Prize

答案 1 :(得分:3)

像Apache Mahout这样的库提供了一个框架来自动完成这项工作。

但我想你想要编写自己的解决方案。

通常,您使用cross-validation测试准确性。所以,抓住一个评级数据集。将其分为两组,一组是训练组,另一组是“测试组”。通常,这是通过随机挑选80%的用户并将其置于训练测试中并使用剩余的20%作为测试集来完成的。

逐个挑选测试集中的用户。要测试您的准确性,您可以使用一个全有效的指标:隐藏一次使用中的一个评级,并尝试预测它。 (有些作者称之为leave-one-out而不是全部而是。)仅使用训练集和来自这一个用户的数据(当然,除了你隐藏的评级)。每次执行此操作时,您都会收到错误,您可以将它们相加并除以您所做的预测数。这是平均误差。

当然还有其他方法可以做到。

答案 2 :(得分:0)

我喜欢均方根误差,但另一个可能有帮助的人称为“平均平均精度@ K' AKA' MAPK'。

平均精度' MAPK的一部分只是前K个建议的相关性。所以基本上,看一下你的模型预测的建议去看看有多少是什么'命中'在实际结果集中(在这种情况下,实际结果集=用户提供评级的项集)

这就像我所谈论的一个很好的例子: http://makarandtapaswi.wordpress.com/2012/07/02/intuition-behind-average-precision-and-map/

答案 3 :(得分:-2)

只需以这种简单的形式进行测试:

USER A - ITEM 1 - 10.0
USER A - ITEM 2 - 10.0
USER A - ITEM 3 - 10.0

USER B - ITEM 1 - 10.0
USER B - ITEM 2 - 10.0
USER B - ITEM 3 - 10.0

USER C - ITEM 1 - 10.0
USER C - ITEM 2 - 10.0

现在,用户C应获得针对ITEM 3的建议10.0