协同过滤通常用于推荐系统。这类技术旨在填写用户项关联矩阵的缺失条目。spark.ml目前支持基于模型的协同过滤,其中用户和产品由可用于预测缺失条目的一小组潜在因素描述。spark.ml使用交替最小二乘(ALS)算法来学习这些潜在因素。实现中spark.ml包含以下参数:
1.numBlocks是用户和项目将被分区为多个块的数量,以便并行化计算(默认为10)
2.rank是模型中潜在因子的数量(默认为10)
3.maxIter是要运行的最大迭代次数(默认为10)
4.regParam指定ALS中的正则化参数(默认为1.0)
5.implicitPrefs指定是使用显式反馈 ALS变体还是使用适用于隐式反馈数据的变体。(默认为false使用显式反馈)
6.alpha是适用于ALS的隐式反馈变量的参数,其控制偏好观察中的基线置信度(默认为1.0)
7.nonnegative指定是否对最小二乘使用非负约束(默认为false)
注意:基于DataFrame的ALS API目前仅支持用户和项ID的整 数。user 和 item id列支持其他数字类型,但id必须在整数值范围内。
显性与隐性反馈
基于矩阵分解的协同过滤的标准方法将用户项矩阵中的条目视为用户对项目给出的显式偏好,例如,给予电影评级的用户。
在许多现实世界的用例中,通常只能访问隐式反馈(例如,观看,点击,购买,喜欢,分享等)。用于spark.ml处理此类数据的方法来自隐式反馈数据集的协作过滤。本质上,这种方法不是试图直接对评级矩阵进行建模,而是将数据视为代表强度的数字观察用户行为(例如点击次数或某人花在观看电影上的累积持续时间)。然后,这些数字与观察到的用户偏好的置信水平相关,而不是与项目的明确评级相关。然后,该模型试图找到可用于预测用户对项目的预期偏好的潜在因素。
缩放正则化参数
我们regParam通过用户在更新用户因素时产生的评级数或在更新产品因子时收到的产品评级数来缩小正则化参数以解决每个最小二乘问题。这种方法被命名为“ALS-WR”,并在“ Netflix奖的大规模并行协同过滤 ”一文中进行了讨论。它regParam更少依赖于数据集的规模,因此我们可以将从采样子集中学习的最佳参数应用于完整数据集,并期望获得类似的性能。
冷启动策略
在使用a进行预测时ALSModel,通常会遇到测试数据集中的用户和/或项目,这些用户和/或项目在训练模型期间不存在。这通常发生在两种情况中:
1.在生产中,对于没有评级历史且未对模型进行过培训的新用户或项目(这是“冷启动问题”)。
2.在交叉验证期间,数据在训练和评估集之间分配。当Spark中的使用简单随机拆分为CrossValidator或者TrainValidationSplit,它实际上是非常普遍遇到的评估组不是在训练组用户和/或项目。
默认情况下,Spark会在模型中不存在用户和/或项目因子时指定NaN预测ALSModel.transform。这在生产系统中很有用,因为它表示新用户或项目,因此系统可以决定使用某些后备作为预测。然而,这在交叉验证期间是不期望的,因为任何NaN预测值将导致NaN评估度量的结果(例如,在使用时RegressionEvaluator)。这使得模型选择不可能。
Spark允许用户将coldStartStrategy参数设置为“drop”,以便删除DataFrame包含NaN值的预测中的任何行。然后将根据非NaN数据计算评估度量并且该评估度量将是有效的。以下示例说明了此参数的用法。
注意:目前支持的冷启动策略是“nan”(上面提到的默认行为)和“drop”。将来可能会支持进一步的战略。