PySpark推荐引擎

PySpark推荐引擎

任务目标

1、了解推荐引擎

2、掌握Spark MLlib ALS推荐算法

相关知识

推荐引擎是最常见的机器学习应用,我们可以在各大购物网站上看见这方面的应用。

Spark MLlib支持ALS(Alternating Least Squares)推荐算法,是机器学习的协同过滤推荐算法。机器学习的协同过滤推荐算法通过观察所有用户给产品的评价来推断每个用户的喜好,并向每个用户分别推荐多个合适的产品,也可以把某个产品推荐给多个用户。

系统环境

  • Linux Ubuntu 16.04
  • Python 3.5.5
  • Anaconda
  • Spark1.6
  • IPython Notebook

任务内容

本实验包含使用Spark MLlib ALS算法进行推荐模型训练,并使用电影数据进行练习。

任务步骤

1.切换到/apps/hadoop/sbin目录下,开启hadoop相关进程

view plain copy

  1. cd /apps/hadoop/sbin  
  2.   
  3. ./start-all.sh  

2.切换到/data目录下,下载实验数据

view plain copy

  1. cd /data  
  2.   
  3. wget http://192.168.1.100:60000/allfiles/pyspark8/ml-100k.zip  

3.在/data目录下,将下载的ml-100k.zip解压至当前目录下

view plain copy

  1. unzip ml-100k.zip  

4.将解压后的ml-100k文件上传至HDFS中

view plain copy

  1. hadoop fs -put ml-100k /  

5.在/data目录下,启动IPython Notebook界面运行PySpark

view plain copy

  1. cd /data  
  2.   
  3. PYSPARK_DRIVER_PYTHON=/home/zhangyu/anaconda3/bin/jupyter-notebook PYSPARK_DRIVER_PYTHON_OPTS=" --ip=127.0.0.1" pyspark  

6.创建一个Notebook,点击右侧New按钮,选择Python[Root]

7.首先,我们使用sc.textFile读取ml-100k

我们使用sc.textFile读取HDFS上的ml-100k数据集中的u.data,并且查看数据项数

view plain copy

  1. rawUserData = sc.textFile("hdfs://127.0.0.1:9000/ml-100k/u.data")  
  2. rawUserData.count()  

从以上运行结果中可以看到共有100000项评分数据。

8.查看u.data第一项数据

view plain copy

  1. rawUserData.first()  

以上4个字段分别是:用户id、项目id、评分、日期时间,\t为分隔符。

9.导入Rating模块

view plain copy

  1. from pyspark.mllib.recommendation import Rating  

10.读取rawUserData前三个字段,按照用户、产品、用户对此产品的评价来编写rawRatings

view plain copy

  1. rawRatings = rawUserData.map(lambda line:line.split("\t")[:3])  
  2. rawRatings.take(5)  

以上程序显示了前5项rawRatings数据。上列命令的详细说明如下:

 

准备ALS训练数据

ALS训练数据格式是RatingRDD数据类型,Rating定义如下:

 

11.可以使用下列命令编写ratingsRDD

view plain copy

  1. ratingsRDD = rawRatings.map(lambda x:(x[0],x[1],x[2]))  
  2. ratingsRDD.take(5)  

 

从以上运行结果可以看到前5项数据,并且每一项含有用户、产品、用户对此产品的评价

12.查看ratingsRDD项数

view plain copy

  1. numRatings = ratingsRDD.count()  
  2. numRatings  

 

以上运行结果显示共有100000项评价

13.查看不重复用户数

x[0]是用户字段,可以先用.map(lambda x:x[0])转换为用户数据,再使用.distinct()筛选出不重复的数据,最后显示numUsers

view plain copy

  1. numUsers = ratingsRDD.map(lambda x:x[0]).distinct().count()  
  2. numUsers  

以上运行结果显示共有943个不重复用户

14.查看不重复电影数

x[1]是电影字段,可以先使用.map(lambda x:x[1])转换为电影数据,再使用.distinct()筛选出不重复的数据

view plain copy

  1. numMovies = ratingsRDD.map(lambda x:x[1]).distinct().count()  
  2. numMovies  

如何训练模型

如图,我们将使用rawUserData数据以map转换为rawRatings,再改用map转换为ALS训练数据格式RDD[Rating]。然后使用ALS.train进行训练,训练完后就会创建推荐引擎模型MatrixFactorizationModel。

