推荐系统中的数据收集

Data collection in recommendation systems

以何种方式收集用户数据的正确方法是使其可用于推荐系统中的模型构建(离线)和预测(在线)? 假设:

  1. 预测是通过多台服务器完成的。服务器有一些可用内存,但从用户数据的角度来看被认为是无状态的。这意味着用户可以在会话期间与不同的机器交互,并且无论用户登陆哪台机器,用户数据都应该可用。
  2. 所有附加到文章和推荐项目的元数据(如分类、文章文本等)在线和离线都可用。但是,获取此数据需要调用数据库。
  3. 一些用户 activity 需要相当快地进行推理,而其他 activity 可能会在事件发生后几个小时内可用。例如,在用户点击推荐后,我们希望尽快提供此信息。另一方面,在用户浏览该内容后,可以使用更长期的浏览行为数据进行推理。
  4. 所有用户的数据太大,无法在训练时保存在内存中。

问题: 该系统应该大规模运行。 会用到的主要技术和主要数据结构是什么?

我建议使用 Apache PredictionIO and the Universal Recommender plugin Engine.

这样的系统

PIO 在 real-time 中获取用户行为的输入,并告诉 Recommender 在后台进行训练。这通常会产生 "model" 的用户行为。实际的个人用户行为可以来自 real-time 观察,任何数据如何被视为影响推荐的输入都没有区别,都可以是 real-time。因此模型是在后台以批处理模式创建的,real-time 用户行为用于制定查询,因此 real-time 数据会影响结果。这通常称为 Lambda 风格的机器学习。

大多数类型的推荐系统都不允许您将不止一次转化用作用户行为的证据,因此也不允许将其用作用户偏好的可能指标。 Universal Recommender 是个例外,它可以使用任意数量的用户行为。

PIO 和 UR 建立在高度可扩展的服务之上,因此 "production" 系统可以水平扩展到任何需要的规模。其中包括 HDFS、HBase、Spark 和 Elasticsearch。 Universal Recommender 使用来自现代 Apache Mahout 的 Correlated Cross-Occurrence (CCO) 算法,而不是旧的基于 Hadoop 的 Mahout 推荐器。