在这篇文章中,我会简要概述推荐系统这个领域,并解释每个算法的工作原理。
首先明确一下推荐系统的定义。推荐系统是一种技术,主要应用在那些需要为用户(客户,访客,应用程序用户,读者)等进行物品(产品,电影,事件,文章)推荐的场景或相反的为物品推荐用户的场景。通常情况下,在这些场景中会存在非常多的物品和用户,解决这个问题将会变的非常困难而且需要付出很大的代价。想象一个商店的例子,聪明的商人知道顾客的个人喜好,那么店主高质量的建议,能在让顾客满意的同时自己也会增加利润。在网络营销和购物的场景中,上面所说的人为的推荐行为则被推荐系统这一“人造的商人”所代替。
要构建一个推荐系统,您需要一个物品和用户的数据集,以及理想的用户与物品的交互行为数据。有非常多的应用领域,典型的有用户代表顾客,物品代表产品,用户行为表示一次单独的购买行为。在这张图片中,用户代表信用卡持有者,物品代表信用卡终端,用户行为代表交易行为。用这个的数据集生成的规则可以显示用户如何与物品交互。在这种情况下,基于在捷克的信用卡交易规则可以用来将附近的商店推荐给用户进行参观。
基于知识的推荐系统
用户和物品都有一些属性。你越了解你的用户和物品,得到的推荐结果就会越好。下面,我举一个与推荐相关的物品属性的例子:
Item: TV2305 { "name": "Television TV2305", "short description": "HD resolution LED TV", "long description": " Enjoy a movie with your family on the weekend with this HD television from Micromax. With an 81cm (32) display, you can view every single detail with rich detail and clarity. This LED TV produces a resolution of 1366 x 768 pixels with a refresh rate of 60Hz to display crisper images and fluid picture movement. Play HD videos and enjoy a 178 degree viewing angle so that everyone in the family, even those at the sides, can see. Connect HD devices such as BluRay players, PlayStations or HD Set Top Boxes to this television as it has an HDMI port. You can also connect an HDD or USB device to this TV via its USB port. Get a surround sound effect in your living room as this TV comes with two 8W speakers to deliver crisp sound across all your media. With a 5 band equalizer and an auto volume leveler feature, you can enjoy a movie's soundtrack or the latest hit single the way it was meant to be heard.", "price": 250, "categories": ["Electronics", "Televisions"]}
这样的属性是非常有用的,用在数据挖掘方法中可以提取基于规则和模式形式的知识,随后可以用在推荐系统中。例如,上面的物品是由几个可用来测量推荐项相似度的属性表示。即使是很长的文本说明也可以通过先进的自然语言处理工具进行处理。然后,根据物品的相似度产生推荐结果。在用户也可以通过类似的属性描述(例如,从求职者的简历中提取文本)的情况下,可以根据用户属性相似度生成推荐项。注意,在这种情况下,我们不使用用户的历史行为。因此,这种方法在被称为“冷启动”的用户和物品推荐场景中非常有效。这些通常都是新用户和新的物品。
基于内容的推荐系统
对于一个给定的用户,这样的系统推荐的物品是类似于那些他过去喜欢的物品,不会将其他用户的喜好考虑进来。基本上,有两种不同类型的反馈机制。
显式
反馈是特意以“喜欢”/“不喜欢”可以点击按钮,以及可以代表喜好程度的星数等形式提供给用户。在很多场景中,很难获取到用户显式反馈的数据。在用户表达不感兴趣的形式上,通常可以将他 / 她点击一个物品“不喜欢”按钮替代为离开网页或切换到另一个电视频道上。
隐式
反馈的数据,如“用户浏览过物品”,“用户完整的阅读了整篇文章”或者是“用户购买了一个物品”,这些都是非常容易搜集的数据并且能够帮助我们计算出好的推荐结果。不同类型隐式反馈数据可能包含:
- 用户行为 (隐式反馈数据)
- 用户浏览了一个物品
- 用户浏览了一个物品的详细信息
- 用户添加一个物品到购物车
- 用户购买了一个物品
- 用户把一篇文章从头读到尾
同样,在反馈的数据非常丰富的情况下,得到的推荐系统越能符合你的期望。
基于内容的推荐系统仅仅依赖给定用户的 de 历史行为数据,即并不会把其他用户的行为数据考虑进来。现行的方法是通过计算和用户最近访问过的物品的属性相似度,并推荐类似的物品。在这里,从我们的业务出发,我要指出一个有趣的现象,推荐最近的物品往往是非常成功的策略,当然这只是在某些领域和某些场景。
基于协同过滤规则的推荐系统
最后一组推荐算法是基于过去
的整个用户群体的行为数据。当一个“邻居”是准确定义并且行为数据是干净的,这些算法比以前的章节中描述的更为精确。
上面描述的是一个很简单并且很流行的近邻算法(K-NN)。构建一个用户推荐,需要对 K 个最近邻用户(同类最相似的用户)进行检查。然后,排名最高的 N 个额外的物品(当前用户没有对它们评过分),将会被推荐出来。
这种做法不仅面向主流的用户和受欢迎的物品,而且针对“长尾”用户的推荐效果也很好。在推荐的过程中,通过控制把多少邻居考虑进来,可以优化算法,并找到推荐的畅销物品和小众物品之间的平衡。良好的平衡对于推荐系统来说是至关重要的,这将在本文的第二部分中讨论的。
最近邻算法的实现主要两种不同的实现方法。那就是item-based
和user-based
协同过滤算法。两种算法都是基于user-item
矩阵(用户对物品的评分矩阵)。在user-based
算法中,对于一个用户u,这个用户未评分的物品,它的得分可以通过综合类似于u的用户的评分信息计算出来。
在 item-based
算法中,(u,i)是通过看一组类似的物品(互动相似),然后一些类似于用户u访问过的物品组合而成并给出一个用户u对它们预测的评分。
item-base
方法的优点在于物品相似性更加的稳定并且可以被高效的预先计算出来。
从我们的经验看,user-based
的算法在大多数的场景和数据集下优于item-based
算法。唯一的例外可能是数据集中物品数大大小于用户数或者是用户行为非常少。
K 近邻算法不仅可以解决协同过滤的问题。上面讨论的基于规则的算法采用 APRIORI 算法从用户行为矩阵中生成规则集。有足够支持度的规则随后就可以用来生成推荐的候选集。
K-NN 和基于规则的算法最重要的区别就是学习速度和召回。通常机器学习模型分为两个阶段。在训练阶段,建立模型,在召回阶段,模型被应用到新的数据集上。基于规则的算法在训练阶段需要付出很大的代价但是召回非常快。K-NN 算法刚好相反 - 因此被称为惰性学习者。在推荐系统中,很重要的一点就是需要经常更新模型(在每个用户与系统交互之后),并且可以立即应用到下一次的推荐请求中。而惰性的学习者很容易更新,基于规则的模型需要重新训练,在大型生产环境,这是特别具有挑战性的。
在 Recombee ,我们设计了一个以基于规则推荐为基础的改良版的惰性学习推荐算法,使我们能够实时输入用户行为,动态挖掘规则和实时更新模型。
用户与物品之间的交互行为产生的规则。
规则可以可视化,它是检查您的数据集中的数据质量和问题的一款非常好用的工具。该图显示了在行为矩阵中有足够支持度的规则。每个箭头都是一个规则(或暗示),有足够多的用户在与源物品进行交互完之后又与目标物品交互。连接的强度就是置信度。
上面描述的规则的详细视图。每个规则由箭头表示。箭头的大小是规则的置信度。
这些特定的规则是由银行提供的信用卡交易数据产生的。物品是“信用卡终端”,用户是“信用卡持有人”。用户行为单次交易。我们忽略了标签,因为数据是保密的,很多可以来自规则。在第一张图片中,规则簇是非常明显的。很明显这些信用卡终端在地理位置上离的很近。有很多有趣的规则显示出用户的购物习惯。当你上传你的数据到我们的推荐引擎(直接或通过我们的 keboola APP ,这将会更快),我们可以为您生成规则,你可以在你自己的数据中发现很多有趣的规则。
然而上面提到的规则的首要目的并不是数据分析而是用来推荐。可以根据他们最近的交易,为每个信用卡持有者单独生成推荐结果(例如,从这个取款机取款的人通常会花在以下的商店)。银行可以利用这些推荐结果建立智能数据产品(例如,用户在推荐的商店购物,银行可以领取奖励)。这样的数据产品几乎无处不在。你有很好想法如何利用推荐数据驱动的数据产品来提升你的业务吗?告诉我们,我们将会帮助你评估。
最后,可能是这里描述的最有趣的一类协同过滤算法,称为因式分解的算法。以上,用户行为矩阵被分解成两个小矩阵(一个代表用户,一个代表物品的矩阵)和一定数量的协方差矩阵(通常几百个)。通过将这两个小矩阵相乘得到(u,i)评分。有几种方法可以做矩阵分解并训练它们。上面所显示的是一个简单的梯度下降技术。通过随机梯度下降,交替最小二乘法或坐标下降算法误差可以被最小化。也有基于奇异值分解的方法,这种方法将排序矩阵分解为三个矩阵。
一般来说,这是非常有趣和成熟的机器学习领域。这里是一些进一步的阅读材料,如果你有兴趣: Facebook 用基于矩阵分解解决了推荐系统的扩展性,处理隐含的评分或各种指标。
正如你所看到的,有大量的算法并且每个算法都有参数来帮助我们找到模型良好的可塑性。我的将来会写一篇文章讨论组合的推荐模型,可以进一步提高推荐的质量。
如何评测推荐算法的好坏?这是另一个复杂的问题。
“不好的”的推荐结果一般来说是很难检测和预防。他们往往是特定于某个领域在推荐的时候必须被过滤掉。
(点击放大图像)
离线评估推荐算法展示了基于ALS 矩阵分解是如何胜过基于用户的K-NN 算法的。详情见下一篇文章。
推荐系统的评测
(点击放大图像)
在线评估质量和优化推荐效果。详情在下一篇文章。
有几个如何离线和在线的评价推荐系统的策略。在 Recombee ,准确的质量评估帮助我们自动优化系统参数,在所有的推荐场景的推荐系统的效果均得到提升。
你可以为自己的数据找出哪些组合的算法是最有效的。因此我们准备了一个免费的即时帐户,这样你可以使用我们的 API 或客户端做实验了。
查看英文原文: Recommender systems explained
感谢杜小芳对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论