基于Spark的电影推荐系统实现

这篇具有很好参考价值的文章主要介绍了基于Spark的电影推荐系统实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


未经许可,禁止以任何形式转载,若要引用,请标注链接地址
全文共计7821字,阅读大概需要3分钟

一、业务场景

受某视频网站委托,需开发一套基于Spark的大数据机器学习系统,应用协同过滤算法对网站客户进行电影推荐。

二、数据集说明

本案例所使用的数据集说明如下:
  评分数据集:/data/dataset/ml/movielens/ratings.csv
  电影数据集:/data/dataset/ml/movielens/movies.csv

三、操作步骤

阶段一、启动HDFS、Spark集群服务和zeppelin服务器

1、启动HDFS集群
  在Linux终端窗口下,输入以下命令,启动HDFS集群:

1.	$ start-dfs.sh

2、启动Spark集群
  在Linux终端窗口下,输入以下命令,启动Spark集群:

1.	$ cd /opt/spark
2.	$ ./sbin/start-all.sh

3、启动zeppelin服务器
  在Linux终端窗口下,输入以下命令,启动zeppelin服务器:

1.	$ zeppelin-daemon.sh start

4、验证以上进程是否已启动
  在Linux终端窗口下,输入以下命令,查看启动的服务进程:

1.	$ jps

如果显示以下6个进程,则说明各项服务启动正常,可以继续下一阶段。

1.	2288 NameNode
2.	2402 DataNode
3.	2603 SecondaryNameNode
4.	2769 Master
5.	2891 Worker
6.	2984 ZeppelinServer

阶段二、准备案例中用到的数据集

1、将本案例要用到的数据集上传到HDFS文件系统的”/data/dataset/ml/“目录下。在Linux终端窗口下,输入以下命令:

1.	$ hdfs dfs -mkdir -p /data/dataset/ml
2.	$ hdfs dfs -put /data/dataset/ml/movielens /data/dataset/ml/

2、在Linux终端窗口下,输入以下命令,查看HDFS上是否已经上传了该数据集:

1.	$ hdfs dfs -ls /data/dataset/ml/movielens

这时应该看到movielens目录及其中的训练数据集已经上传到了HDFS的”/data/dataset/ml/“目录下。

阶段三、对数据集进行探索和分析

1、新建一个zeppelin notebook文件,并命名为movie_project。
  2、先导入案例中要用到的机器学习库。在notebook单元格中,输入以下代码:

1.	// 导入相关的包
2.	import org.apache.spark.mllib.evaluation.RankingMetrics
3.	import org.apache.spark.ml.evaluation.RegressionEvaluator
4.	import org.apache.spark.ml.recommendation.ALS
5.	import org.apache.spark.ml.tuning.{ParamGridBuilder, CrossValidator}
6.	import org.apache.spark.sql.functions._
7.	import org.apache.spark.sql.types._
8.	import spark.implicits._

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

import org.apache.spark.mllib.evaluation.RankingMetrics
import org.apache.spark.ml.evaluation.RegressionEvaluator
import org.apache.spark.ml.recommendation.ALS
import org.apache.spark.ml.tuning.{ParamGridBuilder, CrossValidator}
import org.apache.spark.sql.functions.
import org.apache.spark.sql.types.
import spark.implicits._

3、加载数据集。在notebook单元格中,输入以下代码:

1.	// 加载数据。因为不需要timestamp列,因此立即删除它
2.	val file = "hdfs://localhost:9000/data/dataset/ml/movielens/ratings.csv"
3.	     
4.	val ratingsDF1 = spark.read.option("header", "true").
5.	                            option("inferSchema", "true").
6.	                            csv(file).
7.	                            drop("timestamp")
8.	     
9.	ratingsDF1.count
10.	ratingsDF1.printSchema

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

file: String = /data/spark_demo/movielens/ratings.csv
ratingsDF1: org.apache.spark.sql.DataFrame = [userId: int, movieId: int … 1 more field]
res97: Long = 100836
root
  |— userId: integer (nullable = true)|— movieId: integer (nullable = true)|— rating: double (nullable = true)

由以上输出内容可以看出,该数据集共有3个字段,分别是用户id、电影id和该用户对该电影的评分。

4、查看前5条数据。在notebook单元格中,输入以下代码:

1.	ratingsDF1.show(5)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

