我的基于Spark的电影推荐(机器学习实训)

基于Spark的电影推荐

一、实训背景

近几年互联网信息量呈几何级增长,用户很容易迷失在海量信息中。虽然可使用层次分类(分类目录)或搜索引擎等方法解决这类信息过载问题,但是层次分类需要手工对信息进行分类,并且随着数据量增加层级逐渐增多,不便于用户浏览;而搜索引擎需要用户自己输入关键词,自行选择结果,这要求用户已明确知道要查找的内容,并且具有核心词的抽象能力,如果对结果不满意需要调整关键词重新搜索。推荐系统根据用户的浏览记录、社交网络等信息进行个性化的计算,发现用户的兴趣,并应用推荐算法最终达到“千人千面”“个性化”推荐的效果。

二、实训内容

使用Spark的机器学习算法实现库MLlib,以及将其应用在MovieLens数据集上实现个性化电影推荐。

三、关键技术

  • 基于协同过滤的推荐算法原理
  • 最小二乘法(ALS)原理
  • pyspark推荐算法模型训练

四、实训目的

  • 了解推荐系统的应用场景
  • 熟悉协同过滤推荐算法原理
  • 掌握pyspark中使用最小二乘法(ALS)来实现协同过滤推荐模型。

五、实训环境

  • 操作系统:ubuntu16
  • 工具软件:jupyter notebook、Python 3.6.13
  • 硬件环境:无特殊要求
  • 核心库:
    • pyspark 3.0.1

六、实训原理

1 推荐系统的应用场景

  • 电商平台

    目前推荐系统已经基本成为电商平台标配。主流的电商平台具有多种推荐形式,例如“猜你喜欢”“购买此商品的用户也购买了……”等;除 此之外,还有隐式商品推荐,例如在搜索结果中将推荐商品排名提前。

  • 个性化视频网站

    每年国内外都有大量电影上映,由用户自制的视频节目也越来越多,用户很难在海量的视频节目中进行选择。视频网站基于用户的历史观看记录以及视频内容之间的内在联系,分析用户潜在兴趣,向用户推荐其感兴趣的内容。

  • 音乐歌单

    目前音频类个性化推荐主要是向用户推荐歌曲或播单,好的推荐会让用户既熟悉又有新鲜和惊喜的感觉。主流音乐平台音乐推荐的实现方法与电影推荐类似,主要基于音乐的风格、用户收听历史、用户收听行为等进行协同过滤。

  • 社交网络

    推荐系统在社交网络中的应用主要是好友推荐和内容推荐。好友推荐是指在社交网站中向用户推荐具有共同兴趣的用户成为好友。用户之间可通过关系网络建立联系,还可以通过阅读、点赞、评论了相同的博文产生关系。如果两个用户有多个共同的标签,曾经评论或者转发相同的信息,说明他们对这条信息有着共同的兴趣。对这些用户行为应用基于用户的协同过滤算法,就可以向用户进行个性化内容推荐。在社交网站中用户之间形成一个社交网络图,可以分析用户之间兴趣的相似性,例如,用于学术社区中同行的发现,对那些研究领域相同,但在网站中并非好友的用户,推荐他们互加好友。

  • 新闻网站

    新闻网站中应用推荐算法可以方便用户及时获取个性化信息,减少用户浏览、检索新闻的时间,并提供更好的阅读体验,从而增加用户黏性。一般采用基于内容的协同过滤推荐算法来实现,其中数据包括用户属性特征、浏览历史和新闻内容等,从而解决新闻量过大时给用户带来的信息过载和迷航问题。在新闻网站中常有“冷启动”的问题。它是指网站刚刚建立,用户和 新闻内容较少,用户的行为数据更少,所以协同过滤算法往往无效。为缓解此问题,可以使用热门内容作为推荐结果,逐渐收集用户行为数据,不断完善推荐结果,吸引更多用户注册,从而形成良性循环。

  • 个性化阅读

    个性化阅读是为每一位用户定制其感兴趣的个性化内容,例如新闻、论坛帖子、小说等。推荐系统通过推荐算法获得用户兴趣,并向其推送个性化的阅读内容,从而提供更优的阅读方式和更好的阅读体验。

  • 个性化广告

    个性化广告是指有针对性地向特定用户展示特定广告内容。首先对广告受众进行用户画像,对受众的个人状况、商业兴趣、社交图谱等方面进行刻画,这是广告推荐引擎的基础。然后推荐系统基于用户的行为进行协同过滤,并对推荐的广告结果进行粗选、精选。上述过程可以通过定时运行的方式离线生成推荐结果;也可以实时生成推荐结果,这对推荐算法和硬件计算均要求较高。在用户浏览广告过程中可看出用户对广告的态度或反应,这可作为推荐结果的评价依据,并用于改进推荐算法,减少用户对广告的负面体验。

