我很好奇为什么在下面的示例中,mahout推荐程序没有返回用户1的推荐。
我的输入文件在下面。我添加了空行以增强可读性。该文件将需要空白行在它通过MaOUT之前删除。
此文件中的列为:
用户id |项目编号|项目评级
1 101 0
1 102 0
1 103 5
1 104 0
2 101 4
2 102 5
2 103 4
2 104 0
3 101 0
3 102 5
3 103 5
3 104 3
您将注意到,103项是所有3个用户都对其进行评级的唯一公共项。
我运行了:hadoop jar c:\hdp\mahout-0.9.0.2.1.3.0-1981\core\target\mahout-core-0.9.0.2.1.3.0-1981-job.jar org.apache.mahout.cf.taste.hadoop.item.recommenderjob-s similarity\u coccurrence--input small\u data\u set.txt--output small\u data\u set\u output
mahout建议输出文件显示:
2 [104:4.5] 3 [101:5.0]
我相信这意味着:
用户2将被推荐为第104项。由于用户3对第104 a 3项进行了评分,这可能是4.5分的推荐分数与以下结果的比较结果…
用户3将被推荐为项目101。由于用户2将项目101评为“4”,这可能导致推荐分数略高5分。
是这样吗?
为什么用户1没有包含在推荐输出文件中?用户1可能已经收到了关于项目102的建议,因为用户2和用户3对其进行了评级。数据集是否太小?
提前谢谢。
1条答案
按热度按时间falq053o1#
您的数据中可能存在多个错误,前两个错误将导致未定义的行为:
id必须是从0开始的连续的非零整数,所以您需要在上面Mapid。因此,您的用户id=1将是mahout用户id=0。同样对于项目,您的项目id=101将是mahout用户id=0。
如果您的意思是用户没有表示偏好,那么您应该从输入中完全忽略0值,这使得偏好在某种意义上是“未定义的”。要做到这一点,请完全省略这些行。
总是使用相似性和似然性,这是广泛衡量做得明显优于其他方法,除非你试图预测评级,在这种情况下使用余弦。
如果使用llr相似性,则应忽略这些值,因为它们将被忽略。
除非您试图预测用户对某个项目的评分,否则很少使用偏好值。偏好权重在确定推荐排序时是无用的,这是典型的优化问题。如果你想以正确的顺序推荐正确的东西,就抛出这些值并使用llr。
人们有时对价值观做的另一件事是显示一些偏好的权重,因此1=查看产品页面,5=购买产品。这行不通!我用一个大型电子商务数据集尝试了这个方法,发现在添加产品视图时,推荐的效果更差,尽管数据量是原来的100倍。它们是具有不同用户意图的根本不同的用户操作,因此不能以这种方式混合。
如果你真的想混合不同的动作,使用基于mahout,spark,和solr的新的多模式推荐器,在mahout网站上有描述:它允许交叉共现类型指标计算,所以你可以使用用户位置,喜欢和不喜欢,查看和购买。实际上,可以使用整个用户clickstream。但是只有当交叉共现将一个动作关联到规范的“最佳”动作时,才是你想要推荐的动作。