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

时间:2014-10-06 09:39:54

标签: machine-learning apache-spark collaborative-filtering matrix-factorization

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

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

  • RMSE基线:1.060505464225402
  • RMSE(train)= 0.7697248827452756
  • RMSE(验证)= 0.8057135933012889,训练模型为rank = 24,lambda = 0.1,迭代次数= 10.
  • 最佳模型将基线提高了23.94%。

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

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

评分:

  • 个人评价:玩具总动员(1995)评级:4.0
  • 个人评价:Jungle Book,The(1994)评级:5.0
  • 个人评价:Lion King,The(1994)评级:5.0
  • 个人评价:Mary Poppins(1964)评级:4.0
  • 个人评价:爱丽丝梦游仙境(1951)评级:5.0

结果:

推荐的电影:

  1. Oharu的生活,(Saikaku ichidai onna)(1952)
  2. 更多(1998)
  3. 谁在那边唱歌? (a.k.a.谁在那里唱歌)(Ko to tamo peva)(1980)
  4. 星期日和Cybele(Dimanches de Ville d'Avray,Les)(1962)
  5. 蓝光,(Das Blaue Licht)(1932)
  6. Harvey Milk的时代,(1984)
  7. 请投票给我(2007)
  8. 种植树木的人,(Homme qui plantait des arbres,L')(1987)
  9. Shawshank Redemption,The(1994)
  10. 仅昨天(Omohide poro poro)(1991)
  11. 除了Yes Yesterday之外似乎没有任何意义。

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

    祝你好运

    编辑:

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

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

    不同的个人评分:

    • 个人评价:星球大战:第六集 - 绝地归来(1983)评级:5.0
    • 个人评价:Mission:Impossible(1996)评级:4.0
    • 个人评价:Die Hard:复仇(1995)评级:4.0
    • 个人评价:Batman Forever(1995)评级:5.0
    • 个人评价:黑人男子(1997)评级:4.0
    • 个人评价:终结者2:审判日(1991)评级:4.0
    • 个人评价:Top Gun(1986)评级:4.0
    • 个人评价:星球大战:第五集 - 帝国反击战(1980)评级:3.0
    • 个人评价:Alien(1979)评级:4.0

    推荐的电影是:

    推荐的电影:

    1. Carmen(1983)
    2. Silent Light(Stellet licht)(2007)
    3. 耶稣(1979)
    4. Oharu的生活,(Saikaku ichidai onna)(1952)
    5. 美国之心(2003)
    6. 圣经告诉我(2007)
    7. 更多(1998)
    8. Leigh Bowery传奇,(2002)
    9. Funeral,The(Ososhiki)(1984)
    10. Longshots,The(2008)
    11. 没有一个有用的结果。

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

      推荐的电影:

      1. 星球大战:第四集 - 新希望(a.k.a.星球大战)(1977)
      2. 终结者,(1984)
      3. 迷失方舟的攻略(印第安纳琼斯和失落方舟的攻略)(1981)
      4. Die Hard(1988)
      5. 教父,(1972)
      6. Aliens(1986)
      7. Rock,The(1996)
      8. 独立日(a.k.a.ID4)(1996)
      9. 星际迷航II:可汗之怒(1982)
      10. GoldenEye(1995)
      11. 这更符合我的预期!问题是为什么显式版本是如此糟糕

4 个答案:

答案 0 :(得分:2)

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

它甚至可能像ALS实现中的错误一样。如果可以,请尝试与ALS的其他实现进行比较。

我总是试图抵制推理的合理化,因为我们的大脑不可避免地会找到一些解释,即使是随机推荐。但是,嘿,我可以说你没有动作,恐怖,犯罪剧,惊悚片在这里。我发现孩子们的电影与艺术电影的味道齐头并进,因为,那些为MovieLens填写他们的品味的人回来的时候和孩子们的电影实际上并不是孩子,而是父母,也许软件工程师的类型足够老让孩子们往往会看到你看到的这些外国电影。

答案 1 :(得分:1)

协作过滤只是为您提供与您有相同品味的人真正喜欢的物品。如果您只评价儿童电影,并不意味着您只会推荐儿童电影。它只是意味着那些评价玩具总动员,丛林书,狮子王等等的人......你们也喜欢“生活的大春”,“更多”,“谁在那里唱歌”等等...... 维基百科页面上有一个很好的动画:CF

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

如果您想根据自己的喜好进行推荐,可以尝试像Matrix Factorization这样的潜在因子模型。潜在因素可能会发现电影可以被描述为描述评级对象特征的特征。可能是电影是漫画,儿童,恐怖等。(你从来都不知道潜在因素是什么)。如果您只评价儿童电影,您可能会推荐其他儿童电影。

希望它有所帮助。

答案 2 :(得分:1)

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

祝你好运

答案 3 :(得分:0)

我尝试使用相同的数据集并遵循此Spark教程,我得到相同(主观上不好)的结果。

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

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