5、对数据进行简单统计。在notebook单元格中,输入以下代码:

1.	// 看看被评分的电影总共有多少部:
2.	ratingsDF1.select("movieId").distinct().count
3.	     
4.	// 看看有多少用户参与评分:
5.	ratingsDF1.select("userId").distinct().count

同时按下Shift+Enter键,执行以上代码,输出内容如下:

Long = 9724
Long = 610

由以上输出内容可以看出,该评分数据集中,参与的用户有610名,被评论的电影有9724部。

6、快速检查谁是活跃的电影评分者。在notebook单元格中,输入以下代码:

1.	// 快速检查谁是活跃的电影评分者
2.	val ratingsByUserDF = ratingsDF1.groupBy("userId").count()
3.	ratingsByUserDF.orderBy($"count".desc).show(10)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

由以上输出内容可以看出,参与度最高用的用户其id是414。

7、分析每部电影的最大评分数量。在notebook单元格中,输入以下代码:

1.	// 分析每部电影的最大评分数量
2.	val ratingsByMovieDF = ratingsDF1.groupBy("movieId").count()
3.	ratingsByMovieDF.orderBy($"count".desc).show(10)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

由以上输出内容可以看出,评价数超过300的电影有三部,其中评价数最多的电影其id是356。

8、数据拆分,将原始数据集拆分为训练集和测试集,其中训练集占80%,测试集占20%。在notebook单元格中,输入以下代码:

1.	// 为训练和测试准备数据
2.	val Array(trainingData, testData) = ratingsDF1.randomSplit(Array(0.8, 0.2))

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

trainingData: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [userId: int, movieId: int … 1 more field]
testData: org.apache.spark.sql.Dataset[org.apache.spark.sql.Row] = [userId: int, movieId: int … 1 more field]

9、Spark实现了ALS算法(Alternating Least Square),这一步建立ALS的实例。在notebook单元格中,输入以下代码:

1.	// 建立ALS的实例
2.	val als = new ALS().setRank(12).
3.	                    setMaxIter(10).
4.	                    setRegParam(0.03).
5.	                    setUserCol("userId").
6.	                    setItemCol("movieId").
7.	                    setRatingCol("rating")

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

als: org.apache.spark.ml.recommendation.ALS = als_10a2c5c69e40

10、训练模型,并设置模型的冷启动策略。在notebook单元格中,输入以下代码:

1.	// 训练模型
2.	val model = als.fit(trainingData)
3.	     
4.	// 从Spark 2.2.0开始,可以将coldStartStrategy参数设置为drop,以便删除包含NaN值的预测的DataFrame中的任何行。
5.	// 然后将在非nan数据上计算评估度量,该度量将是有效的。
6.	model.setColdStartStrategy("drop")

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

model: org.apache.spark.ml.recommendation.ALSModel = als_10a2c5c69e40
res169: model.type = als_10a2c5c69e40

11、执行预测,并查看预测结果。在notebook单元格中,输入以下代码:

1.	// 执行预测
2.	val predictions = model.transform(testData)
3.	     
4.	// 查看预测结果
5.	predictions.sort("userId").show(10)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

由以上输出内容可以看出,rating列为标签列,prediction为预测结果列。

12、有的预测值为NaN(非数字),这会影响到rmse的计算,因些需要先删除结果集中的NaN值。在notebook单元格中,输入以下代码:

1.	val predictions_dropNaN = predictions.na.drop(Array("prediction"))
2.	predictions_dropNaN.count

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

predictions_dropNaN: org.apache.spark.sql.DataFrame = [userId: int, movieId: int … 2 more fields]
res178: Long = 19333

由以上输出内容可以看出,删除prediction列具有NaN值的记录以后,结果集中还有19333条记录。

13、设置一个评估器(evaluator)来计算RMSE度量指标。在notebook单元格中,输入以下代码:

1.	// 设置一个评估器(evaluator)来计算RMSE度量指标
2.	val evaluator = new RegressionEvaluator().setMetricName("rmse").
3.	                                          setLabelCol("rating").
4.	                                          setPredictionCol("prediction")
5.	     
6.	val rmse = evaluator.evaluate(predictions_dropNaN)
7.	println(s"Root-mean-square error = ${rmse}")

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

