我正在使用星火建立一个推荐系统原型。在阅读了一些教程之后,我已经能够根据我的数据来训练一个MatrixFactorizationModel。
但是,由Spark训练的模型只是一个Serializable。如何使用此模型为实际用户提供推荐?我的意思是,如果用户数据增加了,我如何将模型保存到某种数据库中,或者更新它呢?
例如,Mahout推荐库所训练的模型可以存储到像Redis这样的数据库中,然后我们可以查询推荐的项目列表。但我们怎样才能在星火中做类似的事情呢?有什么建议吗?
发布于 2015-01-07 18:31:11
另一种使用Spark创建recs的方法是搜索引擎方法。这基本上是Solr或Elasticsearch提供的共现推荐服务。将因式分解与共现进行比较是不可能的,所以我将只描述后者。
您将交互(用户id、项id)输入到Mahout的spark-itemsimilarity中。这将为交互数据中的每个项目生成类似项的列表。默认情况下,它将作为csv出现,因此可以存储在任何地方。但是它需要被搜索引擎索引。
在任何情况下,当您想要获取recs时,您使用用户的历史记录作为查询,您将得到一个作为recs的有序项列表。
此方法的一个优点是可以为任意多个用户操作计算指示数。用户采取的任何与您想推荐的内容相关的操作都可以使用。例如,如果您想推荐购买,但您也记录产品视图。如果你把产品视图和购买同等对待,你可能会变得更糟(我试过了)。然而,如果你计算一个购买指标和另一个(实际上是交叉发生的)产品视图指标,他们对购买的预测是一样的。这会增加用于recs的数据。可以对用户位置进行相同类型的操作,以便将位置信息混合到购买资源中。
您还可以根据上下文偏倚您的recs。如果您在目录中的“电子”部分,您可能希望recs向电子产品倾斜。将电子产品添加到针对项的“类别”元数据字段的查询中,并使其在查询中得到提升,您就会有偏颇的recs。
由于指示符的所有偏差和混合都发生在查询中,这使得recs引擎很容易调优到多个上下文,同时只维护一个通过搜索引擎进行的多字段查询。我们从Solr或Elasticsearch获得可伸缩性。
分解或搜索方法的另一个好处是,可以使用全新的用户和新的历史记录来创建recs,旧的Mahout推荐程序只能向运行作业时已知的用户和交互推荐。
这里的描述:
发布于 2015-01-19 21:07:33
您应该在减少的RDD (用户,产品)对上运行model.predictAll(),如MahoutHadoop作业中的一组,并存储结果以供在线使用.
发布于 2015-12-31 06:39:43
您可以使用函数.save(sparkContext,outputFolder)将模型保存到您选择的文件夹中。在实时提供建议的同时,您只需使用MatrixFactorizationModel.load(sparkContext,modelFolder)函数将其作为MatrixFactorizationModel对象加载即可。
问@Sean :MatrixFactorizationObject不包含分解矩阵:用户特性和项特征矩阵,而不是推荐/预测评分。
https://stackoverflow.com/questions/27815147
复制相似问题