我想尝试使用本教程中解释的MLlib使用Spark进行协作过滤:https://databricks-training . S3 . amazonaws . com/movie-recommendation-with-ml lib . html该算法基于论文“隐式反馈数据集的协作过滤”,进行矩阵分解。
一切都使用1000万个Movielens数据集启动并运行。数据集分为80%训练10%测试和10%验证。
这些值与教程相似,但具有不同的训练参数。
我试着运行了几次算法,总是得到对我没有任何意义的建议。即使只对儿童电影进行评级,我也会得到以下结果:
对于评级:
结果:
推荐给你的电影:
除了《只有昨天》似乎没有任何意义。
如果有谁知道如何解释这些结果或得到更好的结果,我真的很感谢你分享你的知识。
致敬
编辑:
根据建议,我训练了另一个具有更多因素的模型:
和不同的个人评级:
推荐的电影有:
推荐给你的电影:
没有一个有用的结果。
编辑2:使用隐式反馈方法,我得到了更好的结果!对于与上述相同的动作片,建议如下:
推荐给你的电影:
这正是我所期望的!问题是为什么露骨的版本如此糟糕
请注意,您正在运行的代码不使用隐式反馈,也不是您所引用的算法。只需确保您没有使用ALS.trainImplicit
。您可能需要不同的lambda和秩。对于该数据集,0.88的RMSE为“OK”;我不清楚这个例子的值是最优的,还是仅仅是玩具测试产生的值。您仍然在此处使用不同的值。也许这还不是最理想的。
它甚至可能是自那以后修复的 ALS 实现中的错误之类的东西。如果可以,请尝试与 ALS 的其他实现进行比较。
我总是试图抵制合理化的建议,因为我们的大脑不可避免地会找到一些解释,即使是随机的建议。但是,嘿,我可以说,你在这里没有得到动作、恐怖、犯罪剧、惊悚片。我发现儿童电影与对附庸风雅电影的品味是齐头并进的,因为,很久以前,当对儿童电影进行评级时,那种满足他们口味的人实际上不是儿童,而是父母,也许软件工程师类型的年龄足以有孩子,他们确实倾向于看你看到的这类外国电影。
协同过滤只是给你一些和你品味相同的人真正喜欢的东西。如果你只给儿童电影评分,并不意味着你会被推荐儿童电影。这只意味着给《玩具总动员》、《丛林故事》、《狮子王》等评分的人...因为你也喜欢小笠原的生活,还有,谁在那边唱歌?等等...你在维基百科页面上有一个很好的动画:CF
我没有读你给的链接,但是有一件事你可以改变,那就是如果你想继续使用协同过滤的话,你所使用的相似性度量。
如果你想根据自己的喜好推荐,你可以尝试潜在因子模型,如矩阵分解。在这里,潜在因素可能会发现电影可以被描述为描述额定对象特征的特征。可能是一部电影是喜剧、儿童、恐怖等。(顺便说一下,你永远不知道潜在因素是什么)。如果您只对儿童电影进行评分,您可能会推荐其他儿童电影。
希望有帮助。
其次,弗拉德说,尝试相关或杰卡德。即忽略评分数字,只查看二进制“这两部电影是否在用户的偏好列表中在一起”。当我构建我的第一个推荐器时,这对我来说是一个游戏规则的改变者:http://tdunning.blogspot.com/2008/03/surprise-and-coincidence.html
祝你好运