evaluator: org.apache.spark.ml.evaluation.RegressionEvaluator = regEval_7943cc497104
rmse: Double = 1.017470307395966
Root-mean-square error = 1.017470307395966

由以上输出内容可以看出,根均方差(rmse)值为

1.017470307395966

14、使用ALSModel来执行推荐。在notebook单元格中,输入以下代码:

1.	// 为所有用户推荐排名前五的电影
2.	model.recommendForAllUsers(5).show(false)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

基于Spark的电影推荐系统实现

15、为每部电影推荐top 3个用户。在notebook单元格中,输入以下代码:

1.	// 为每部电影推荐top 3个用户
2.	val recMovies = model.recommendForAllItems(3)
3.	recMovies.show(5,false)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

由以上输出内容可以看出,为每部电影推荐前3个用户。但是不好的一点是,我们只能看到电影的id,而不是电影的名称。

16、读取电影数据集,这样就能看到电影标题了。在notebook单元格中,输入以下代码:

1.	// 读取电影数据集,这样就能看到电影标题了
2.	val moviesFile = "hdfs://localhost:9000/data/dataset/ml/movielens/movies.csv"
3.	val moviesDF = spark.read.option("header", "true").option("inferSchema", "true").csv(moviesFile)
4.	     
5.	val recMoviesWithInfoDF = recMovies.join(moviesDF, "movieId")
6.	recMoviesWithInfoDF.select("movieId", "title", "recommendations").show(5, false)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:
基于Spark的电影推荐系统实现

由以上输出内容可以看出,现在每部电影的id和名称都是可见的了。

17、使用CrossValidator对ALS模型进行调优。在notebook单元格中,输入以下代码:

1.	// 使用CrossValidator对ALS模型进行调优
2.	val paramGrid = new ParamGridBuilder()
3.	                    .addGrid(als.regParam, Array(0.05, 0.15))
4.	                    .addGrid(als.rank, Array(12,20))
5.	                    .build
6.	     
7.	val crossValidator=new CrossValidator()
8.	                        .setEstimator(als)
9.	                        .setEvaluator(evaluator)
10.	                        .setEstimatorParamMaps(paramGrid)
11.	                        .setNumFolds(3)
12.	     
13.	// 打印出4个超参数组合
14.	crossValidator.getEstimatorParamMaps.foreach(println)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

paramGrid: Array[org.apache.spark.ml.param.ParamMap] =
Array({
  als_10a2c5c69e40-rank: 12,
  als_10a2c5c69e40-regParam: 0.05
}, {
  als_10a2c5c69e40-rank: 20,
  als_10a2c5c69e40-regParam: 0.05
}, {
  als_10a2c5c69e40-rank: 12,
  als_10a2c5c69e40-regParam: 0.15
}, {
  als_10a2c5c69e40-rank: 20,
  als_10a2c5c69e40-regParam: 0.15
})
crossValidator: org.apache.spark.ml.tuning.CrossValidator = cv_efc8cf15a3ab
{
  als_10a2c5c69e40-rank: 12,
  als_10a2c5c69e40-regParam: 0.05
}
{
  als_10a2c5c69e40-rank: 20,
  als_10a2c5c69e40-regParam: 0.05
}
{
  als_10a2c5c69e40-rank: 12,
  als_10a2c5c69e40-regParam: 0.15
}
{
  als_10a2c5c69e40-rank: 20,
  als_10a2c5c69e40-regParam: 0.15
}

由以上输出内容可以看出,共打印了四组参数组合。

18、使用找到的最优模型来再次进行预测,并对预测结果进行评估。在notebook单元格中,输入以下代码:

1.	//这需要一段时间才能完成超过10个实验
2.	val cvModel = crossValidator.fit(trainingData)
3.	
4.	// 执行预测并删除空值
5.	val predictions2 = cvModel.transform(testData).na.drop
6.	     
7.	val evaluator2 = new RegressionEvaluator()
8.	                      .setMetricName("rmse")
9.	                      .setLabelCol("rating")
10.	                      .setPredictionCol("prediction")
11.	     
12.	val rmse2 = evaluator2.evaluate(predictions2)

同时按下【Shift+Enter】键,执行以上代码,输出内容如下:

