作者:Pulkit Sharma
翻译:申利彬
校对:付宇帅
本文约10300字,建议阅读10分钟。
本文介绍了各种推荐引擎算法以及使用Python构建它们的基本框架。
简介
当今社会的每个人都面临着各种各样的选择。例如,如果我漫无目的想找一本书读,那么关于我如何搜索就会出现很多可能。这样一来,我可能会浪费很多时间在网上浏览,并且在各种各样的网站上搜寻,希望能找到有价值的书籍。这个时候我可能寻找别人的推荐。
如果有一家网站或者手机应用可以基于我以前阅读的书籍向我推荐新的书籍,那对我肯定有很大的帮助。这时我会有如下愉快的体验,登录网站,就可以看到符合我兴趣的10本书籍,不用浪费时间在网站上搜寻。
这就是推荐引擎所做的事情,它们的力量现在正被大多数企业所使用。从亚马逊到Netflix,谷歌到谷歌阅读,推荐引擎是机器学习技术中最广泛的应用之一。
在本文中,将介绍各种推荐引擎算法以及使用Python构建它们的基本框架。我们还将讨论这些算法工作背后的数学原理,最后使用矩阵分解技术创建属于我们自己的推荐引擎。
目录
1 什么是推荐引擎?
2 推荐引擎是如何工作的?
2.1 数据收集
2.2 数据存储
2.3 数据过滤
2.31 基于内容过滤数据
2.32 协同过滤
3 基于MovieLens数据集的python实例学习
4 从0搭建协同过滤模型
5 使用Turicreate搭建简单流行的协同过滤模型
6 矩阵分解简介
7 使用矩阵分解构建一个推荐引擎
8 推荐引擎的评价指标
8.1 召回率
8.2 精确度
8.3 均方误差(RMSE)
8.4 MRR(Mean Reciprocal Rank)
8.5 MAP at k(Mean Average Precision at cutoff k K位置截止的平均精度均值)
8.6 NDCG(Normalized Discounted Cumulative Gain归一化累积折损增益)
9 还可以尝试什么?
尾注
1 什么是推荐引擎?
一直到现在,人们也会倾向于买朋友或者信任的人推荐商品。当对某个商品有任何疑问时,人们往往会采用这种方式。但是随着数字时代的到来,这个圈子已经扩展到包括使用某种推荐引擎的在线网站。
一个推荐引擎使用不同的算法过滤数据,并向用户推荐最相关的物品。它首先存储客户过去的行为数据,然后基于这些数据向客户推荐他们可能购买的物品。
如果一个全新的用户访问一个电子商务网站,网站没有该用户的任何历史数据。那么在这样的场景中,网站是如何向用户推荐产品呢?一种可能的方法是向客户推荐卖的最好的商品,也就是该商品需求量很大。还有另外一种可能的方法是向用户推荐可以给网站带来最大利润的商品。
如果我们可以根据用户的需要和兴趣向用户推荐一些商品,这可以对用户体验产生积极的影响,最后可以达到多次访问的效果。因此,现在的企业通过研究用户过去的行为数据来构建聪明和智能的推荐引擎。
目前我们对推荐引擎有了直观的认识,现在让我们来看看它们是如何工作的。
2 推荐引擎是如何工作的?
在深入探讨这个主题之前,我们首先考虑一下如何向用户推荐商品:
我们可以向一个用户推荐最受欢迎的商品
可以根据用户偏好(用户特征)把用户分为多个细分类别,然后基于他们属于的类别推荐商品。
上述两种方法都有缺点。在第一种方法中,对于每一个用户来说最受欢迎的商品都是相同的,所以用户看到的推荐也是相同的。在第二种方法中,随着用户数量的增加,用户特征也随着增加。因此将用户划分为多个类别将会是一件非常困难的任务。
这里的主要问题是我们无法为用户具体的兴趣定制推荐。这就像亚马逊建议你买一台笔记本电脑,仅仅是因为它被大多数购物者购买。但幸运的是,亚马逊(或其他大公司)并没有使用上述方法来推荐商品。他们使用一些个性化的方法来帮助他们更准确地推荐产品。
我们现在来看看推荐引擎是如何通过以下步骤来工作的。
2.1 数据收集
收集数据是构建推荐引擎的第一步也是最关键的一步。可以通过两种方式收集数据:显式和隐式。显示数据是用户有意提供的信息,比如电影排名,相反隐氏数据则不是用户主动提供,而是从数据流中收集得到的信息,例如搜索历史、点击率、历史订单等。
在上面的图片中,Netflix正在以用户对不同电影的评分形式明确地收集数据。
上图可以看到Amazon记录的用户历史订单,这是一个隐式数据收集模式的例子。
2.2 数据存储
数据量决定了模型的建议有多好,例如,在电影推荐系统中,用户对电影的评价越多,推荐给其他用户的效果就越好。数据类型对采用何种存储类型有很重要的影响,这种类型的存储可以包括一个标准的SQL数据库、NoSQL数据库或某种类型的对象存储。
2.3 数据过滤
在收集和存储数据之后,我们必须对其进行过滤,以便提取出最终推荐所需的相关信息。
有各种各样的算法可以帮助我们简化过滤过程。在下一节中,我们将详细介绍每种算法。
2.3.1 基于内容的过滤
这个算法推荐的产品类似于用户过去喜欢的产品。
图片来源:Medium
例如,如果一位用户喜欢《盗梦空间》这部电影,那么算法就会推荐属于同一类型的电影。但是,算法是如何理解选择和推荐电影的类型呢?
以Netflix为例:它们以向量形式保存与每个用户相关的所有信息。这个向量包含用户过去的行为,也就是用户喜欢/不喜欢的电影和他们给出的评分,这个向量也被称为轮廓向量(profile vector)。所有与电影相关的信息都存储在另一个叫做项目向量(item vector)中。项目向量包含每个电影的细节,如类型、演员、导演等。
基于内容的过滤算法找到了轮廓向量与项目向量夹角的余弦,也就是余弦相似度。假设A是轮廓矢量,B是项目矢量,那么它们之间的相似性可以按如下公式计算:
根据在-1到1之间的余弦值,可以将电影按降序排列,并且采用下面两种方法中的一种用于推荐:
选择前N部电影:推荐最相关的前N部电影(这里N可以由公司决定)。
等级量表的方法:设置一个阈值,并推荐所有超过该阈值的电影。
其它可以用来计算相似性的方法有:
欧几里得距离:如果在N维空间中绘制,相似的实体将会彼此靠近。因此,我们可以计算实体之间的距离根据这个距离,向用户推荐内容。下面是欧几里得距离公式:
皮尔逊相关性:它告诉我们两个实体的相关程度,越高的相关性,就越相似。皮尔逊的相关性可以用以下公式来计算:
这种算法有一个主要的缺点,也就是它仅限于推荐相同类型的实体。它永远不会推荐用户过去没有购买或喜欢的产品。因此,如果用户过去仅仅看或喜欢动作电影,系统也就只会推荐动作电影。很显然,这种搭建推荐引擎的方法泛化性能很差。
我们要找到一种算法可以改进这种类型的推荐系统,它不仅可以根据内容进行推荐,还要可以利用用户的行为信息。
2.3.2 协同过滤
我们通过一个例子来理解这个方法。如果用户A喜欢3部电影,比如《星际穿越》,《盗梦空间》和《前目的地》,而用户B喜欢《盗梦空间》、《前目的地》和《致命魔术》,那么他们就有差不多的兴趣爱好。我们可以肯定地说,A应该喜欢《致命魔术》,B应该喜欢《星际穿越》。协同过滤算法使用“用户行为”来推荐电影。这是工业中最常用的算法之一,因为它不依赖于任何额外的信息。协同过滤技术有很多种不同的类型,我们将在下面详细讨论这些问题。
用户与用户间的协同过滤
该算法首先发现用户之间的相似性分数,基于这个相似性的分数,它会挑选出最相似的用户,并推荐这些类似的用户以前喜欢或购买的产品。
图片来源:Medium
就我们之前的电影例子而言,这个算法根据他们之前给不同电影的评分来发现每个用户之间的相似性。用户u的一个实体的预测是通过计算其它用户对一个实体i的用户评分的加权总和来计算的。Pu,i通过下式计算得到:
公式符号含义如下:
Pu,I 是一个实体的预测
Rv,I 是用户v对电影i的评分
Su,v 使用户之间的相似性分数