提问者:小点点

Apache Spark ALS协同过滤结果。他们没有意义


我想尝试使用本教程中解释的MLlib使用Spark进行协作过滤:https://databricks-training . S3 . amazonaws . com/movie-recommendation-with-ml lib . html该算法基于论文“隐式反馈数据集的协作过滤”,进行矩阵分解。

一切都使用1000万个Movielens数据集启动并运行。数据集分为80%训练10%测试和10%验证。

  • RMSE 基线:1.060505464225402
  • RMSE(火车)= 0.7697248827452756
  • RMSE(验证)= 0.8057135933012889,对于秩 = 24、lambda = 0.1 和迭代 = 10 训练的模型。
  • 最佳模型将基线提高了 23.94%。

这些值与教程相似,但具有不同的训练参数。

我试着运行了几次算法,总是得到对我没有任何意义的建议。即使只对儿童电影进行评级,我也会得到以下结果:

对于评级:

    < li >个人评分:玩具总动员(1995)评分:4.0 < li >个人评分:丛林之书(1994年)评分:5.0 <李>个人评分:狮子王(1994年)评分:5.0 < li >个人评分:玛丽·波平斯(1964)评分:4.0 < li >个人评分:爱丽丝梦游仙境(1951)评分:5.0

结果:

推荐给你的电影:

  1. 大春的生活,该(赛卡库ichidai onna)(1952)
  2. 更多(1998)
  3. 谁在那边唱歌?(又名谁在那边唱歌)(Ko to Tamo peva)(1980)
  4. 星期日和赛贝利(Dimanch de Ville d'Avray, Les)(1962)
  5. 蓝光,The(Das Blaue Licht)(1932)
  6. 《哈维·米尔克时报》(1984)
  7. 请投我一票(2007)
  8. 人谁种树,(Homme qui plantait des arbres, L')(1987)
  9. 肖申克的救赎(1994)
  10. 只有昨天(Omo的poro poro)(1991)

除了《只有昨天》似乎没有任何意义。

如果有谁知道如何解释这些结果或得到更好的结果,我真的很感谢你分享你的知识。

致敬

编辑:

根据建议,我训练了另一个具有更多因素的模型:

  • 基线错误:1.0587417035872992
  • RMSE(火车)=0.7679883378412548
  • RMSE(验证)=0。8070339258049574对于排名=100、lambda=0.1和NumIter=10的模型进行训练。

和不同的个人评级:

  • 个人评分:《星球大战:第六集-绝地归来》(1983)评分:5.0
  • 个人评分:任务:不可能(1996)评分:4.0
  • 个人评分:《死磕:复仇》(1995)评分:4.0
  • 个人评分:《永远的蝙蝠侠》(1995)评分:5.0
  • 个人评分:《黑衣人》(1997)评分:4.0
  • 个人评分:《终结者2:审判日》(1991)评分:4.0
  • 个人评分:Top Gun(1986)评分:4.0
  • 个人评分:《星球大战:第五集-帝国反击战》(1980)评分:3.0
  • 个人评分:外星人(1979)评分:4.0

推荐的电影有:

推荐给你的电影:

  1. 卡门 (1983)
  2. 寂静的光 (2007)
  3. 耶稣 (1979)
  4. 大春的一生(西岳一代恩纳)(1952)
  5. 美国之心 (2003)
  6. 因为圣经告诉我 (2007)
  7. 更多 (1998)
  8. Legend of Leigh Bowery, The (2002)
  9. 葬礼,(大敷) (1984)
  10. 长镜头 (2008)

没有一个有用的结果。

编辑2:使用隐式反馈方法,我得到了更好的结果!对于与上述相同的动作片,建议如下:

推荐给你的电影:

    <李>星球大战:第四集-新的希望(又名星球大战)(1977) <李>终结者(1984) <李>夺宝奇兵(印第安纳琼斯和夺宝奇兵)(1981) 《虎胆龙威》(1988年) 《教父》(1972) <李>外星人(1986) <李>石著(1996) < li >独立日(又名ID4) (1996年) < li >星际迷航II:可汗之怒(1982) 《黄金眼》( 1995年)

这正是我所期望的!问题是为什么露骨的版本如此糟糕


共3个答案

匿名用户

请注意,您正在运行的代码不使用隐式反馈,也不是您所引用的算法。只需确保您没有使用ALS.trainImplicit。您可能需要不同的lambda和秩。对于该数据集,0.88的RMSE为“OK”;我不清楚这个例子的值是最优的,还是仅仅是玩具测试产生的值。您仍然在此处使用不同的值。也许这还不是最理想的。

它甚至可能是自那以后修复的 ALS 实现中的错误之类的东西。如果可以,请尝试与 ALS 的其他实现进行比较。

我总是试图抵制合理化的建议,因为我们的大脑不可避免地会找到一些解释,即使是随机的建议。但是,嘿,我可以说,你在这里没有得到动作、恐怖、犯罪剧、惊悚片。我发现儿童电影与对附庸风雅电影的品味是齐头并进的,因为,很久以前,当对儿童电影进行评级时,那种满足他们口味的人实际上不是儿童,而是父母,也许软件工程师类型的年龄足以有孩子,他们确实倾向于看你看到的这类外国电影。

匿名用户

协同过滤只是给你一些和你品味相同的人真正喜欢的东西。如果你只给儿童电影评分,并不意味着你会被推荐儿童电影。这只意味着给《玩具总动员》、《丛林故事》、《狮子王》等评分的人...因为你也喜欢小笠原的生活,还有,谁在那边唱歌?等等...你在维基百科页面上有一个很好的动画:CF

我没有读你给的链接,但是有一件事你可以改变,那就是如果你想继续使用协同过滤的话,你所使用的相似性度量。

如果你想根据自己的喜好推荐,你可以尝试潜在因子模型,如矩阵分解。在这里,潜在因素可能会发现电影可以被描述为描述额定对象特征的特征。可能是一部电影是喜剧、儿童、恐怖等。(顺便说一下,你永远不知道潜在因素是什么)。如果您只对儿童电影进行评分,您可能会推荐其他儿童电影。

希望有帮助。

匿名用户

其次,弗拉德说,尝试相关或杰卡德。即忽略评分数字,只查看二进制“这两部电影是否在用户的偏好列表中在一起”。当我构建我的第一个推荐器时,这对我来说是一个游戏规则的改变者:http://tdunning.blogspot.com/2008/03/surprise-and-coincidence.html

祝你好运