推荐系统剖析。 第一部分

我在CleverDATA担任数据科学家。 我们从事机器学习项目,开发基于机器学习的营销解决方案的最常见要求之一就是推荐模型的开发。

在本文中,我将讨论推荐系统,尝试对现有方法进行最全面的概述,并用手指来解释算法的工作原理。 其中一些材料基于MovieLens实验室推荐系统的良好课程(大多数人都对同一数据集进行推荐测试很熟悉),其余的则来自个人经验。 本文由两部分组成。 第一部分描述了问题的陈述,并给出了简单(但很流行)推荐算法的概述。 在第二篇文章中,我将讨论更高级的方法和实现的一些实际方面。

来源

审查并陈述问题


推荐系统的任务是在给定的时间告知用户有关他可能最感兴趣的产品。 客户收到信息,该服务从提供优质服务中获利。 服务不一定是所提供商品的直接销售。 该服务还可以从佣金中赚取收入,或者只是提高用户忠诚度,然后转化为广告和其他收入。

根据业务模型的不同,推荐可以作为其基础(例如,使用TripAdvisor),也可以只是一种便利的附加服务(例如,在某些在线服装店中),旨在改善客户体验并使目录导航更加完善。舒服

在线营销的个性化是最近十年的明显趋势。 根据麦肯锡的说法,亚马逊收入的35%或Netflix收入的75%来自推荐产品,并且这个百分比可能会增长。 推荐系统是关于如何使客户满意的。

为了说明推荐服务的全部种类,我将列出可以描述任何推荐系统的主要特征。

  1. 推荐主题-推荐什么。

    这里种类繁多-可以是商品(亚马逊,Ozon),文章(Arxiv.org),新闻(Surfingbird,Yandex.Zen),图像(500px),视频(YouTube,Netflix),人(Linkedin,LonelyPlanet),音乐(Last.fm,Pandora),播放列表等。 通常,您可以推荐任何东西。
  2. 推荐的目的是为什么推荐它。

    例如:购买,通知,培训,建立联系。
  3. 推荐的上下文是用户此时正在做什么。

    例如:看货,听音乐,与人交谈。
  4. 该建议的来源是谁建议:

    -观众(TripAdvisor的平均餐厅评价),
    -感兴趣的用户
    -专家社区(有时涉及复杂的产品,例如葡萄酒)。
  5. 个性化程度

    非个人推荐-与其他人一样被推荐给您。 它们允许按地区或时间进行定位,但不考虑您的个人偏好。

    一个更高级的选项是当建议使用您当前会话中的数据时。 您已经看过几种产品,在页面底部为您提供了类似的产品。

    个人推荐会使用有关该客户的所有可用信息,包括其购买历史。
  6. 透明性

    如果人们确切地知道如何收到建议,他们会更信任该建议。 因此,进入“无良”系统来推广付费商品或将更昂贵的商品放在更高排名中的风险较小。 另外,一个好的推荐系统本身应该能够处理购买的评论和销售秘籍。

    顺便提一下,操作也是无意的。 例如,当发行新的大片时,粉丝首先想到的是它,在最初的几个月中,该评级可能被大大高估了。
  7. 建议的格式

    这可以是一个弹出窗口,在网站的特定部分中显示的排序列表,屏幕底部的功能区或其他内容。
  8. 演算法

    尽管有许多现有算法,但它们都可以归结为几种基本方法,稍后将对其进行描述。 最经典的算法是基于摘要的算法(非个人的),基于内容的算法(基于产品描述的模型),协作过滤(协作过滤),矩阵分解(基于矩阵分解的方法)等。


来源

任何推荐系统的中心都是所谓的偏好矩阵。 这是一个矩阵,在该矩阵的一个轴上预留了服务的所有客户端(用户),在另一个轴上是推荐对象(项目)。 在某些对(用户,商品)的交集处,此矩阵填充有评分(等级)-这是已知的用户对产品兴趣的指标,以给定的比例(例如1到5)表示。


用户通常只评估目录中产品的一小部分,推荐系统的任务是汇总此信息并预测客户对其他产品一无所知的态度。 换句话说,您需要填写上图中的所有空白单元格。

人们的消费方式有所不同,因此不必推荐新产品。 您可以显示重复的头寸,例如以补充库存。 根据此原理,将两组商品区分开。

  • 可重复的 。 例如,始终需要洗发水或剃刀。
  • 独特的 。 例如,很少重新获得的书籍或电影。

如果不能将产品明确分配给其中一个类别,则可以单独确定重复购买的可取性(某人只能购买某个品牌的花生酱,而对于某人来说,尝试目录中的所有商品很重要)。

