基于Spark ALS构建商品推荐引擎
一般来讲,推荐引擎试图对用户与某类物品之间的联系建模,其想法是预测人们可能喜好的物品并通过探索物品之间的联系来辅助这个过程,让用户能更快速、更准确的获得所需要的信息,提升用户的体验、参与度以及物品对用户的吸引力。
在开始之前,先了解一下推荐模型的分类:
1、基于内容的过滤:利用物品的内容或是属性信息以及某些相似度定义,求出与该物品类似的物品 2、协同过滤:利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度 3、矩阵分解(包括显示矩阵分解、隐式矩阵分解和最小二乘法) |
当前Spark模型库中只包含基于矩阵分解的实现,其中最小二乘法(Alternating Least Squares,ALS)是一种求解矩阵分解问题的最优化方法(把稀疏的矩阵近似地转为两个稠密矩阵的乘积)。因此,本文将采用Spark ALS来实现商城礼物推荐。
一个推荐系统的实施,一般需要以下几个步骤:
1、数据准备:获取训练模型所需的数据,比如收集用户历史以来的购买记录和浏览记录 2、数据清理:大部分机器学习模型所处理的都是特征,但通常上述获取的数据都是原始形式,需要进一步处理。比如数据过滤、处理异常值、合并数据源、数据汇总等。本例重点放在评分计算规则上 3、数据转化:对数据中的某些特征进行标准化(StandardScaler)、归一化(MinMaxScaler)、正则化(Normalizer)的缩放转化 4、模型训练和测试回路:当数据已转化模型可识别的形式,就可以开始模型的训练和测试。把数据划分为两部分,一部分是训练数据,用于构建模型,另一部分是测试数据,用于检验模型 5、模型评估:在训练数据集上运行模型并在测试集上测试其效果,进行交叉验证,评估其推荐效果 6、模型优化:这部分关注对特定模型最佳参数的选择问题,通常情况下,我们会尝试调整算法中的超参数,通过多次迭代训练模型,选择最优的结果 |
用户如需测试数据集,可以从UCL机器学习知识库下载:包括近300个不同大小和类型的数据集,可用于分类、回归、聚类 和推荐系统任务。数据集列表位于: http://archive.ics.uci.edu/ml/
经过上面的转化后,最终传递给模型的训练数据的格式为:
1,1330,1,1,穷神(用户ID,商品ID,购买数量排序,购买数量,商品名称)-->Rating(1,1330,0.05)(用户ID,商品ID,评分) |
主函数代码实现:
打包执行:
bin/spark-submit --class com.boyaa.spark.rel.GiftRecommend --master spark://dn11:7077 --num-executors 24 --executor-cores 24 --driver-memory 4g --executor-memory 4g --jars /data/mf/lib/fastjson-1.2.14.jar sparkml.jar file:/data/soft/new/spark/20150615-20160912.csv 0 25 25 0.01 -1 0 选取评估结果中均方根误差最小并且决定系数最高的超参数组合: |
选择超参数:
1、rank,模型的潜在因素个数,也是矩阵的阶 2、iterations,矩阵分解迭代次数,迭代次数越多,花费时间越长,但分解的结果可能会更好 3、lambda,标准的过拟合参数,值越大越不容易产生过拟合,但值太大会降低分解的准确性 4、blocks,决定并发分解计算的程度 5、seed,随机种子 |
不同超参数结果对比:
给一个用户推荐商品:
推荐结果:
original为用户历史购买的商品ID,actual为用户实际需要购买的商品ID,recommend为推荐的商品列表 {"original":[1699,1325,1314,221,1328,628,1329,1331,1324],"actual":1330,"recommend":[695,2104,1324,1330,428],"user":1} |
计算所有用户推荐结果的均方根误差: