Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark Spark-如何在生产中使用经过培训的推荐人模型?_Apache Spark_Mahout_Recommendation Engine_Mahout Recommender - Fatal编程技术网

Apache spark Spark-如何在生产中使用经过培训的推荐人模型?

Apache spark Spark-如何在生产中使用经过培训的推荐人模型?,apache-spark,mahout,recommendation-engine,mahout-recommender,Apache Spark,Mahout,Recommendation Engine,Mahout Recommender,我正在使用Spark构建一个推荐系统原型。在学习了一些教程之后,我已经能够从我的数据中训练出一个MatrixFactoryModel 然而,Spark mllib训练的模型只是一个可序列化的。如何使用此模型为实际用户进行推荐?我的意思是,如果用户数据已经增加,我如何将模型持久化到某种数据库中或更新它 例如,Mahout推荐库训练的模型可以存储到Redis这样的数据库中,之后我们可以查询推荐项列表。但我们如何在Spark中做类似的事情呢?有什么建议吗?首先,您在Mahout中提到的“模型”不是一个

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

然而,Spark mllib训练的模型只是一个可序列化的
。如何使用此模型为实际用户进行推荐?我的意思是,如果用户数据已经增加,我如何将模型持久化到某种数据库中或更新它

例如,Mahout推荐库训练的模型可以存储到Redis这样的数据库中,之后我们可以查询推荐项列表。但我们如何在Spark中做类似的事情呢?有什么建议吗?

首先,您在Mahout中提到的“模型”不是一个模型,而是一个预先计算好的建议列表。您还可以使用Spark来实现这一点,为用户计算批量推荐,并将其保存到您喜欢的任何地方。这与序列化模型无关。如果您不想进行实时更新或评分,您可以停在那里,像使用Mahout一样使用Spark for batch

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

原因其实是一样的。许多预测模型,如支持向量机或逻辑回归模型,只是一小部分系数,而因子矩阵模型是巨大的,包含两个可能包含数十亿元素的矩阵。这就是为什么我认为PMML没有任何合理的编码

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

但是,您不能使用Spark服务或更新模型。为此,您需要编写一些代码来执行更新并动态计算建议


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

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

您将交互(用户id、项目id)输入Mahout的
spark itemsimilarity
。这将为交互数据中的每个项生成一个类似项的列表。默认情况下,它将显示为csv,因此可以存储在任何地方。但它需要被搜索引擎编入索引

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

这种方法的一个好处是,可以为任意多个用户操作计算指标。用户采取的任何与您想要推荐的内容相关的操作都可以使用。例如,如果您想推荐购买,但也记录了产品视图。如果你对待产品视图和购买一样,你可能会得到更差的REC(我已经尝试过了)。然而,如果你为购买计算一个指标,为产品视图计算另一个(实际上是交叉共现)指标,它们同样可以预测购买。这会增加REC使用的数据。用户位置也可以做同样的事情,将位置信息混合到购买记录中

您还可以根据上下文对REC进行偏移。如果你在目录的“电子产品”部分,你可能希望REC向电子产品倾斜。将电子产品添加到针对项目“category”元数据字段的查询中,并在查询中对其进行增强,这样您就有了偏差REC

由于所有指标的偏差和混合都发生在查询中,因此recs引擎可以轻松地调整到多个上下文,同时只维护通过搜索引擎进行的一个多字段查询。我们从Solr或Elasticsearch获得可伸缩性

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

说明如下:


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


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


@Sean Owen:MatrixFactorizationObject是否包含因子分解矩阵:用户特征和项目特征矩阵,而不是建议/预测评分。

感谢您的精彩详细解释!我要试试羚羊:)