“利息”的概念也是主观的。 一些用户只需要他们最喜欢的类别中的东西(保守推荐),相反,某些用户对非标准产品或产品组(危险推荐)更敏感。 例如,视频托管可以仅向用户推荐他最喜欢的系列的新剧集,并且可以定期向他投放新节目甚至新类型。 理想情况下,您应该选择一种策略,使用客户类别的建模分别显示每个客户的建议。

用户评级可以通过两种方式获得:

  • 明确的评分-用户放置产品评分,留下评论,喜欢该页面,
  • 隐含评分-用户没有明确表达其态度,但是可以从其行为中得出间接结论:他购买了该产品-这意味着他喜欢它,长时间阅读了说明-这意味着有兴趣,等等。

当然,明确的偏好会更好-用户自己说自己喜欢。 但是,实际上,并非所有站点都提供了明确表达其兴趣的机会,并且并非所有用户都希望这样做。 两种类型的评级最经常同时使用并且可以很好地相互补充。

区分预测(预测感兴趣程度)和建议书本身(显示建议)这两个术语也很重要。 显示什么以及如何显示是一个单独的任务,该任务使用在“预测”步骤中获得的估计值,但是可以以不同的方式实现。

有时,“推荐”一词在广义上使用,指的是任何优化,无论是选择用于广告邮件的客户,确定最佳报价或只是选择与客户的最佳沟通策略。 在本文中,我将自己局限于该术语的经典定义,表示为客户选择最有趣的产品。

非个性化建议


让我们从非个性化建议开始,因为它们最容易实现。 在它们中,用户的潜在兴趣仅取决于产品的平均评分:“每个人都喜欢它,所以您会喜欢它。” 当用户未登录系统(例如同一TripAdvisor)时,大多数服务都遵循此原则。

推荐可以以不同的方式显示-例如在产品说明侧面的横幅(Amazon),是根据特定参数(TripAdvisor)排序的请求的结果,或者是其他方式。

产品评分也可以通过多种方式显示。 这可能是产品旁边的明星,喜欢的次数,正面和负面投票之间的差异(通常在论坛上进行),高收视率的比例甚至是收视率的直方图。 直方图是最有用的方法,但是它有一个缺点-当您需要列出产品时,它们很难相互比较或排序。


冷启动问题


冷启动是一种典型情况,当尚未积累足够的数据以使推荐系统正常工作时(例如,当产品是新产品或很少购买时)。 如果仅通过三个用户(igor92,xyz_111和oleg_s)的估算值来计算平均评分,那么这种评估显然将不可靠,并且用户可以理解。 通常在这种情况下,评级是人为调整的。

第一种方法不是显示平均值,而是显示平滑的平均值(阻尼平均值)。 含义是:对于少量的评分,显示的评分更倾向于某种安全的“平均”指标,并且一旦收集到足够数量的新评分,“平均”调整就会停止工作。

另一种方法是计算每个等级的置信区间。 从数学上讲,估计数越多,平均值的变化就越小,因此,对其正确性的把握就越大。 作为等级,您可以显示例如区间的下边界(低CI界限)。 同时,很明显,这样的系统将非常保守,并且倾向于低估新产品的评级(当然,除非受到打击)。

由于估计值被限制在一定范围内(例如,从0到1),因此通常无法使用这种方法来计算置信区间:因为分布尾部趋于无穷大,并且区间本身具有对称性。 有另一种更准确的计算方法- 威尔逊置信区间 。 在这种情况下,获得了大约这种类型的不对称间隔。


在上图中,绘制了平均评分的水平评分,垂直是围绕平均值的分布。 颜色表示不同的样本大小(显然,样本越大,置信区间越小)。

冷启动问题与非个性化建议同样重要。 此处的一般方法是用各种启发式方法替换当前无法计数的内容(例如,用平均评分替换,使用更简单的算法或在收集数据之前完全不使用产品)。

建议的相关性


在某些情况下,考虑建议的“新鲜度”也很重要。 对于文章或论坛帖子尤其如此。 新条目通常应该排在最前面。 为此,请使用阻尼系数。 以下是一些用于计算媒体网站上文章排名的公式。

Hacker新闻杂志中的评分计算示例:

其中U =赞成,D =赞成,P(惩罚)-为实施其他业务规则而进行的其他调整

Reddit中的评分计算:

其中,U =赞成票数,D =反对票数,T =记录时间。 第一项估计“记录质量”,第二项进行时间校正。

显然,不存在通用公式,并且每个服务都发明了最能解决其问题的公式-对此进行了经验验证。

