我想尝试Spark使用MLlib进行协同过滤,如本教程中所述: https://databricks-training.s3.amazonaws.com/movie-recommendation-with-mllib.html 该算法基于“隐式反馈数据集的协同过滤”,进行矩阵分解。
使用1000万个Movielens数据集启动并运行一切。 数据集分为80%培训10%测试和10%验证。
虽然具有不同的训练参数,但这些值与教程类似。
我尝试了多次运行算法,总是得到对我没有任何意义的建议。 即使只评价儿童电影,我也会得到以下结果:
评分:
结果:
推荐的电影:
除了Yes Yesterday之外似乎没有任何意义。
如果有人知道如何解释这些结果或获得更好的结果,我将非常感谢您分享您的知识。
祝你好运
编辑:
正如所建议的那样,我训练了另一个有更多因素的模型:
不同的个人评分:
推荐的电影是:
推荐的电影:
没有一个有用的结果。
EDIT2: 使用隐式反馈方法,我得到了更好的结果!使用与上述相同的动作片,建议如下:
推荐的电影:
这更符合我的预期!问题是为什么显式版本是如此糟糕
答案 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作为相似性度量 - 而不是矩阵分解,我得到了更好,更好的结果。这意味着我主要使用您的输入首选项和相同的输入评级文件来获取儿童电影。
除非你真的需要分解(虽然它有很多优点),但我建议使用另一种推荐方法。