一 环境准备
1.1 编程环境
必须加入spark内容,将以下代码加入推荐逻辑之前
1 | # Path for spark source folder |
各个参数视个人机器配置而定
1.2 本地模式
在本地模式运行时,参数需要如下设定
1 | conf.setMaster("client") |
1. 3 数据准备
数据都是存放在HDFS上,需要先将数据上传到个人目录。
二 数据挖掘视角
接下来进入数据挖掘的思路,数据挖掘标准流程如下:
数据收集(本案例中数据已经准备好)
数据清洗转换
根据数据选择算法模型(本案例以推荐算法为例)
训练模型:使用训练数据训练算法模型中一些参数。
使用模型:使用训练好的模型预测或者对检验数据分类、聚类
评估模型:验证模型预测结果与真实结果误差,评估准确率、召回率等指标
2.1 收集数据
1 | dataset_path = os.path.join('/home/xiatao/machine_learing/moive_recommend/','') |
2.2 数据清洗转换
本示例中数据清洗和转换比较简单,只是去掉数据头,并将数据封装成RDD。在其他数据中可能需要去除部分没用的列,数据降维,连续型数据转换为离散型等操作。
1 | # 载入数据,将数据的头过滤出来 |
2.3 根据数据选择算法模型
本示例以推荐算法中的ALS(最小交替二乘法)为例,关于交替二乘法参考 https://www.zhihu.com/question/31509438
2.4 训练模型
在开始之前,我们先将数据分为三份,分别是training_rdd(训练数据) ,validation_rdd(验证数据),test_rdd(测试数据)。使用training_rdd获得一个训练模型,然后去预测validation_rdd结果,并计算训练模型对validation_rdd预测结果与validation_rdd真实结果之间误差,以此来决定模型应该使用的参数。
1 | # 使用小数据集选择 交叉最小二乘法参数 |
推荐算法ALS中最重要的比较重要的参数有如下:
rank:特征向量秩大小,越大的秩会得到更好的模型,但是计算消耗也相应增加。默认是 10
iteration: 算法迭代次数(默认是10)
lambda:正则参数,默认是 0.01。详细解释参考
alpha:在隐式ALS中用于计算置信度的常量,默认为1.0
numUserBlocks,numProductBlocks:将用户和产品数据分解的块数目,用来控制并行度;你可以传入-1来让MLlib自动决定。
本示例中,算法迭代次数固定为10(可以根据实际情况调整),lambda参数固定位 0.1 ,由于本文的电影评分数据是确信数据,使用的ALS是确定模型,因此不需要alpha参数,numUserBlocks和numProductBlocks参数使用默认参数。
因此,本示例中需要训练的参数是 rank,不同的rank会影响模型的预测准确度,不同的模型其预测误差可以通过均方根误差(标准方差RMSE)来衡量优劣。选取均方根误差最小的rank作为预测模型的rank。
1 | seed =5L |
2.5 使用模型
使用训练数据中获得的最佳参数来构建新的推荐模型,本示例中使用完整数据集ml-lates数据集检验模型预测结果,为了检验模型准确率,我们将数据分为训练数据和验证数据两份,分别为training_complete_rdd(70%),test_complete_rdd (30%)
1 | #现在开始使用完整数据集来构建最终模型 |
2.6 评估验证模型
使用完整数据集中30%的部分来测试模型预测结果准确率。
1 | #在测试数据集上测试 |
此示例中只使用了平方根误差来评估模型。
2.7 模型后续使用
2.7.1 给老用户(对部分电影有评分)推荐
添加新数据,每次添加新数据都需要重新训练模型,此时将新数据与原数据合并再训练并得到模型。
1 | #添加新的用户评分, |
再利用此模型向老用户推荐电影
1 | # 获取最好的推荐。鉴于我们将获得新用户没有评分的RDD |
2.7.2 预测新用户对某部电影评分
三 模型的保存于复用
可以将我们的模型存储起来作为后续的在线推荐系统使用,尽管每次有新的用户评分数据时都会生成新的模型,为了节省服务启动时间。当前的模型也是值得存储的。我们可以通过存储那些RDD以节省时间,尤其是那些需要消耗极大时间的。
1 | from pyspark.mllib.recommendation import MatrixFactorizationModel |