Building a Recommendation
Engine with Spark
Now that you have learned the basics of data processing and feature extraction, we will move on to explore individual machine learning models in detail, starting with recommendation engines.
Recommendation engines are probably among the best types of machine learning model known to the general public. Even if people do not know exactly what a recommendation engine is, they have most likely experienced one through the use of popular websites such as Amazon, Netflix, YouTube, Twitter, LinkedIn, and Facebook. Recommendations are a core part of all these businesses, and in some cases, they drive significant percentages of their revenue.
The idea behind recommendation engines is to predict what people might like and to uncover relationships between items to aid in the discovery process (in this way, it is similar and, in fact, often complementary to search engines, which also play a role in discovery). However, unlike search engines, recommendation engines try to present people with relevant content that they did not necessarily search for or that they might not even have heard of.
Typically, a recommendation engine tries to model the connections between users and some type of item. In our MovieStream scenario from Chapter 2, Designing a Machine Learning System, for example, we could use a recommendation engine to show our users movies that they might enjoy. If we can do this well, we could keep our users engaged using our service, which is good for both our users and us. Similarly, if we can do a good job of showing our users movies related to a given movie, we could aid in discovery and navigation on our site, again improving our users experience, engagement, and the relevance of our content to them.
However, recommendation engines are not limited to movies, books, or products. The techniques we will explore in this chapter can be applied to just about any userto-item relationship as well as user-to-user connections, such as those found on social networks, allowing us to make recommendations such as people you may know or who to follow.
Recommendation engines are most effective in two general scenarios (which are not mutually exclusive). They are explained here:
- Large number of available options for users: When there are a very large number of available items, it becomes increasingly difficult for the user to find something they want. Searching can help when the user knows what they are looking for, but often, the right item might be something previously unknown to them. In this case, being recommended relevant items, that the user may not already know about, can help them discover new items.
- A significant degree of personal taste involved: When personal taste plays a large role in selection, recommendation models, which often utilize a wisdom of the crowd approach, can be helpful in discovering items based on the behavior of others that have similar taste profiles.
In this chapter, we will:
- Introduce the various types of recommendation engines
- Build a recommendation model using data about user preferences
- Use the trained model to compute recommendations for a given user as well compute similar items for a given item (that is, related items)
- Apply standard evaluation metrics to the model that we created to measure how well it performs in terms of predictive capability
Types of recommendation models
Recommender systems are widely studied, and there are many approaches used, but there are two that are probably most prevalent: content-based filtering and collaborative filtering. Recently, other approaches such as ranking models have also gained in popularity. In practice, many approaches are hybrids, incorporating elements of many different methods into a model or combination of models.
[ 84 ]
Content-based filtering
Content-based methods try to use the content or attributes of an item, together with some notion of similarity between two pieces of content, to generate items similar to a given item. These attributes are often textual content (such as titles, names, tags, and other metadata attached to an item), or in the case of media, they could include other features of the item, such as attributes extracted from audio and video content.
In a similar manner, user recommendations can be generated based on attributes of users or user profiles, which are then matched to item attributes using the same measure of similarity. For example, a user can be represented by the combined attributes of the items they have interacted with. This becomes their user profile, which is then compared to item attributes to find items that match the user profile.
Collaborative filtering
Collaborative filtering is a form of wisdom of the crowd approach where the set of preferences of many users with respect to items is used to generate estimated preferences of users for items with which they have not yet interacted. The idea behind this is the notion of similarity.
In a user-based approach, if two users have exhibited similar preferences (that is, patterns of interacting with the same items in broadly the same way), then we would assume that they are similar to each other in terms of taste. To generate recommendations for unknown items for a given user, we can use the known preferences of other users that exhibit similar behavior. We can do this by selecting a set of similar users and computing some form of combined score based on the items they have shown a preference for. The overall logic is that if others have tastes similar to a set of items, these items would tend to be good candidates for recommendation.
We can also take an item-based approach that computes some measure of similarity between items. This is usually b
剩余内容已隐藏,支付完成后下载完整资料
第4章
使用spark建立一个推荐系统引擎
至此读者已经了解了数据处理和特征提取的基本理论,我们将调整方向,并且更加具体去研究一些独立的机器学习模型,我们将从推荐系统引擎开始。
推荐系统引擎可能是众多机器学习模型中最为大众所熟知的一个。即使人们不知道一个推荐系统引擎究竟是怎样的,他们也在使用热门网站的过程中有所经历,例如Amazon、Netflix、YouTube、Twitter、LinkedIn和Facebook等等。推荐工作是这些网站经营的核心,在某些情况下,推荐工作给这些公司带来了比重很高的利润。
推荐引擎要做的就是去预测人们可能喜欢什么并且揭示属性或者特征之间的关系,从而在探索过程中起到帮助的作用(这种方式与搜索引擎类似,事实上,是对搜索引擎的一种补充,它在探索过程中起到了关键作用)。然而,与搜索引擎不同的是,推荐引擎试图向人们展示属性的相关性,这些属性在他们看来是没有必要去搜索的,甚至他们从未听说过。
具体来说,一个推荐引擎试图建立用户和不同属性之间的关系模型。在第二章,设计一个机器学习系统中,我们遇到过电影视频流的场景,因此,我们可以使用一个推荐引擎去向用户展示他们可能喜欢的电影。一旦我们将这项工作做好,我们就能够让客户一直使用我们的服务,这对用户和我们都是大有裨益的。与之类似的,如果我们能够向用户展示一些风格类似的电影,我们就能让大众更加容易发现我们的网站,从而进一步提升用户的使用与体验,同时提升我们与用户的关系。
然而,推荐引擎并不是只限于电影,书本和产品。我们在这一章学习的技术可以运用于任何用户-属性关系和用户之间的联系。例如在社会关系网中,我们向他人推荐我们所认识的人。
推荐引擎在以下两种情形(不排除特使情况)中最为适用。具体如下所示:
- 当用户面对许多选项的时候:当面前有大量的选项时,对于用户来说找到他们所需要的东西是非常困难的。搜索可以帮助用户知道他们想寻找什么,但是大多数情况下,合适的选项可能是用户以前所不知道的东西。在这种情况下,给用户推荐相关东西,并且用户对这些并不熟悉,就可以帮助他们发现新的事务。
- 当个人喜好有极大的影响力的时候:当个人喜好在选择中起到关键作用时,利用各种算法的推荐系统就可以在探索过程中起到很大帮助,因为我们可以从其他具有相同喜好特征的用户身上得到答案。
在这一章,我们将:
- 介绍几种不同类型的推荐引擎
- 使用用户喜好相关的数据建立一个推荐引擎
- 使用训练模型向给定的用户进行推荐,同时在相关的属性中根据一个给定的属性搜索出其他相似的属性
- 使用标准评价指标检验我们创造的模型,从而就预测能力判定模型的使用效果
推荐模型的种类
推荐系统被广泛研究,过程中使用的方法丰富,其中有两种方法最为流行:内容过滤和协同过滤。最近,其他的研究方式如等级模型也受到了广泛的欢迎。在实践中,很多方法是混合使用的,合并了不同模式的元素形成最终模型或者联合几种不同的模型。
内容过滤
内容过滤模式试图使用事物的内容或者属性以及两种内容的相似性,从所给定事物出发生成与之相似的事物。这些属性通常是文本方面的(如标题、名称、标签以及事物所具有的其他元属性),或者在就多媒体而言,属性包括事物的其他特征,如从音频或者视频中提取的特征。
从相似性上面来说,用户推荐能够基于用户或者用户原型生成,使用同一种相似性标准匹配用户和事物。例如,一个用户可以被一组与他有关联的事物属性所代替。这一组属性就是用户原型,利用属性就能够找出与用户匹配的事物。
协同过滤
协同过滤是一种利用人群方法的推荐系统生成方式。众多用户对于相应事物的喜好被用于评估预测用户对他们未接触事物的喜好程度。这种方案的背后就是相似的概念。
在一种基于用户的方法之中,一旦两个用户展现出相似的喜好(就是说,他们处理相同事物的方式大体上是相同的),我们就能够假设他们的喜好是相似的。为了能够向一位给定用户推荐他从未接触过的事物,我们可以利用与这位客户具有相似喜好的用户的偏好。通过选出一组相似的用户,并且基于他们展现出的喜好计算出关联程度,我们就能够做到这一点。总而言之,如果其他用户和特定的一组用户对某些事物有相似的喜好,这些事物就是推荐过程中最好的候选者。
我们还可以使用一种基于事物的方法计算出事物之间的相似程度。这种方式的基础通常是已知的用户对事物的喜好程度。在这种方式下,相似的用户喜好的事物会被归为一类。一旦我们有了这些相似性的数据,我们就能够使用用户接触过的事物来代表用户,然后找出与已知事物相似的事物,最终将事物推荐给用户。同时,一组与已知事物相似的事物可以用于对未知事物进行相似程度的分析。
正式由于评估标准是根据最相似的用户和事物计算的(就是他们的邻居),这种基于用户和事物的方式通常被称为最邻近模型。
最后,有很多基于模型的方法试图自身模拟用户事物的喜好,从而通过未知的用户事物关系直接评估未知的喜好程度。
矩阵分解
由于spark的推荐模型目前仅包括矩阵分解的实现,我们将把注意力放在这一类模型上。这么做是很有依据的;然而,这些类型的模型在协同过滤中的效果一直很不错,它们也是众多竞争中(例如Netflix奖)的最佳模型。
明确矩阵分解
当我们处理用户喜好数据,并且这些数据是由用户本身提供的时候,我们将数据称作明确喜好数据。它们包括评价、赞许、喜爱以及其他用户对于事物的评价。
我们可以利用这些评价生成一个二维矩阵,以用户为行,事物为列,每个元素代表一个特定用户对一个特定事物的评价。由于在大多数情况下每个用户只接触了相对较少的事物,这个矩阵只有很少的非零元素(即稀疏矩阵)。
一个简单的例子,假设我们有如下的数据,代表每个用户对一组电影的评价:
我们建立的评价矩阵如下所示:
矩阵分解(或者矩阵重建)试图使用两个更小的低维度矩阵来代表已有的评价矩阵,因此,这是一种维度压缩技术。如果我们有U个用户和I个事物,我们的评价矩阵可能如下图所示,是一个U*I的稀疏矩阵:
如果我们想找到一个维度更低的矩阵近似代替我们的评价矩阵,并且矩阵的维度为k,我们最终可以得到两个矩阵:一个针对用户的U*k矩阵和一个针对事物的I*k矩阵。这些被称为特征矩阵。如果我们将这两个矩阵相乘,我们就可以重建评价矩阵的近似版本。这里需要注意的是当评价矩阵越稀疏时,评价矩阵就会越密集,如下图所示:
这些模型通常被称为潜在特征模型,正如我们寻找隐藏的特征(特征矩阵代表的),正是由于这些特征形成了评价矩阵的固有结构。当这些隐藏的属性或者特征不能够被直接解释时,它们可能代表了一些情况,例如:用户对特定导演、类型、风格或者演员的喜好倾向。
当我们直接建立了评价矩阵,对于这些模型的预测也就相对来说直接了:为了计算一个被预测的喜好程度,我们将用户特征矩阵中相应的行向量与事物特征矩阵中相应的列向量点乘。在下面的图表中有对于这种方法的解释,其中相应的向量使用高亮印刷:
为了找到两种事物之间相似程度,我们可以使用我们在最近邻模型中使用过的相同的方法,除此之外我们可以直接计算两个特征向量相似程度,如下图所示:
分解模型的好处在于一旦模型生成之后计算推荐值相对容易。然而,对于非常大的用户和事物集合来说,由于要求存储和计算潜在的几百万的用户特征和事物特征向量,这种模型受到了巨大挑战。另外一个优势,如之前所述,它的效果十分优秀。
不幸的是,分解模型和最邻近模型比较相对难于理解,而且在训练过程中计算更加密集。
隐含性矩阵分解
目前为止,我们已经解决了明确喜好分析如评价程度的问题。然而,大多数我们能够收集到的喜好数据是不明确的反馈,即用户和事物之间的喜好关系没有直接提供给我们,而是隐藏在用户和事物的交互过程中。这方面的例子包括二元数据(例如是否一个用户看过某个特定的影片,是否他们购买了一种产品等等)以及统计数据(例如一位用户观看某一部电影的次数)。
处理隐藏数据的方法有很多。MLlib实现了一种特别的方法:将评价矩阵看成两个矩阵:一个描述喜好的二元矩阵P,和一个描述置信度的矩阵C。
举个例子,拿我们之前看过的用户-电影喜好程度的例子来看,事实上数字就代表了用户看影片的次数。两个矩阵可以看做如下截图。矩阵P告诉我们某部电影被某用户看过,矩阵C用观看电影的次数代表置信度。一般而言,一位用户观看一部电影的次数越多,这个用户喜爱这部电影的程度也就越高。
隐含模型也会生成一个用户特征矩阵和一个事物特征矩阵。在这种情况下,这种模型中矩阵需要近似的不是整个评价矩阵而是喜好矩阵P。如果我们通过用户特征向量和事物特征向量点乘生成推荐值,这个值将不会直接作为喜好程度的预估而是偏爱程度的评估(即使不是严格在0和1之间,这些数据也会在0与1之间相对较小的范围内。
交替最小二乘法
交替最小二乘法(ALS)是一种解决矩阵分解问题的最优化技术;这种技术十分有用,效果很好并且被证明相对容易使用平行计算实现。因此,它特别适合于像spark一类的框架。在写这本书的时候,它是MLlib唯一实现的模型。
ALS是通过迭代法解决一系列最小二乘回归问题。每一次迭代过程中,用户特征矩阵和事物特征矩阵其中一个不变,同时另一个使用给定的特征值和评价值更新。然后,解得的特征矩阵不变,另外一个特征矩阵更新。这个过程一直持续直到模型收敛(或者到一个特定的迭代次数)。
从你的数据中获取正确的特征
在这一节,我们将使用明确评价数据,除去其余的用户或者事物的元数据以及用户事物交互的其他相关信息。因此,我们需要的作为输入的特征就是用户的标号和电影的标号以及用户电影对的评价值。
从MovieLens 100k 数据集中获取正确的特征
在spark的根目录下启动spark的字符交互界面,确保你通过 –driver-memory 选项提供了足够的存储空间:
在这个例子中,我们将使用同一个在之前的章节中使用的MovieLens 数据集。使用你存放数据集的目录,按照下列代码输入路径。
首先,观察原始的评价数据集:
你将会看到和以下内容相似的代码显示:
回顾一下这个数据集的构成:用户编号、电影编号、评价值、时间戳,中间用制表符隔开。我们不需要时间戳,当我们训练我们的模型时,简单提取前三个值即可。
我们首先通过制表符将字符串分开,得到了字符串数组。然后使用Scala自带的take函数保存数组中的前3个元素,与之对应的是用户编号、电影编号、评价值。
我们可以通过调用rawRatings.first()查看第一条记录,它仅仅包括了驱动程序中的第一条记录。输出如下:
我们将使用spark的Mllib库去训练我们的模型。让我们看一看我们可以使用哪些模型以及它们要求的输入数据。首先,从MLlib中导入ALS模型库:
在控制台上,我们可以观察到ALS对象可以使用的方法,它们用制表符隔开。输入ALS.
然后按下Tab键。你应该看到如下方法:
我们想调用的方法是train方法。如果我们输入ALS.train然后按下回车键,我们将得到一个错误提示。但是这个错误提示将告诉我们这个方法的标识:
因此我们可以看到至少我们需要提供输入参数ratings,rank和iterations。第二个方法还需要一个参数lambda。我们迅速浏览这3个方法,但是看一下ratings参数。首先,让我们导入它提到的Rating类,然后用相似的方式查明Rating类的实例需要哪些参数。输入Rating(),按下回车键:
正如我们从上述的结果中看到的,我们需要提供一个RDD类型且带有Rating记录的ALS模型。一个Rating类,反过来,就是一个用户编号、电影编号(这里称为产品)和评价值参数的封装。我们将使用map方法生成我们的数据集然后将它转换成Rating对象:
我们现在有一个RDD[Rating]数据,我们可以通过调用查看它:
训练推荐模型
一旦我们从原始数据中抽取到这些简单的特征,我们准备去进行模型训练;MLlib已经为我们做好了,我们需要做的就是提供正确输入格式的RDD,就是我们刚刚生成的和选出的模型参数。
针对MovieLens 100k 数据集训练一个模型
我们现在就准备训练我们的模型了!我们的模型需要的其他输入如下:
- rank :这个参数代表了我们ALS模型中特征的数目,也就是低阶近似矩阵中隐藏的特征的数目。一般来说,特征的数目越大效果越好,但是它对存储空间的使用有直接的影响,体现在计算和存储两个方面,特别是当用户或者事物的数目特别巨大的时候。因此,在实际使用中这里经常需要权衡利弊。10到200个等级的参数是合理的。
- iterations :这个参数是指运行的迭代次数。每次ALS算法的迭代过程都会降低重建评价矩阵的误差,在相对少的迭代过程之后ALS模型将收敛到一个相对合适的解。因此,在绝大多数情况下我们不需要设置太大的迭代次数(默认情况下10次为宜)。
- lambda:这个参数控制我们模型的正规化。因此lambda控制着拟合的过程。lambda的值越大,精度也就越高。这个敏感的值取决于规模、自然规律、数据的稀疏性。对于所有的机器学习模型,正规化参数应该使用样本外检验数据和交叉验证方法调整。
我们设置的rank为50,10次迭代次数,lambda参数是0.01。下面展示我们如何训练我们的模型:<!--
剩余内容已隐藏,支付完成后下载完整资料
资料编号:[148722],资料为PDF文档或Word文档,PDF文档可免费转换为Word
课题毕业论文、开题报告、任务书、外文翻译、程序设计、图纸设计等资料可联系客服协助查找。
您可能感兴趣的文章
- 饮用水微生物群:一个全面的时空研究,以监测巴黎供水系统的水质外文翻译资料
- 步进电机控制和摩擦模型对复杂机械系统精确定位的影响外文翻译资料
- 具有温湿度控制的开式阴极PEM燃料电池性能的提升外文翻译资料
- 警报定时系统对驾驶员行为的影响:调查驾驶员信任的差异以及根据警报定时对警报的响应外文翻译资料
- 门禁系统的零知识认证解决方案外文翻译资料
- 车辆废气及室外环境中悬浮微粒中有机磷的含量—-个案研究外文翻译资料
- ZigBee协议对城市风力涡轮机的无线监控: 支持应用软件和传感器模块外文翻译资料
- ZigBee系统在医疗保健中提供位置信息和传感器数据传输的方案外文翻译资料
- 基于PLC的模糊控制器在污水处理系统中的应用外文翻译资料
- 光伏并联最大功率点跟踪系统独立应用程序外文翻译资料