2 Spark介绍

Spark是一个开源的并行计算与分布式计算框架,最大特点是基于 内存计算,适合迭代计算,兼容Hadoop生态系统中的组件,同时包括相 关的测试和数据生成器。其设计目的是全栈式解决批处理、结构化数据查询、流计算、图计算和机器学习等应用,适用于需要多次操作特定数据集的应用场合。需要反复操作的次数越多,所需读取的数据量越大,效率提升越大,在这方面比Hadoop快很多倍。Spark集成了以下模块, 为不同应用领域的从业者提供了快速的大数据处理方式。

  • Spark SQL:分布式SQL查询引擎,提供了一个DataFrame编程抽 象。

  • Spark Streaming:把流式计算分解成一系列短小的批处理计算,并 提供高可靠和吞吐量服务。

  • MLlib:Spark对常用的机器学习算法的实现库,支持4种常见的机 器学习问题:分类、回归、聚类和协同过滤。

  • GraphX:提供图计算服务。

  • SparkR:支持R语言的库。

  • 扩展库pyspark:提供了SparkContext作为主要入口,还有弹性分布式数据集(Resilient Distributed Dataset,RDD)、文件访问类(SparkFiles)等可以公开访问的类,并且提供了pyspark.sql、pyspark.streaming与pyspark.mllib等模块与包。

3 基于协同过滤的推荐算法介绍

基于用户人口属性和行为数据设计的推荐算法,称为协同过滤算法。此方法主要根据用户的历史行为,寻找用户或物品的近邻集合,以此计算用户对物品的偏好,包括基于领域、图、关联规则、知识的推荐算法,其中最广泛应用的是基于领域的方法,在实践中往往是上述几种方法的混合应用。

基于领域的推荐算法分类:
基于领域的推荐算法主要包含两种:基于用户的协同过滤算法
(UserCF)和基于物品的协同过滤算法(ItemCF)。基于用户的协同过滤计算用户兴趣相似度,基于物品的协同过滤算法计算与用户偏好的物品相似的物品。本实验电影推荐使用的是基于用户的协同过滤算法。

基于用户的协同过滤算法:
基于用户的协同过滤算法为用户推荐兴趣相似的其他用户喜欢的物品。算法的关键是计算两个用户的兴趣相似度。计算用户相似度的常用方法有余弦相似性、皮尔森系数相关和修正的余弦相似性。

算法步骤如下:

① 找到与目标用户兴趣相似的用户集合;

② 找到这个集合中的用户喜欢的,且目标用户没有用过的物品, 推荐给目标用户。

4 基于用户的协同过滤推荐示例

用户/物品 物品A 物品B 物品C 物品D
用户A 推荐
用户B
用户C

该表是基于用户的协同过滤推荐示例,可以看到用户A与用户C 所喜欢的物品具有较多的交集,即两个用户具有相似性,那么用户C喜 欢的物品很有可能用户A也会喜欢,而用户C喜欢物品D,则可以向用户 A推荐物品D。

计算用户兴趣相似度时,要避免热门物品自带马太效应的影响,即大部分用户可能都对热门的物品表现出喜欢的状况,但是这些用户之间并非一类人,因为所谓的热门物品区分度较弱。

