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



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

使用1000万Movielens数据集,一切都在运行。数据集分为80%的训练、10%的测试和10%的验证。

  • RMSE基线:1.060505464225402
  • RMSE(列车)=0.7697248827452756
  • 秩=24、λ=0.1和迭代次数=10训练的模型的RMSE(验证)=0.8057135933012889
  • 最佳模型将基线提高了23.94%

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

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

评级:

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

结果:

为您推荐的电影:

  1. 大丸的一生(Saikaku ichidai onna)(1952)
  2. 更多(1998)
  3. 谁在那边唱歌?(又名《谁在那边唱歌》)(Ko to tamo peva)(1980)
  4. Sundays and Cybele(Dimanches de Ville d‘Avray,Les)(1962)
  5. 《蓝光》(Das Blaue Licht)(1932)
  6. 哈维·米尔克时代,The(1984)
  7. 请投票给我(2007)
  8. 《种树的人》(1987)
  9. 肖申克的救赎(1994)
  10. 只有昨天(大马路)(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
  • 个人评分:《壮志凌云》(1986)评分:4.0
  • 个人评分:《星球大战:第五集-帝国反击战》(1980)评分:3.0
  • 个人评分:《异形》(1979)评分:4.0

推荐的电影有:

为您推荐的电影:

  1. 卡门(1983)
  2. 《寂静之光》(Stellet licht)(2007)
  3. 耶稣(1979)
  4. 大丸的一生(Saikaku ichidai onna)(1952)
  5. 美国之心(2003)
  6. 《告诉我的圣经》(2007)
  7. 更多(1998)
  8. 《李的传奇》(2002)
  9. 葬礼,The(Ososhiki)(1984)
  10. Longshots,The(2008)

没有一个有用的结果。

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

为您推荐的电影:

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

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

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

它甚至可能是像ALS实现中的错误一样的东西,从那以后就被修复了。如果可以的话,试着与ALS的另一种实现进行比较。

我总是试图抵制将建议合理化,因为我们的大脑不可避免地会找到一些解释,即使是随机的建议。但是,嘿,我可以说你在这里没有动作片、恐怖片、犯罪片、惊悚片。我发现儿童电影与对艺术电影的品味密不可分,因为,早在给儿童电影打分的时候,那种对MovieLens充满品味的人实际上不是孩子,而是父母,也许还有足够大的软件工程师,他们确实倾向于看你看的这类外国电影。

协作过滤只会为您提供与您品味相同的人真正喜欢的项目。如果你给独生子女电影打分,并不意味着你会得到推荐的独生子女电影。这只是意味着,那些评价《玩具总动员》、《丛林之书》、《狮子王》等的人……就像你一样,也喜欢《奥哈鲁的生活》、《更多》、《谁在那里唱歌?》?,等你在维基百科页面上有一个很好的动画:CF

我没有阅读你提供的链接,但有一件事你可以改变,那就是如果你想继续合作过滤,你正在使用的相似性度量。

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

希望能有所帮助。

Vlad说的第二句话,试试correlation或Jaccard。也就是说,忽略评分数字,只看二进制"这两部电影是否在用户的偏好列表中"。当我建立我的第一个推荐人时,这改变了我的游戏规则:http://tdunning.blogspot.com/2008/03/surprise-and-coincidence.html

祝好运

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

然而,使用一种更简单的方法——例如基于Pearson相关作为相似性度量——而不是矩阵分解,我得到了更好的结果。这意味着我大多数时候都会得到带有你的输入偏好和相同的输入评分文件的儿童电影。

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