6

我想尝试使用 MLlib 进行协同过滤的 Spark,如本教程中所述: https ://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html 该算法基于论文“Collaborative Filtering”对于隐式反馈数据集”,进行矩阵分解。

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

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

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

我多次尝试运行该算法,但总是得到对我没有任何意义的建议。即使只评价儿童电影,我也会得到以下结果:

对于评级:

  • 个人评分:玩具总动员 (1995) 评分:4.0
  • 个人评分:丛林之书,(1994)评分:5.0
  • 个人评分:狮子王,(1994)评分:5.0
  • 个人评分:Mary Poppins (1964) 评分:4.0
  • 个人评分:爱丽丝梦游仙境(1951)评分:5.0

结果:

为您推荐的电影:

  1. 小春的一生,The (Saikaku ichidai onna) (1952)
  2. 更多 (1998)
  3. 谁在那边唱歌?(又名谁在那边唱歌)(Ko to tamo peva)(1980)
  4. 星期日和赛贝勒 (Dimanches de Ville d'Avray, Les) (1962)
  5. 蓝光,(Das Blaue Licht)(1932)
  6. 哈维牛奶时代 (1984)
  7. 请为我投票 (2007)
  8. 种树的人,(Homme qui plantait des arbres,L')(1987)
  9. 肖申克的救赎 (1994)
  10. 只有昨天 (Omohide poro poro) (1991)

除了只有昨天之外,这似乎没有任何意义。

如果有人知道如何解释这些结果或获得更好的结果,我将非常感谢您分享您的知识。

此致

编辑:

正如建议的那样,我训练了另一个具有更多因素的模型:

  • 基线错误:1.0587417035872992
  • RMSE(火车)= 0.7679883378412548
  • 对于使用 rank = 100、lambda = 0.1 和 numIter = 10 训练的模型,RMSE(验证)= 0.8070339258049574。

以及不同的个人评分:

  • 个人评分:星球大战:第六集 - 绝地归来(1983)评分:5.0
  • 个人评分:使命:不可能(1996)评分:4.0
  • 个人评分:虎胆龙威:复仇(1995)评分:4.0
  • 个人评分:永远的蝙蝠侠(1995)评分:5.0
  • 个人评分:黑衣人(1997)评分:4.0
  • 个人评分:终结者2:审判日(1991)评分:4.0
  • 个人评分:壮志凌云(1986)评分:4.0
  • 个人评分:星球大战:第五集 - 帝国反击战(1980)评分:3.0
  • 个人评分:外星人(1979)评分:4.0

推荐的电影有:

为您推荐的电影:

  1. 卡门 (1983)
  2. 寂静之光 (Stellet licht) (2007)
  3. 耶稣 (1979)
  4. 小春的一生,The (Saikaku ichidai onna) (1952)
  5. 美国之心 (2003)
  6. 因为圣经告诉我(2007)
  7. 更多 (1998)
  8. Leigh Bowery 传奇 (2002)
  9. 葬礼 (Ososhiki) (1984)
  10. 远射 (2008)

没有一个有用的结果。

EDIT2:使用隐式反馈方法,我得到了更好的结果!对于与上述相同的动作电影,建议是:

为您推荐的电影:

  1. 星球大战:第四集 - 新希望(又名星球大战)(1977)
  2. 终结者 (1984)
  3. 夺宝奇兵(印第安纳琼斯和夺宝奇兵)(1981)
  4. 虎胆龙威 (1988)
  5. 教父 (1972)
  6. 外星人 (1986)
  7. 摇滚 (1996)
  8. 独立日(又名 ID4)(1996 年)
  9. 星际迷航 II:可汗之怒 (1982)
  10. 金眼 (1995)

这更符合我的预期!问题是为什么显式版本如此糟糕

4

4 回答 4

3

请注意,您正在运行的代码不使用隐式反馈,也不是您所指的算法。只要确保你没有使用ALS.trainImplicit. 您可能需要不同的 lambda 和等级。该数据集的 RMSE 为 0.88 是“OK”;我不清楚该示例的值是最佳值还是只是玩具测试产生的值。您仍然在这里使用不同的值。也许它还不是最优的。

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

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

于 2014-10-06T13:46:47.370 回答
1

协作过滤只会为您提供与您有相同品味的人真正喜欢的项目。如果您只评价儿童电影,这并不意味着您将获得仅推荐的儿童电影。这只是意味着那些评价玩具总动员、丛林书、狮子王等的人......就像你一样,也喜欢小春的生活、更多、谁在那边唱歌?等等......你在维基百科上有一个很好的动画页码:CF

我没有阅读您提供的链接,但您可以更改的一件事是您使用的相似性度量,如果您想继续使用协同过滤。

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

希望能帮助到你。

于 2014-10-06T11:37:01.313 回答
1

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

祝你好运

于 2014-10-06T21:20:07.083 回答
0

我尝试使用相同的数据集并按照这个 Spark 教程,我得到了相同的(主观上不好的)结果。

然而,使用更简单的方法——例如基于 Pearson 相关性作为相似性度量——而不是矩阵分解,我得到了更好的结果。这意味着我主要会使用您的输入偏好和相同的输入评级文件来获取儿童电影。

除非你真的需要分解(虽然它有很多优点),否则我建议使用另一种推荐方法。

于 2014-10-06T15:22:35.853 回答