推荐系统剖析。 第二部分

一周前,我在这里对现有推荐算法进行概述。 在本文中,我将继续进行本次审查:我将讨论协作过滤的基于项目的变体,基于矩阵分解的方法,测试问题以及较少的“非扭曲”(但同样有趣的)算法。


协同过滤(基于项目的选项)


基于项目的方法是对第一部分中描述的基于经典用户的方法的自然替代,除了一点之外,它几乎完全重复了这一点-它适用于转置的偏好矩阵。 即 寻找相关产品,而不是用户。

让我提醒您,基于用户的协作过滤(基于用户的CF)会为每个客户搜索一组与其最相似的客户(就以前的购买而言),然后平均他们的偏好。 这些平均首选项可以为用户提供建议。 在商品协同过滤(基于项目的CF)的情况下,将在产品集(偏好矩阵的列)中搜索最近的邻居。 平均恰好发生在它们上。

确实,如果产品实质上相似,则很可能同时喜欢或不喜欢它们。 因此,当我们看到两个产品具有很强的相关性时,这可能表明它们是相似的产品。

基于项目的优势优于基于用户的优势:

  • 当有很多用户(几乎总是)时,查找最近邻居的任务就很难计算。 例如,对于一百万个用户,您需要计算和存储  frac12106106约5000亿的距离。 如果距离是用8个字节编码的,则仅距离矩阵将产生4TB的空间。 如果我们基于项目,则计算的复杂度会随着 ON2n之前 On2N距离矩阵的维数不再是(100万/ 100万),而是例如商品数量(100/100)。
  • 接近程度比接近程度准确得多。 这是以下事实的直接结果:用户通常比商品多得多,因此计算商品相关性时的标准误差要小得多。 我们只有更多信息可以得出结论。
  • 在基于用户的版本中,用户描述通常非常稀疏(有很多产品,很少有评级)。 一方面,这有助于优化计算-我们仅将存在交点的那些元素相乘。 但另一方面-您不带几个邻居,最终可以推荐的商品清单很小。
  • 用户首选项可能会随时间而变化,但项目描述会更加稳定。

该算法的其余部分几乎完全重复了基于用户的选项:余弦距离与接近度的主要度量值相同,数据归一化的需求也相同。 通常在20左右的范围内选择相邻商品的数量N。

由于要在大量观察值中考虑产品的相关性,因此在每次进行新评估后重新计算它并不那么重要,您可以在战斗模式中定期进行此操作。

对算法的几个可能的改进:

  • 一个有趣的修改是将产品的“相似性”不视为典型的余弦距离,而是通过比较其内容(基于内容的相似性)来考虑。 如果同时没有以任何方式考虑用户偏好,则此类过滤将不再是“协作”的。 此外,算法的第二部分-获得平均估计值-不会发生任何变化。
  • 另一种可能的修改是在计算项目相似度时权衡用户。 例如,进行评分的用户越多,比较两种产品时他们的体重就越大。
  • 可以通过进行线性回归来选择权重,而不是简单地平均相邻产品的估计值。

当使用基于项目的方法时,建议往往更为保守。 确实,建议的分散性较小,因此显示非标准产品的可能性较小。

如果在偏好矩阵中我们使用产品描述视图作为等级,那么推荐的产品很可能是类似产品-经常一起查看的产品。 如果我们根据购买量在偏好矩阵中计算等级,那么推荐产品很可能是配件-通常一起购买的商品。

系统质量评估


测试推荐系统是一个困难的过程,并且总是会提出很多问题,这主要是由于“质量”这一概念的模棱两可。

通常,在机器学习任务中,有两种主要的测试方法:

  • 使用回溯测试对历史数据进行离线模型测试,
  • 使用A / B测试来测试完成的模型(我们启动了多个选项,看看哪个选项可提供最佳结果)。

这两种方法都被积极地用于推荐系统的开发中。 让我们从离线测试开始。

您必须面对的主要限制是评估预测的准确性,我们只能对用户已经评分的那些产品进行预测。