15.导入ALS模块

view plain copy

  1. from pyspark.mllib.recommendation import ALS  

使用ALS.train介绍

我们将使用ALS.train命令进行训练。ALS.train可分为显式评分与隐式评分训练。

显式评分(Explicit Rating)训练

ALS.train(ratings,rank,iterations=5,lambda_=0.01):

返回:MatrixFactorizationModel

隐式评分(Implicit Rating)训练

ALS.trainImplicit(ratings,rank,iterations=5,lambda_=0.01):

返回:MatrixFactorizationModel

两种评分训练的作用都是训练数据并返回模型

 

16.我们可以使用ALS.train命令并传入之前创建的ratingsRDD进行训练,训练完成后返回model

view plain copy

  1. model = ALS.train(ratingsRDD,10,10,0.01)  
  2. print(model)  

如何使用模型进行推荐

前面我们已经训练完成并建立了模型,接下来将使用此模型进行推荐

针对用户推荐电影

我们可以针对每个会员定期发送消息,或在会员登录时向会员推送可能会感兴趣的电影。

针对用户推荐电影,我们可以使用model.recommendProducts方法来推荐,说明如下表所示

MatrixFactorizationModel.recommendProducts(user:Int,num:Int):输入参数user,针对此user推荐给他有可能感兴趣的产品。

参数说明:

 

17.使用训练完的模型,向用户100推荐他可能感兴趣的前5部电影,传入参数(user=100,num=5)

view plain copy

  1. model.recommendProducts(100,5)  

以上执行结果显示,第1项数据是系统针对此用户首先推荐的产品,其意义是推荐给用户ID 100,产品ID1268,推荐评分大约为6.76,推荐评分越高,代表系统越优先推荐此产品

查看针对用户推荐产品的评分

18.我们可以查询系统对用户推荐产品的评分。例如,我们查询上一步骤的第一项,系统针对用户100推荐产品1141的评分

view plain copy

  1. model.predict(100,1141)  

针对电影推荐给用户

当我们想要促销某些电影时,可以找出可能会对这些电影感兴趣的会员,并且发送消息。针对电影推荐给用户,我们可以使用model.recommendUsers方法推荐。

MatrixFactorizationModel.recommendUsers(product:Int,num:Int):输入参数product,针对此product推荐给可能有兴趣的用户。

参数说明:

19.使用训练完的模型,推荐对电影200感兴趣的前5个用户,传入参数(produce=200,num=5)

view plain copy

  1. model.recommendUsers(product=200,num=5)  

以上运行结果显示,第一项数据是系统针对电影推荐给用户。其意思是针对电影ID200推荐给用户ID362,推荐评分大约为6.56

显示推荐的电影名称

之前的例子只显示推荐电影的ID,下面我们使用u.item数据显示推荐电影的名称

20.使用sc.textFile将u.item文本文件导入itemRDD

view plain copy

  1. itemRDD = sc.textFile("hdfs://127.0.0.1:9000/ml-100k/u.item")  
  2. itemRDD.count()  

 

以上运行结果显示共计1682项电影数据

21.为了显式推荐电影的名称,我们创建“电影ID与名称”的字典

view plain copy

  1. movieTitle=itemRDD.map(lambda line:line.split("|")).map(lambda a:(float(a[0]),a[1])).collectAsMap()  
  2. len(movieTitle)  

 

以上结果显示“电影ID与名称“字典共计1682项。

 

22.针对用户100推荐5部可能感兴趣的电影

view plain copy

  1. recommendP = model.recommendProducts(100,5)  
  2. for p in recommendP:  
  3.     print("对用户:"+str(p[0])+",推荐电影:"+str(movieTitle[p[1]])+",推荐评分:"+str(p[2]))  

至此,本实验就已经完成了!感兴趣的同学可以使用下面命令来下载更新的数据包来实验操作

view plain copy

  1. wget http://192.168.1.100:60000/allfiles/pyspark8/ml-latest.zip  

该数据包括:26万个评级和750,000个标记应用程序适用于270,000个用户的45,000部电影。包含标记基因组数该数据集(ml-latest)描述了来自电影推荐服务[MovieLens](http://movielens.org)的5星评级和自由文本标记活动。它在45843部电影中包含26024289个评分和753170个标记应用程序。这些数据由1995年1月9日至2017年8月4日期间的270896个用户创建。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值