《Python数据分析与机器学习实战-唐宇迪》读书笔记第13章--推荐系统
第13章推荐系统
大数据与人工智能时代,互联网产品发展迅速,竞争也越来越激烈,而推荐系统在其中发挥了决定性的作用。例如,某人观看抖音的时候,特别喜欢看篮球和游戏的短视频,只要打开APP,就都是熟悉的旋律,系统会推荐各种精彩的篮球和游戏集锦,根本不用自己动手搜索。广告与新闻等产品也是如此,都会抓住用户的喜好,对症下药才能将收益最大化,这都归功于推荐系统,本章向大家介绍推荐系统中的常用算法。
13.1推荐系统的应用
在大数据时代,每分钟都在发生各种各样的事情,其对应的结果也都通过数据保存下来,如何将数据转换成价值,就是推荐系统要探索的目标(见图13-1)。
图13-1 互联网数据量
推荐系统在生活中随处可见,购物、休闲、娱乐等APP更是必不可缺的法宝,在双十一购物时,估计大家都发现了,只要是搜索过或者浏览过类似商品,都会再次出现在各种广告位上。
你可能喜欢的电影,你可能喜欢的音乐,你可能喜欢的……这些大家再熟悉不过,系统都会根据用户的点击、浏览、购买记录进行个性化推荐,如图13-2所示。图13-2(b)是用笔者的京东账号登录时的专属排行榜,全是啤酒,因为之前搜索过几次啤酒关键词却没有买,系统自然会认为正在犹豫买不买呢。
图13-2 推荐系统场景
图13-3是亚马逊、京东、今日头条3个平台的推荐系统的数据,几个关键指标都显示了其价值所在,那么怎么进行推荐呢?首先要有各项数据,才能做这件事。例如,你在抖音中观看某些视频的停留时间较长,账号上就会打上一些标签。例如,笔者喜欢看篮球和打游戏,那么标签可能就是篮球、王者荣耀、游戏迷……这些标签仅仅为了优化用户体验吗?自己使用较多的APP推荐的广告是否都是常关注的领域呢?
图13-3 推荐系统的价值
当大家使用产品时,无形之中早已被打上各种标签,这就是用户画像,并不需要知道你的模样,只要知道你的爱好,投其所好能够吸引大家就足够了(见图13-4)。
图13-4 用户画像
13.2协同过滤算法
如果大家想邀请朋友去看一场电影,你的首选对象是谁?应该是自己的好朋友吧,因为你们有共同的爱好。现在有几部电影同时上映,实在拿不定主意选哪一部,该怎么办呢?这时可能会有两种方案。
- 1.问问各自的好朋友,因为彼此的品位差不多,朋友喜欢的电影,大概也符合你的口位。
- 2.回忆一下看过的喜欢的电影,看看正在上映的这些电影中,哪部与之前看过的类似。
问题是如何让计算机确定哪个朋友跟你的喜好相同呢?如何确定哪一部新的电影与你之前看过的类似呢?这些任务可以通过协同过滤来完成,也就是通过用户和商品的画像数据进行相似度计算(见图13-5)。
图13-5 相似计算
协同过滤看起来复杂,做起事来还是很简单的,在推荐系统中主要有两种方案。
- 1.基于用户的协同过滤:找最相似的朋友,看看他们喜欢什么。
- 2.基于商品的协同过滤:找看过的商品,看看哪些比较类似。
13.2.1基于用户的协同过滤
首先来看一下基于用户的协同过滤,假设有5组用户数据,还有用户对两种商品的评分,通过不同的评分,计算哪些用户的品位比较相似。
最直接的方法是,把用户和评分数据展示在二维平面上,如图13-6所示。很明显,用户A、C、D应该是一类人,他们对商品1都不太满意,而对商品2比较满意。用户E和B是另外一类,他们的喜好与用户A、C、D正好相反。
只要有数据,计算相似度的方法比较多,下面列出几种常见的相似度计算方法:
图13-6 用户相似度
- 欧几里得距离(Euclidean Distance)
- 皮尔逊相关系数(Pearson Correlation Coefficient)
- 余弦相似度(Cosine Similarity)
- 协方差
相似度的计算方法还有很多,对于不同任务,大家都可以参考使用,其中欧几里得距离早已家喻户晓,基本所有涉及距离计算的算法中都会看到它的影子。皮尔逊相关系数也是一种常见的衡量指标,即用协方差除以两个变量的标准差得到的结果,其结果的取值范围在[−1,+1]之间。图13-7展示了不同分布的数据所对应的皮尔逊相关系数结果。
由图可见,当两项指标非常相似的时候,其值为+1,例如学习时长和学习成绩的关系,学习时间越长,学习成绩越好。当两项指标完全颠倒过来的时候,其值为−1,例如游戏时长和学习成绩的关系,游戏时间越长,学习成绩越差。当两项指标之间没有关系的时候,其值就会接近于0,例如身高和学习成绩,它们之间并没有直接关系。
在基于用户的推荐中,一旦通过相似度计算找到那些最相近的用户,就可以看看他们的喜好是什么,如果在已经购买的商品中,还有一件商品是待推荐用户还没有购买的,把这件商品推荐给用户即可。
假设系统向用户A推荐一款商品,通过历史数据得知,其已经购买商品A和C,还没有购买商品B和D,此时系统会认为接下来他可能要在商品B和D中选一个。那给他推荐商品B还是商品D呢?按照协同过滤的想法,首先要找到和他最相似的用户,通过对比发现,用户A和用户C的购买情况十分类似,都购买了商品A和C,此时可以认为用户C和用户A的品位相似,而用户C已经购买了商品D,所以最终给用户A推荐了商品D,这就是最简单的基于用户的协同过滤(见图13-8)。
图13-7 相关系数
图13-8 基于用户的协同过滤
基于用户的协同过滤做起来虽然很简单,但是也会遇到以下问题。
- 1.对于新用户,很难计算其与其他用户的相似度。这也是经常讨论的用户冷启动问题,最简单的办法就是用排行榜来替代推荐。
- 2.当用户群体非常庞大的时候,计算量就非常大。
- 3.最不可控的因素是人的喜好是变化的,每一个时间段的需求和喜好可能都不相同,并且购买很大程度上都是冲动行为,这些都会影响推荐的结果。
综上所述,基于用户的协同过滤并不常见,一般用在用户较少而商品较多的情况下,但是中国市场恰恰相反,用户群体十分庞大,商品类别相对更少。
13.2.2基于商品的协同过滤
基于商品的协同过滤在原理上和基于用户的基本一致,只不过变成要计算商品之间的相似度。
假设购买商品A的用户大概率都会购买商品C,那么商品A和C可能就是一套搭配的产品,例如相同牌子不同口味的冰淇淋,或者是啤酒和尿布的故事……接下来如果用户C购买了商品A,肯定要向他推荐商品C了(见图13-9)。
图13-9 基于商品的协同过滤
再来看一个实际的例子,如图13-10所示,有12个用户,6部电影,可以把它们当作一个矩阵,其中的数值表示用户对电影的评分。空着的地方表示用户还没有看过这些电影,其实做推荐就是要估算出这些空值都可能是什么,如果某一处得到较高的值,意味着用户很可能对这个电影感兴趣,那就给他推荐这个电影。
图13-10 基于商品的协同过滤
此时任务已经下达,要对5号用户进行推荐,也就是要分别计算该用户对所有未看过电影的可能评分,以其中一部电影的计算方法为例,其他位置的计算方法相同。例如想求5号用户对1号电影的喜好程度,假设已经通过某种相似度计算方法得到1号电影和其他电影的相似度(例如通过比对电影类型、主演、上映时间等信息),由于5号用户之前看过3号电影和6号电影(相似度为负分的暂时不考虑),所以需要分别考虑这两部电影和1号电影的相似度,计算方法如图13-11所示。
图13-11 推荐指数计算
这里可以把相似度看作权重项,相似度越高,起到的作用越大,最后再进行归一化处理即可。最终求得5号用户对1号电影的评分值为2.6,看来他可能不喜欢1号电影。
关于相似度的计算和最终结果的估计,还需具体问题具体分析,因为不同数据所需计算方式的差别还是很大。与基于用户的协同过滤相比,基于商品的协同过滤最大的优势就是用户的数量可能远大于商品的数量,计算起来更容易;而且商品的属性基本都是固定的,并不会因为人的情感而发生变化,就像鼠标怎么也变不成键盘。在非常庞大的用户-商品矩阵中,计算推荐涉及的计算量十分庞大,由于商品标签相对固定,可以不用像基于用户的那样频繁更新。
13.3隐语义模型
协同过滤方法虽然简单,但是其最大的问题就是计算的复杂度,如果用户-商品矩阵十分庞大,这个计算量可能是难以忍受的,而实际情况也是如此,基本需要做推荐的产品都面临庞大的用户群体。如何解决计算问题,就是接下来的主要目标,使用隐语义模型的思想可以在一定程度上巧妙地解决这些庞大的计算问题。
13.3.1矩阵分解思想
真实数据集中,用户和商品数据会构成一个非常稀疏的矩阵,假设在数以万计的商品中,一个用户可能购买的商品只有几种,那么其他商品位置上的数值自然就为0(见图13-12)。
图13-12 稀疏矩阵
稀疏矩阵的问题在于考虑的是每一个用户和每一个商品之间的联系,那么,能否换一种思路呢?假设有10万个用户和10万个商品,先不考虑它们之间直接的联系,而是引进“中介”,每个“中介”可以服务1000个商品和1000个用户,那么,只需要100个“中介”就可以完成任务。此时就将原始的用户-商品问题转换成用户-中介和中介-商品问题,也就是把原本的一个庞大的矩阵转换成两个小矩阵。
矩阵分解的目的就是希望其规模能够缩减,更方便计算,现阶段推荐系统基本都是基于矩阵分解实现的。
这里可以简单来计算一下,按照之前的假设,用户-商品数据集矩阵为105×105=1×1010,非常吓人的一个数字。加入中介之后,用户-中介矩阵为105×1000,中介-商品矩阵为1000×105,分别为1×107,在数值上差了几个数量级。
图13-13是矩阵分解的示意图,也就是通过引入一个“中介”来转换原始问题,目的就是为了降低计算复杂度,这里可以把用户数n和商品数m都当作非常庞大的数值,而“中介”k却是一个相对较小的值。
图13-13 矩阵分解
通常把“中介”k定义为隐含因子,隐含因子把数据进行了间接的组合,小小的改变却解决了实际中的大问题。在推荐系统中,普遍使用矩阵分解的方法进行简化计算,其中最常用的手段就是SVD矩阵分解,在下一章的实战中,你就会见到它的影子。
13.3.2隐语义模型求解
如何求解隐语义模型呢?其实在推荐系统中,想得到的结果就是稀疏矩阵中那些为0的值可能是什么,也就是想看一下用户没有买哪些商品。首先计算出其购买各种商品的可能性大小,然后依照规则选出最有潜力的商品即可。
其中的难点在于如何构建合适的隐含因子来帮助化简矩阵,如图13-14所示,F是要求解的隐含因子,只需要把它和用户与商品各自的联系弄清楚即可。
图13-14 隐含因子
R矩阵可以分解成P矩阵和Q矩阵的乘积,如图13-15所示。此时只需分别求解出P和Q,自然就可以还原回R矩阵:
图13-15 隐含因子求解
这里还需要考虑显性和隐性反馈的问题,也就是数据集决定了接下来该怎么解决问题,先来看一下显性和隐性的区别(见表13-1)。
表13-1 显性与隐性反馈
常见的带有评分的数据集属于显性反馈,只有行为没有具体评估指标的就是隐形反馈。并不是所有数据集都是理想的,有时需要自己定义一下负样本。通常情况下,对于一个用户,没有购买行为的商品就是负样本,关于负样本的选择方法还有很多,可以根据实际情况来定义。在商品集K(u,i)中,如果(u,i)是正样本,则rui=1;如果(u,i)是负样本,则rui=0。
按照机器学习的思想,可以把隐含因子当作要求解的参数,依旧还是这个老问题,什么样的参数能够更符合实际的数据,先指定一个目标函数:
看起来与回归中的最小二乘法有点类似,计算由隐含因子还原回来的矩阵与原始矩阵的差异程度,并且加入正则化惩罚项。
按照之前回归中的求解思路,此时可以利用梯度下降进行迭代优化,首先计算梯度方向:
接下来按照给定方向,选择合适的学习率进行更新即可:
在建模过程中,需要考虑以下参数。
- 1.隐含因子的个数或者当作隐分类的个数,需要给定一个合适的值。
- 2.学习率α一直都是机器学习中最难搞定的。
- 3.既然有正则化惩罚项,肯定会对结果产生影响。
- 4.正负样本的比例也会有影响,对于每一个用户,尽量保持正负样本比例持平。
隐语义模型在一定程度上降低了计算的复杂度,使得有些根本没办法实现的矩阵计算变成可能。在协同过滤中,每一步操作都具有实际的意义,很清晰地表示在做什么,但是隐语义模型却很难进行解释,它与PCA降维得到的结果类似,依旧很难知道隐含因子代表什么,不过没关系,通常只关注最后的结果,中间过程究竟做什么,计算机自己知道就好。
13.3.3评估方法
当建模完成之后,肯定要进行评估,在推荐系统中,可以评估的指标有很多,其中常用的均方根误差(Root Mean Squared Error,RMSE)和均方误差(Mean Square Error,MSE)分别定义为:
在评估方法中,不只有这些传统的计算方式,还需要根据实际业务进行评估,例如覆盖率、多样性。这些指标能够保证系统推荐的商品不至于总是那些常见的。
假设系统的用户集合为U,商品列表为I,推荐系统给每个用户推荐一个长度为N的商品列表R(u),根据推荐出来的商品占总商品集合的比例计算其覆盖率:
多样性描述了推荐列表中物品两两之间的不相似性。假设那么用户u的推荐列表R(u)的多样性定义如下:
定义了物品i和j之间的相似度,
推荐系统的整体多样性可以定义为所有用户推荐列表多样性的平均值:
这里给大家简单介绍了几种常见的评估方法,在实际应用中,需要考虑问题的角度还有很多,例如新颖性、惊喜度、信任度等,这些都需要在实际问题中酌情考虑。
本章小结:本章介绍了推荐系统中常用的两种方法:协同过滤与隐语义模型。相对而言,协同过滤方法更简单,但是,一旦数据量较大就比较难以处理,隐语义模型和矩阵分解方法都是现阶段比较常用的套路。下一章将带大家实际感受一下推荐系统的魅力。
第13章完。推荐实战:《Python数据分析与机器学习实战-唐宇迪》读书笔记第14章--音乐推荐系统实战
该书资源下载,请至异步社区:https://www.epubit.com