Spark机器学习之协同过滤

协作过滤通常用于推荐系统。 这些技术旨在填补用户项目关联矩阵的缺失条目。 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)。

注意:用于ALS的基于DataFrame的API目前仅支持用户和项目ID的整数。 用户和项目id列支持其他数字类型,但是ids必须在整数值范围内。

1 显式与暗示反馈
基于矩阵分解的协同过滤的标准方法将用户项目矩阵中的条目视为用户给出的项目的显式偏好,例如给予电影评级的用户。
在许多现实世界的用例中,通常只能访问隐含的反馈(例如视图,点击,购买,喜欢,分享等)。在spark.ml中使用的处理这些数据的方法来自隐式反馈数据集的协同过滤。从本质上讲,这种方法不是直接对数据矩阵进行建模,而是将数据视为代表用户操作观察强度的数字(例如点击次数或观看电影的累积持续时间)。然后,这些数字与观察到的用户偏好的置信水平相关,而不是给予项目的明确评级。然后,该模型尝试找到可用于预测用户对项目的预期偏好的潜在因素。

2 正则化参数的缩放
我们通过用户在更新用户因素中产生的评分数量,或产品在更新产品因素中收到的评分数量来解决每个最小二乘问题的规则化参数regParam。 这种方法被命名为“ALS-WR”,并在“大型并行协同过滤Netflix奖”的论文中进行了讨论。 它使regParam对数据集的规模较少依赖,因此我们可以将从采样子集学到的最佳参数应用于完整数据集,并期望类似的性能。


Examples

from pyspark.ml.evaluation import RegressionEvaluator
from pyspark.ml.recommendation import ALS
from pyspark.sql import Row

lines = spark.read.text("data/mllib/als/sample_movielens_ratings.txt").rdd
parts = lines.map(lambda row: row.value.split("::"))
ratingsRDD = parts.map(lambda p: Row(userId=int(p[0]), movieId=int(p[1]),
                                     rating=float(p[2]), timestamp=long(p[3])))
ratings = spark.createDataFrame(ratingsRDD)
(training, test) = ratings.randomSplit([0.8, 0.2])

# Build the recommendation model using ALS on the training data
als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating")
model = als.fit(training)

# Evaluate the model by computing the RMSE on the test data
predictions = model.transform(test)
evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating",
                                predictionCol="prediction")
rmse = evaluator.evaluate(predictions)
print("Root-mean-square error = " + str(rmse))
如果评级矩阵是从另一个信息来源(即从其他信号推断出来的),您可以将implicitPrefs设置为True以获得更好的结果:

als = ALS(maxIter=5, regParam=0.01, implicitPrefs=True,
          userCol="userId", itemCol="movieId", ratingCol="rating")

你可能感兴趣的:(spark,机器学习)