标准方法是使用留一法和留一法的交叉验证。 重复测试并取平均结果,可以获得更稳定的质量评估。

  • 留一法-在用户评估的所有对象上训练模型(除一个对象外),然后对该对象进行测试。 对所有n个对象执行此操作,并在获得的n个质量估计中计算平均值。
  • 离开点是相同的,但是每一步都排除了p点。

所有质量指标均可分为三类:

  • 预测准确性-评估预测评分的准确性,
  • 决策支持-评估建议的相关性,
  • 排名准确性指标-评估已发布建议的排名质量。

不幸的是,在所有情况下都没有一个推荐指标,并且参与测试推荐系统的每个人都出于自己的目的选择它。

如果对等级进行连续分级(0-10),则“预测准确度”等级指标通常就足够了。
职称配方内容描述
MAE(平均绝对误差)E|PR|平均绝对偏差
MSE(均方误差)E|PR|2标准误差
RMSE(均方根误差) sqrtE|PR|2均方根误差
决策支持类指标适用于二进制数据(0和1,是和否)。 如果在我们的任务中最初将评级以连续规模推迟,则可以通过应用决定性规则将其转换为二进制格式-例如,如果评级小于3.5,我们认为评级为“差”,如果评级大于3.5,则认为为“良好”。
职称配方内容描述
精密度 fracTPTP+FP用户推荐的百分比
召回 fracTPTP+FN用户感兴趣的产品百分比。
F1-措施 frac2PRP+R谐波均值精度和召回率。
当无法提前说出哪个指标更重要时,这很有用。
ROC AUC在推荐列表顶部,有趣的产品的浓度有多高
精度@ N排名靠前N个记录的精确度指标
召回@ N回忆根据前N个记录计算的指标
平均p整个建议清单的平均精度
通常,推荐显示在几个位置的列表中(从上到下,然后按优先级从高到低排列)。 等级准确度等级度量标准衡量推荐在排序列表中的显示顺序是否正确。
职称配方内容描述
平均倒数排名E frac1pos用户在推荐列表中的哪个位置找到第一个有用的
斯皮尔曼相关E|PR|2推荐等级的实际和预测等级的相关性(长矛手)
直流电 sum fracRimax1logi考虑到建议的排名问题的信息性
一致性对的分数PXR>XP在推荐列表顶部,有趣的产品的浓度有多高
如果我们将推荐系统用于在线业务,那么通常它们有两个(有时是相互矛盾的)目标:

  1. 告知用户有趣的产品,
  2. 鼓励他进行购买(通过邮寄,编写个人要约等)。

与在旨在激励用户采取行动的任何模型中一样,仅应评估目标行动的增量增长。 也就是说,例如,在通过推荐计算购买量时,我们需要排除用户自己在没有模型的情况下本应进行的购买。 如果不这样做,将大大高估引入模型的效果。

提升度是模型的精度超过某个基准算法多少次的指标。 在我们的案例中,基线算法可能只是缺乏建议。 该指标很好地把握了增量购买的份额,这使您可以有效地比较不同的模型。

用户测试


来源

用户行为是形式化程度不高的事情,没有一个度量标准可以完全描述他在选择产品时脑海中的思维过程。 该决定受许多因素影响。 单击带有推荐产品的链接尚未获得很高的评价,甚至没有兴趣。 在线测试有助于部分了解客户端的逻辑。 以下是进行这种测试的几种方案。

第一个也是最明显的情况是对网站事件的分析。 我们查看用户在站点上正在做什么,他是否在关注我们的建议,是否遵循这些建议,是否需要系统的哪些功能,哪些不是,最好的产品是推荐的,哪些是更差的。 为了了解总体上哪种算法更好,或者只是尝试一个有前途的新想法,我们进行A / B测试并收集结果。

第二种情况是以民意测验和民意测验的形式接收用户的反馈。 通常,这些是理解客户如何使用服务的一般问题-更为重要:相关性或多样性,是否可以展示重复的产品还是太烦人了。 该脚本的优点是可以直接回答所有这些问题。

这样的测试是一件复杂的事情,但是对于大型推荐服务而言,这仅仅是必要的。 问题可能会更加复杂,例如,“哪些列表似乎与您更相关”,“这张表看起来有多完整”,“您会看这部电影/读一本书”。

隐式评级和一元数据


