【问题标题】:Get wrong recommendation with ALS.recommendation使用 ALS.recommendation 获得错误的建议
【发布时间】:2017-04-17 17:37:26
【问题描述】:

我编写了一个用于提出建议的 spark 程序。然后我使用了 ALS.recommendation 库。我用以下名为 trainData 的数据集做了一个小测试:

(u1, m1, 1)
(u1, m4, 1)
(u2, m2, 1)
(u2, m3, 1)
(u3, m1, 1)
(u3, m3, 1)
(u3, m4, 1)
(u4, m3, 1)
(u4, m4, 1)
(u5, m2, 1)
(u5, m4, 1)

第一列包含用户,第二列包含用户评分的项目,第三列包含评分。

在我用 scala 编写的代码中,我使用以下方法训练了模型:

myModel = ALS.trainImplicit(trainData, 3, 5, 0.01, 1.0)

我尝试使用以下指令检索 u1 的一些建议:

recommendations = myModel.recommendProducts(idUser, 2)

其中 idUser 包含影响用户的 ID u1 作为建议,我得到:

(u1, m1, 1.0536233346170754)
(u1, m4, 0.8540954252858661)
(u1, m3, 0.09069877419040584)
(u1, m2, -0.1345521479521654)

如您所见,前两行显示推荐的项目是 u1 已经评分的项目(m1 和 m4)。 无论我选择哪个用户来获得推荐,我总是得到相同的行为(推荐的第一个项目是用户已经评分的项目)。

我觉得很奇怪!有什么问题吗?

【问题讨论】:

    标签: apache-spark machine-learning apache-spark-mllib recommendation-engine collaborative-filtering


    【解决方案1】:

    我认为这是使用 recommendProducts 的预期行为,当您训练诸如 ALS 之类的矩阵分解算法时,您正试图找到将每个用户与每个项目相关联的评级。

    ALS 会根据用户已经评价过的商品来执行此操作,因此当您为给定用户寻找推荐时,模型将最确定它已经看到的评价,因此大多数情况下它会推荐已经过的产品额定。

    您需要做的是保留每个用户的评分产品列表,并在提出建议时对其进行过滤。

    编辑:

    我深入研究了源代码和文档以确保我在说什么。

    ALS.recommendProducts 在类MatrixFactorizationModel (source code) 中实现。您可以在那里看到,模型在进行推荐时并不关心用户是否已经对该项目进行了评分。

    并且您应该注意,如果您使用隐式评级,那么您最明确地想要推荐已经被用户隐式评级的产品: 想象一下,您的隐式评分是您的产品在在线商店中的页面浏览量,而您想要的是用户购买该产品。

    我无权访问那本书使用 Spark 进行高级分析,所以我无法评论那里的解释和示例。

    文档:

    【讨论】:

    • 我不同意你的回答。因为您描述的预期行为与“使用 Spark 进行高级分析”一书中提出的解释和示例不匹配。
    • 用来源和文档中的信息更新了我的答案
    猜你喜欢
    • 2018-01-09
    • 2018-05-25
    • 2017-06-02
    • 1970-01-01
    • 2020-07-22
    • 2014-03-26
    • 1970-01-01
    • 2023-03-13
    • 2015-12-28
    相关资源
    最近更新 更多