基于内容的建议


个人推荐建议最大程度地使用有关用户本人的信息,主要是有关其先前购买的信息。 首先是基于内容的过滤方法。 在这种方法的框架中,将产品(内容)的描述与用户根据其先前的评分获得的兴趣进行比较。 产品满足这些兴趣的程度越高,用户的潜在兴趣就越高。 这里明显的要求是,目录中的所有产品都应有描述。

从历史上看,基于内容的推荐的主题通常是带有非结构化描述的商品:电影,书籍,文章。 这样的标志可以是例如文本描述,评论,演员表等等。 但是,没有什么可以阻止使用普通数字或类别符号。

非结构化特征以典型的方式描述文本-单词空间中的向量向量空间模型 )。 这样的向量的每个元素都是潜在地表征用户兴趣的特征。 类似地,乘积是相同空间中的向量。

当用户与系统交互时(例如,他购买了电影),他购买的商品的矢量描述被组合(概括和归一化)为单个矢量,因此,形成了他感兴趣的矢量。 此外,找到描述最接近感兴趣向量的产品,即产品,就足够了。 解决找到n个最近邻居的问题。

并非所有元素都是同等重要的:例如,同盟词显然不携带任何有效载荷。 因此,在确定两个向量中匹配元素的数量时,必须首先权衡所有测量的重要性。 文本挖掘中众所周知的TF-IDF转换解决了此任务,该转换将更多的权重分配给稀有兴趣。 在确定两个向量的接近度时,这种兴趣的重合性比流行向量的重合性更为重要。


此处的TF-IDF原理同样适用于普通的名义属性,例如流派,导演,语言。 TF-度量该属性对用户的重要性,IDF-度量该属性的“稀有性”。

有一整套类似的转换(例如BM25和类似的转换),但实质上它们都与TF-IDF重复相同的逻辑:比较产品时,稀有属性应具有更大的权重。 下图说明了TF-IDF的重量如何取决于TF和IDF。 最接近的水平轴为DF:所有产品中的属性频率,最接近的水平轴为TF:用户的属性频率对数。


在实施过程中可以考虑一些要点。

  • 在形成商品的向量空间表示时,可以使用带状疱疹或n-gram (连续的单词对,三元组等)代替单个单词。 这将使模型更详细,但是培训将需要更多数据。
  • 在产品描述的不同位置,关键字的权重可能不同(例如,电影描述可能由标题,简短描述和详细描述组成)。
  • 来自不同用户的产品描述的权重可以不同。 例如,我们可以给具有许多评级的活跃用户更多的权重。
  • 同样,您可以称量和乘积。 对象的平均评分越高,其重量就越大(类似于PageRank )。
  • 如果产品描述允许链接到外部资源,那么您可能会感到困惑,并且还分析与该产品有关的所有第三方信息。

可以看出,基于内容的过滤几乎完全重复了搜索引擎(例如Yandex和Google)中使用的查询文档匹配机制。 唯一的区别在于搜索查询的形式-这里是描述用户兴趣的向量,并且包含所请求文档的关键字。 当搜索引擎开始增加个性化设置时,这种区别甚至消除了。

作为两个矢量接近程度的度量,最常用余弦距离。


添加新评估后,兴趣向量将逐步更新(仅适用于已更改的元素)。 在重新计票时,由于偏好可能会有所不同,因此有必要给予新的估计更多的权重。

协同过滤(基于用户的选项)


这类系统在90年代开始积极发展。 作为该方法的一部分,将根据其他类似用户的兴趣来生成推荐。 这些建议是许多用户“合作”的结果。 因此,该方法的名称。

该算法的经典实现基于k个最近邻居的原理。 在手指上-对于每个用户,我们都会在偏好方面寻找与他最相似的k,并用有关他的邻居的已知数据来补充有关该用户的信息。 因此,举例来说,如果您知道感兴趣的邻居对这部电影“鲜血与混凝土”很满意,而您由于某种原因却没有看过电影,那么这是向您推荐这部电影供星期六观看的绝佳机会。


上图说明了该方法的原理。 在偏好矩阵中,用户以黄色突出显示,我们要为其确定新产品(问号)的等级。 他最近的三个邻居以蓝色突出显示。

在这种情况下,“相似性”是兴趣“相关性”的同义词,可以用多种方式来考虑(除了皮尔逊相关性之外,还存在余弦距离,提花距离,汉明距离等)。

