【问题标题】:Spark - How to use the trained recommender model in production?Spark - 如何在生产中使用训练有素的推荐模型?
【发布时间】:2015-01-07 08:23:42
【问题描述】:

我正在使用 Spark 构建推荐系统原型。在学习了一些教程之后,我已经能够从我的数据中训练出MatrixFactorizationModel

但是,Spark mllib 训练的模型只是一个Serializable。如何使用此模型为真实用户进行推荐?我的意思是,如果用户数据已增加,我如何将模型保存到某种数据库中或更新它?

比如Mahout推荐库训练出来的模型可以存入Redis之类的数据库中,之后我们可以查询到推荐的物品列表。但是我们如何在 Spark 中做类似的事情呢?有什么建议吗?

【问题讨论】:

    标签: apache-spark mahout recommendation-engine mahout-recommender


    【解决方案1】:

    首先,您所指的 Mahout 的“模型”不是模型,而是预先计算的推荐列表。您也可以使用 Spark 执行此操作,并为用户批量计算推荐,并将它们保存在您喜欢的任何地方。这与序列化模型无关。如果您不想进行实时更新或评分,您可以停下来,像使用 Mahout 一样使用 Spark 进行批处理。

    但我同意,在很多情况下,您确实希望将模型运送到其他地方并提供服务。如您所见,Spark 中的其他模型是Serializable,但不是MatrixFactorizationModel。 (是的,即使它被标记为这样,它也不会序列化。)同样,预测模型有一个标准序列化称为PMML,但它不包含因子矩阵模型的词汇表。

    原因其实是一样的。虽然许多预测模型,如 SVM 或逻辑回归模型,只是一小组系数,但因子矩阵模型非常庞大,包含两个矩阵,可能有数十亿个元素。这就是为什么我认为 PMML 没有任何合理的编码。

    同样,在 Spark 中,这意味着实际的矩阵是不能直接序列化的 RDDs。您可以将这些 RDD 持久化到存储中,使用 Spark 在其他地方重新读取它们,然后通过这种方式手动重新创建 MatrixFactorizationModel

    但您不能使用 Spark 提供或更新模型。为此,您确实在考虑编写一些代码来执行更新并即时计算建议。

    我不介意在这里推荐Oryx 项目,因为它的目的是管理这方面,特别是对于 ALS 推荐。事实上,Oryx 2 项目基于 Spark,虽然处于 alpha 阶段,但已经包含完整的管道来序列化和服务MatrixFactorizationModel 的输出。我不知道它是否满足您的需求,但至少可能是一个有趣的参考点。

    【讨论】:

    • 感谢您出色而详细的解释!我会试试 Oryx :)
    【解决方案2】:

    另一种使用 Spark 创建记录的方法是搜索引擎方法。这基本上是由 Solr 或 Elasticsearch 提供的同现推荐器。将因式分解与同现进行比较超出了这个问题,所以我只描述后者。

    您将交互(用户 ID、项目 ID)输入 Mahout 的 spark-itemsimilarity。这会为交互数据中看到的每个项目生成一个相似项目列表。默认情况下,它将以 csv 格式出现,因此可以存储在任何地方。但它需要被搜索引擎索引。

    在任何情况下,当您想要获取记录时,您使用用户的历史记录作为查询,您会返回一个有序的项目列表作为记录。

    这种方法的一个好处是可以根据需要为尽可能多的用户操作计算指标。可以使用用户采取的与您想要推荐的内容相关的任何操作。例如,如果您想推荐购买,但您也记录了产品浏览量。如果您将产品视图与购买相同,您可能会得到更差的记录(我已经尝试过了)。但是,如果您计算购买指标和产品视图的另一个(实际上是交叉共现)指标,它们同样可以预测购买。这具有增加用于记录的数据的效果。可以对用户位置进行相同类型的操作,以将位置信息融合到购买记录中。

    您还可以根据上下文偏向您的推荐。如果您在目录的“电子产品”部分,您可能希望 recs 偏向电子产品。根据项目的“类别”元数据字段将电子产品添加到查询中,并在查询中提升它,您就有了偏见。

    由于指标的所有偏差和混合都发生在查询中,这使得 recs 引擎可以轻松调整到多个上下文,同时仅保留一个通过搜索引擎进行的多字段查询。我们从 Solr 或 Elasticsearch 获得可扩展性。

    因式分解或搜索方法的另一个好处是,全新的用户和新的历史可用于创建记录,其中较旧的 Mahout 推荐器只能向用户推荐和在作业运行时已知的交互。

    这里的描述:

    【讨论】:

      【解决方案3】:

      您应该像在 Mahout Hadoop 作业中那样在减少的 RDD 组(用户、产品)对上运行 model.predictAll(),并存储结果以供在线使用...

      https://github.com/apache/mahout/blob/master/mrlegacy/src/main/java/org/apache/mahout/cf/taste/hadoop/item/RecommenderJob.java

      【讨论】:

        【解决方案4】:

        您可以使用函数 .save(sparkContext, outputFolder) 将模型保存到您选择的文件夹中。在实时给出建议时,您只需使用 MatrixFactorizationModel.load(sparkContext, modelFolder) 函数将其加载为 MatrixFactorizationModel 对象。

        @Sean Owen 的问题:MatrixFactorizationObject 不包含分解矩阵:用户特征和项目特征矩阵,而不是推荐/预测评级。

        【讨论】:

          猜你喜欢
          • 2017-07-15
          • 2019-09-09
          • 2020-07-10
          • 1970-01-01
          • 1970-01-01
          • 2018-08-30
          • 2018-05-01
          • 2017-08-08
          • 2017-08-19
          相关资源
          最近更新 更多