【问题标题】:Spark MLlib - How to validate implicit feedback collaborative filterSpark MLlib - 如何验证隐式反馈协同过滤器
【发布时间】:2017-11-09 08:30:56
【问题描述】:

我正在使用 Scala 进行编程,但语言在这里并不重要。

在这种情况下,隐式反馈协同过滤器 (ALS.trainImplicit) 的输入是产品的视图:

  • Rating("user1", "product1", 21.0) //表示user1查看了 product1 的详细信息 21 次
  • 评分("user2", "product1", 4.0)
  • 评分("user3", "product2", 7.0)

但是输出(MatrixFactorizationModel.recommendProductsForUsers)是这样的:

  • 评分("user1", "product1", 0.78)
  • 评分("user2", "product1", 0.63)

输出中的值 0.78 和 0.64 看起来像是在 0 和 1 之间归一化的值,但输入中的值是 21、4、7 等。

我认为在这种情况下计算输入和输出之间的 MSE(均方误差)没有任何意义,就像我们在使用带有明确反馈的协作过滤器时所做的那样。

那么,问题来了,如何在使用隐式反馈时验证协同过滤器?

【问题讨论】:

    标签: scala apache-spark apache-spark-mllib collaborative-filtering


    【解决方案1】:

    隐式反馈验证的重要 KPI 包括:准确性、覆盖范围和许多其他方面。这实际上取决于用例(您要展示多少产品?您要提供多少产品?)以及您想要实现的目标。

    当我构建隐式反馈 ALS 模型时,我总是计算这 2 个 KPI。具有非常好的精度的模型往往覆盖较少数量的可用产品。始终计算覆盖率并从那里决定。

    仔细看看这篇文章: https://stats.stackexchange.com/questions/226825/what-metric-should-i-use-for-assessing-implicit-matrix-factorization-recommender

    还有这个 Spark 库: https://github.com/jongwook/spark-ranking-metrics

    【讨论】:

    • 在这种情况下如何计算准确率和覆盖率(正式定义)?
    • 对我来说,了解客户是否在测试/验证期内购买了该商品(准确性)非常重要。所以建立一个训练集和一个测试集(训练后的时间段)。例如我将给定客户的前 5 项建议与测试期间的销售额进行比较。覆盖率只是可能产品中推荐产品(例如前 5 名)的百分比。
    猜你喜欢
    • 2015-02-08
    • 2015-11-28
    • 1970-01-01
    • 1970-01-01
    • 2014-09-05
    • 2016-03-31
    • 1970-01-01
    • 2015-05-23
    • 2015-02-23
    相关资源
    最近更新 更多