该算法的经典实现方式有一个明显的缺点-由于二次复杂度,因此在实践中不太适用。确实,就像最近邻居的任何方法一样,它需要计算用户之间的所有成对距离(并且可能有数百万个用户)。很容易计算出距离矩阵的计算复杂度为Øñ2其中,n是用户数,m是产品数。对于一百万个用户,至少需要4TB来存储距离矩阵原始数据。

通过购买高性能熨斗可以部分解决此问题。但是,如果您采取明智的做法,最好将更正引入算法中:

  • 并非每次购买都更新距离,而是批量更新(例如,每天一次),
  • 不要完全重新计算距离矩阵,而要逐步更新,
  • 选择迭代和近似算法(例如ALS)。

为了使该算法有效,必须满足一些假设。

  • 人们的品味不会随着时间而改变(或改变,但对于每个人来说都是一样的)。
  • 如果人们的品味相吻合,那么他们在所有方面都相吻合。

    例如,如果两个客户喜欢同一部电影,那么他们也喜欢同一本书。当推荐的产品均质时(例如,仅薄膜),通常会发生这种情况。如果不是这样,那么几个客户很可能会拥有相同的食物偏好,而政治观点则正好相反-在这种情况下,该算法的有效性会降低。

可以通过不同方式选择偏好空间中用户的邻居(他的邻居),我们将对其进行分析以生成新的推荐。通常,我们可以与系统的所有用户一起工作,可以设置某个接近度阈值,可以随机选择几个邻居,也可以选择n个最相似的邻居(这是最流行的方法)。

MovieLens作为最佳邻居数的作者为电影提供了30-50个邻居的数字,为任意推荐提供了25-100个邻居的数字。显然,如果我们带太多的邻居,我们将有更多的随机噪声机会;反之亦然,如果我们带的邻居太少,我们将获得更准确的建议,但是推荐的产品却更少。

数据准备中的一个重要阶段是估算值的标准化。

数据标准化(缩放)


由于所有用户的评估方式都不一样-某人连续输入5个,而您很少期望某人输入4个,因此最好在计算之前对数据进行规范化,即 导致一个单一的尺度,以便算法可以正确地相互比较。

自然地,然后需要通过逆变换将预测的估计值转换为原始比例(并且,如有必要,四舍五入到最接近的整数)。

有几种标准化方法:

  • 居中(均值居中)-从用户的评分中,我们仅减去平均评分,

    *仅与非二进制矩阵有关
  • 标准化(z分数)-除居中外,我们还将其评分除以用户的标准偏差,

    *在此,反向转换后,评分可能会超出范围(例如,五分制评分为6),但是这种情况很少见,并且通过四舍五入到最接近的可接受估计值即可解决这些问题。
  • 双重标准化-第一次将用户评分标准化,第二次-产品评分。

    如果电影“最佳电影”的平均评分为2.5,而用户给它的评分是5,则这是一个很强的因素,表明此类电影显然符合他的口味。

可以以不同的方式来考虑两个用户的偏好的“相似性”或相关性。实际上,我们只需要比较两个向量。我们列出了一些最受欢迎的。

  1. — , .


    — , .

    50 / min(50, Rating intersection) damping factor, .


  2. — , .. , . .



  3. . , — , .



    — , (.. ), . , .

协作方法的一个有趣发展是所谓的基于信任的建议,该建议不仅考虑了人们根据他们的兴趣的接近程度,还考虑了他们的“社会”接近程度以及他们之间的信任程度。例如,如果我们在Facebook上看到一个女孩定期访问带有她朋友录音的页面,那么她相信自己的音乐品味。因此,向女孩推荐可以完全融合朋友播放列表中的新歌曲。


建议的理由


用户信任推荐系统很重要,为此,它应该简单易懂。如有必要,应始终提供易于理解的建议解释(用英语术语解释)。

作为说明的一部分,很高兴显示产品对邻居的评估,并根据该属性(例如,演员或导演)出现巧合,并在评估中显示系统的信心(信心)。为了不使界面过载,可以将所有这些信息放入“告诉我更多”按钮。

例如:

  • “您可能会喜欢这部电影,因为它在那儿播放……而且……”
  • “具有类似音乐品味的用户将专辑评为...满分4.5,满分5分。”

总结


这将结束本文的第一部分。我们检查了问题的一般陈述,讨论了非个人建议,描述了两种经典方法(基于内容的过滤和协作过滤),还涉及了证实建议的主题。通常,这两种方法足以构建可用于生产的推荐系统。在下一部分中,我将继续进行回顾并讨论更现代的方法,包括涉及神经网络和深度学习的方法以及混合模型。

Source: https://habr.com/ru/post/zh-CN420499/


All Articles