赞
踩
协同过滤 通常用于推荐系统。 这些技术旨在填写用户项关联矩阵的缺失条目。 spark.ml 目前支持基于模型的协同过滤, 其中用户和产品由一小组可用于预测缺失条目的潜在因素描述。spark.ml 使用交替最小二乘( ALS) 算法来学习这些潜在因素。 实现中 spark.ml 包含以下参数:
我们 regParam 通过用户在更新用户因素时产生的评级数或在更新产品因子时收到的产品评级数来缩小正则化参数以解决每个最小二乘问题。 这种方法被命名为“ALS-WR”, 并在“ Netflix 奖的大规模并行协同过滤 ”一文中进行了讨论。 它 regParam 更少依赖于数据集的规模, 因此我们可以将从采样子集中学习的最佳参数应用于完整数据集, 并期望获得类似的性能
在使用ALS进行预测时, 通常会遇到测试数据集中的用户或物品没有出现过, 这些用户或物品在训练模型期间不存在。 这通常发生在两种情况中:
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]) # 在训练集上构建推荐系统模型 # 在这里我们设置了冷启动的策略为‘drop’,以保证我们不会得到一个‘NAN’的预测结果 als = ALS(maxIter=5, regParam=0.01, userCol="userId", itemCol="movieId", ratingCol="rating", coldStartStrategy="drop") model = als.fit(training) # 在测试集上评估模型,标准为RMSE predictions = model.transform(test) evaluator = RegressionEvaluator(metricName="rmse", labelCol="rating", predictionCol="prediction") rmse = evaluator.evaluate(predictions) print("Root-mean-square error = " + str(rmse)) # 为每一个用户推荐10个电影 userRecs = model.recommendForAllUsers(10) # 为每个电影推荐10个用户 movieRecs = model.recommendForAllItems(10) # 为指定的一组用户生成top10个电影推荐 users = ratings.select(als.getUserCol()).distinct().limit(3) userSubsetRecs = model.recommendForUserSubset(users, 10) # 为指定的一组电影生成top10个用户推荐 movies = ratings.select(als.getItemCol()).distinct().limit(3) movieSubSetRecs = model.recommendForItemSubset(movies, 10)
本篇博客是使用的sparkML库,底层的数据结构使用的DataFrame,在使用对应的包的时候要注意区分,这里博主比较常用的是Python,所以给出的代码也是Python代码,如果有其他的需求或者不同的技术栈,可以参考官网!
这里要提一句的是,spark官方实现的ALS由于调度方面的问题,在训练的时候非常的慢,如果对效率有要求的,这里需要自己去自己去实现一下,在后续的更新中,也会给出一些自己实现的版本。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。