在其开发之初,推荐系统用于服务中,用户可以通过对产品进行评级来清楚地评估产品-这些是亚马逊,Netflix和其他在线交易网站。 但是,随着推荐系统的普及,有必要将它们也应用在没有评级的地方-这些可能是银行,汽车维修店,设有沙瓦玛的报亭和任何其他由于某种原因无法建立评估系统的服务。 在这些情况下,只能通过间接符号来计算用户的兴趣-产品的某些操作会表明用户的偏爱,例如,查看网站上的说明,将产品添加到购物篮等。 它使用“购买-意味着爱!”的原则。 这种隐式评估系统称为隐式评估。

隐式等级显然比显式等级更差,因为它们会增加一个数量级的噪声。 毕竟,用户可以将产品作为礼物购买给他的妻子,或者转到带有产品说明的页面,仅以“什么样的味道都一样”在这里留下评论,或者满足他的自然好奇心。

如果在明确评级的情况下,我们有权期望至少有一个负面评级是“否”,“否”和“是”,那么我们将不会从任何地方获得负面评级。 如果用户不买书“灰色的五十道阴影”,他可以这样做有两个原因:

  • 她对他真的不感兴趣(这是一个否定的案例),
  • 她对他感兴趣,但是他根本不了解她(这是一个漏报的正面案例)。

但是我们没有数据可以区分第一种情况和第二种情况。 这是不好的,因为在训练模型时,我们必须在积极的情况下加强它,而在消极的情况下罚款,因此我们几乎总是会很好,结果,该模型将带有偏见。

第二种情况是仅保留正面评级的能力。 一个引人注目的示例是社交网络上的“赞”按钮。 这里的评分已经明确列出,但是像前面的示例一样,我们没有负面的示例-我们知道用户喜欢哪个频道,但是我们不知道他们不喜欢哪个频道。

在两个示例中,该任务都变为一元类分类任务。

最明显的解决方案是走一条简单的道路,将不存在评级视为否定评级。 在某些情况下,这更合理,而在某些情况下,则更少。 例如,如果我们知道用户最有可能看过该产品(例如,我们向他显示了该产品列表,并且他切换到了紧随其后的产品),那么缺乏过渡就可以真正表明缺乏兴趣。

来源

分解算法


用较大的“笔画”描述用户的兴趣将是很棒的。 不是采用“他喜欢电影X,Y和Z”的格式,而是采用“他喜欢现代俄罗斯喜剧”的格式。 除了这将增加模型的可推广性这一事实之外,它还将解决数据量大的问题-因为兴趣将不是通过商品向量来描述,而是通过明显更小的偏好向量来描述。

这种方法也称为频谱分解或高通滤波(因为我们去除了噪声并留下了有用的信号)。 代数中的矩阵有许多不同的分解,最常用的分解之一就是SVD分解(奇异值分解)。

SVD方法在80年代后期用于选择含义相似但内容不相近的页面,然后开始在推荐任务中使用。 该方法基于将等级®的初始矩阵分解为3个矩阵的乘积:

R=UDS矩阵的大小 km=krrrrm并且r是
分解等级-表征分解细节程度的参数。

将此分解应用于我们的偏好矩阵,我们获得两个因子矩阵(简短描述):

U-用户偏好的简洁描述,
S是产品功能的简要说明。

重要的是,使用这种方法我们不知道哪些特征与简化描述中的因素相对应,因为我们用一些数字对其进行了编码。 因此,SVD是一个未解释的模型。

为了获得偏好矩阵的近似值,将因子矩阵相乘就足够了。 完成此操作后,我们将获得所有客户产品对的评分。

这种算法的通用系列称为NMF(非负矩阵分解)。 通常,此类展开的计算非常耗时,因此在实践中,它们通常求助于其近似的迭代变体。

ALS(交替最小二乘)是一种流行的迭代算法,用于将偏好矩阵分解为2个矩阵的乘积:用户因子(U)和乘积因子(I)。 它以最小化额定值标准误差的原理工作。 优化是交替进行的,首先是根据用户因素,然后是产品因素。 同样,为了避免再训练,将正则化系数添加到标准误差中。