cvModel: org.apache.spark.ml.tuning.CrossValidatorModel = cv_efc8cf15a3ab
predictions2: org.apache.spark.sql.DataFrame = [userId: int, movieId: int … 2 more fields]
evaluator2: org.apache.spark.ml.evaluation.RegressionEvaluator = regEval_4dd08e13c0e9
rmse2: Double = 0.9471342462991672

由以上输出内容可以看出,rmse2的值要低于rmse1,预测结果相比之前更加准确。文章来源地址https://www.toymoban.com/news/detail-479673.html

到了这里,关于基于Spark的电影推荐系统实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于springboot+vue协同过滤算法的电影推荐系统054

    大家好✌!我是CZ淡陌。一名专注以理论为基础实战为主的技术博主,将再这里为大家分享优质的实战项目,本人在Java毕业设计领域有多年的经验,陆续会更新更多优质的Java实战项目,希望你能有所收获,少走一些弯路,向着优秀程序员前行! 🍅更多优质项目👇🏻👇🏻可

    2024年02月07日
    浏览(32)
  • 基于协同过滤算法的电影推荐系统(亮点:智能推荐、协同过滤算法、在线支付、视频观看)

    💗 博主介绍 :✌全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战✌💗 👇🏻 精彩专栏 推荐订阅 👇🏻 2023-2024年最值得选的微信小程序毕业设

    2024年02月08日
    浏览(47)
  • 基于微信云开发实现电影推荐小程序

    项目名称为柚子电影,此小程序的目的是为了给大家推荐电影,与其他的售票等小程序不同。 我的影单的增加、删除和查询。电影详情页面的完整实现。对小程序的各个方面:电影推荐、电影详情、用户授权、影院查询、影院位置、用户登录、我的影单等方面都大体实现,实

    2024年02月07日
    浏览(28)
  • 基于知识图谱的电影推荐系统——Neo4j&Python

    选择TMDB电影数据集,Netflix Prize 数据集下载。 也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6 。 执行preproc.py文件,进行数据预处理,生成5个处理后的文件: 将上面数据预处理生成的5个文件,放入import文件夹中: 修改main.py中的driver,输入自己

    2024年02月15日
    浏览(36)
  • 计算机毕业设计springboot基于Hadoop平台的电影推荐系统541039【附源码+数据库+部署+LW】

    本项目包含程序+源码+数据库+LW+调试部署环境,文末可获取一份本项目的java源码和数据库参考。 系统的选题背景和意义 选题背景: 随着互联网的快速发展和大数据技术的成熟应用,电影推荐系统成为了电影行业中不可或缺的一部分。基于Hadoop平台的电影推荐系统应运而生,

    2024年02月06日
    浏览(46)
  • 基于Spark+django的国漫推荐系统--计算机毕业设计项目

    近年来,随着互联网的蓬勃发展,企事业单位对信息的管理提出了更高的要求。以传统的管理方式已无法满足现代人们的需求。为了迎合时代需求,优化管理效率,各种各样的管理系统应运而生,随着各行业的不断发展,基于Spark的国漫推荐系统的建设也逐渐进入了信息化的

    2024年02月11日
    浏览(32)
  • 【电影推荐系统】实时推荐

    技术方案: 日志采集服务:通过利用Flume-ng对业务平台中用户对于电影的一次评分行为进行采集,实时发送到Kafka集群。 消息缓冲服务:项目采用Kafka作为流式数据的缓存组件,接受来自Flume的数据采集请求。并将数据推送到项目的实时推荐系统部分。 实时推荐服务:项目采

    2024年02月14日
    浏览(21)
  • 基于python大数据的电影可视化分析及电影推荐

    随着信息技术和互联网技术的快速发展,利用数据采集技术实现用户感兴趣的数据收集分析成为很多互联网公司研究讨论的热门话题。通过对基于Python的大数据的电影可视化分析与电影推荐,采集进行电影热度动态变化的需求进行调查分析,发现作为研究电影热度波动变化的

    2023年04月23日
    浏览(37)
  • 机器学习30:《推荐系统-III》使用 TensorFlow 构建电影推荐系统

    本文将介绍基于 MovieLens 数据集创建一个电影推荐系统的方法。具体而言,包括探索电影数据,训练矩阵分解模型,检查嵌入,矩阵分解中的正则化,Softmax 模型训练等内容。 目录 1.准备工作 1.1 导入依赖模块 1.2 加载数据 1.3 探索电影镜头数据

    2024年02月16日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包