基于用户的协同过滤算法的缺点是随着用户数目增大,计算用户兴趣相似度越来越复杂,时间和空间复杂度与用户数接近于平方关系。所以一般采用离线方式进行推荐,即当用户产生新的行为时,不会立即进行计算,所以推荐结果并不会马上发生变化。此外,这一算法是基于隐式群体的兴趣进行推荐,可解释性不强。这一算法适用于用户兴趣比较稳定的场景,即通过群体的兴趣来代表用户个体的兴趣,一旦群体的兴趣确立,就可以认为个体用户服从此兴趣,由此向其进行推荐,结果一般较准确。

5 模型训练(ALS算法)

在pyspark中使用交替最小二乘法(Alternating Least Squares, ALS)来实现协同过滤推荐,主要原因是它支持稀疏的输入数据(用户 对物品的评分是稀疏矩阵),并且可用简单的线性代数运算求解最优解,此外,输入数据本身可以并行化,这就使ALS在大规模数据上速度 非常快。

ALS中文名作交替最小二乘法,在机器学习中,ALS特指使用最小二乘法求解的一个协同过滤算法,是协同过滤中的一种。ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中,使用起来比较方便。从协同过滤的分类来说,ALS算法属于User-Item CF,也叫做混合CF,因为它同时考虑了User和Item两个方面,即可基于用户进行推荐又可基于物品进行推荐。

一般而言用户只会购买物品集中的极少数部分产品,并对其进行打分。考虑下面这样一个包含用户的打分矩阵(列为用户u1-u6,行为物品I1-I8),我们可以看到这个用户的评分矩阵是十分稀疏的,有很多用户的购买的记录是空的,而且在现实业务中,用户的评分矩阵会更加的稀疏。如何通过这样一个稀疏矩阵,对用户进行协同推荐用户可能很喜欢的物品对于推荐系统而言是一种很大的考验。

用户评分矩阵

l1 l2 l3 l4 l5 l6 l7 l8
u1 5 2
u2 4 3 1
u3 1 5
u4 7 2
u5 7 1 1
u6 5 4 2

解决稀疏矩阵问题,需要采用矩阵分解,如下面两个图:
将原本矩阵A(m * n) 分解成X(m * rank) 矩阵与Y(rank * n) 矩阵,而且A大约等于 X * Y

在这里插入图片描述

在spark MLlib 机器学习库中目前推荐模型只包含基于矩阵分解(matrix factorization)的实现。具体的分解思路,找出两个低维的矩阵,使得它们的乘积是原始矩阵。因此这也是一种降维技术。假设我们的用户和物品分别是m和n,那对应的“用户-物品”矩阵A,类似图所示:

在这里插入图片描述
找到和“用户-物品“矩阵近似的k维(低阶)矩阵,最终还是要求出如下两个矩阵:一个用于表示用户X维矩阵,以及一个表征物品的Y维矩阵。这两个矩阵也称为因子矩阵,他们的矩阵乘积便是原始评级数据的一个近似值。值得注意的是,原始评级矩阵通常很稀疏,但因子矩阵却是稠密的,如图所示:

在这里插入图片描述
ALS是求解矩阵分解问题的一种最优化方法,它功能强大,效果理想而且被证明相对容易实现。这使得它很适合如Spark这样的平台。

ALS的实现原理是迭代式求解一系列最小二乘回归问题。在每次迭代时,固定用户因子矩阵或者是物品因子矩阵中的一个,然后用固定的这个矩阵以及评级数据来更新另一个矩阵。之后,被更新的矩阵被固定住,再更新另外一个矩阵。如此迭代,知道模型收敛(或者是迭代了预设好的次数)。

6 电影数据集

实验采用MovieLens数据集作为数据源,它是一个关于电影评分的 数据集。包括links.csv、movies.csv、ratings.csv、tags.csv几个文件。
link.csv文件的内容是电影编号,通过编号可以在网站上找到对应的电影链接;

  • movies.csv文件中包含电影编号、标题、电影题材;
  • ratings.csv文件是用户对电影的评分和评分时间戳,其中评分是5分制,按半星的 规模递增;
  • tags.csv文件包含用户对电影的标签化评价和打标签时间戳;上述数据的编号、时间戳等均为数字型
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值