如果我们用包含有关用户或产品的信息的新维度来补充偏好矩阵,那么我们将能够扩展张量而不是偏好矩阵。 因此,我们将使用更多可用信息,并可能获得更准确的模型。

其他方法


关联规则

关联规则通常用于产品关联性分析(“购物篮分析”)中,看起来像这样:“如果客户的支票中有牛奶,那么在80%的情况下将有面包”。 也就是说,如果我们发现客户已经在篮子里放了牛奶,那么该提醒面包了。

这与按时间间隔进行的购买分析不同,但是,如果我们将整个历史视为一个大篮子,那么我们可以在此充分应用这一原理。 例如,当我们出售昂贵的一次性商品(信贷,航班)时,这可能是合理的。

RBM(受限的Bolzman机器)

有界玻尔兹曼机器是一种基于随机递归神经网络的相对较旧的方法。 这是一个具有潜在变量的模型,与SVD分解相似。 它还寻找用户首选项的最紧凑描述,该描述使用潜在变量进行编码。 该方法不是为搜索推荐而开发的,而是已成功用于顶级Netflix Prize解决方案中,并且仍在某些任务中使用。

自动编码器

它基于相同的频谱分解原理,这就是为什么此类网络也称为降噪自动编码器的原因。 网络首先将其了解的用户数据折叠成一个紧凑的表示形式,尝试仅保留有意义的信息,然后将数据还原到其原始尺寸。 结果是一种平均的,无噪音的模板,您可以通过该模板评估对任何产品的兴趣。

DSSM(深度语义相似性模型)

新方法之一。 都是相同的原理,但是在潜在变量的作用下,这是输入数据(嵌入)的内部张量描述。 最初,该模型是为与文档(以及基于内容的建议)进行查询匹配而创建的,但是很容易将其转换为匹配用户和产品的任务。


深度网络架构的多样性是无止境的,这就是深度学习为推荐系统提供真正广阔的实验领域的原因。

混合解决方案


实际上,很少使用一种方法。通常,将几种算法组合在一起以达到最佳效果。

合并模型的两个主要优点是提高了准确性,并且可以对不同的客户群进行更灵活的调整。缺点是解释性较差,实现和支持的复杂性较高。

几种组合策略:

  • 加权-阅读加权平均预测以获取多个估算值,
  • 叠加-各个模型的预测是另一个(元)分类器的输入,该分类器学习正确加权中间估计,

  • 切换-为不同的产品/用户应用不同的算法,
  • 混合-计算关于不同算法的建议,然后简单地合并为一个列表。

例如,使用基于内容的推荐器,并将其作为功能之一-协同过滤的结果。

特征加权(线性)堆叠:

P(u,i)=w1P1(u,i)+w2P2(u,i)++wnPn(u,i)


重物 在样本上训练。通常,逻辑回归用于此目的。一般堆叠:w1,w2wn



P(u,i)=f1(u,i)P1(u,i)+f2(u,i)P2(u,i)++fn(u,i)Pn(u,i)




Netflix


Netflix奖是2009年举行的一项竞赛,要求用户预测Netflix电影库用户的收视率。100万美元的奖金引起了轰动,并吸引了众多参与者,其中包括AI领域的着名人物。

这是一项具有明确评级的任务,分数的设定范围为1到5,RMSE评估了预测的准确性。大部分第一名是由大量分类器占据的。

获奖合奏使用了以下类别的模型:

  • 基本模型-基于平均估计的回归模型
  • 协作过滤-协作过滤
  • RBM-有限的Boltzmann机器
  • 随机森林-预测模型

传统的梯度提升被用作结合了局部算法估计的元算法。

总结


生成推荐的任务非常简单-我们用我们已知的用户估计值来编译一个偏好矩阵,如果事实证明,我们会在客户和产品上补充这些估计值,并尝试填充未知值。

尽管声明很简单,但仍有数百篇文章发表,从根本上描述了解决该问题的新方法。首先,这是由于可以在模型中使用的收集数据量增加以及隐式评级的作用增加了。其次,随着深度学习的发展和新的神经网络架构的出现。所有这些都增加了模型的复杂性。

但是总的来说,所有这些多样性归结为一小部分方法,我在本文中试图对其进行描述。

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


All Articles