我们如何制定个性化产品推荐

图片
我们的商店客户希望进行酷营销。 为了使人们购买更多商品,他们会定期向他们发送电子邮件。 他们每次想:“写什么信?”。




您可以简单地写:“更频繁地从我们这里购买!”,但是效果不是很好。 一个更好的主意是在字母中插入产品广告。 建议对购买者感兴趣的产品做广告。


接下来,我将讨论我们如何从头开始提出真实的个人建议。


选择推荐的东西


您可以推荐任何东西。


您可以推荐购买最多的产品。 例如,在一家电子商店中,这些是硬盘驱动器和移动电话。 但是那些已经拥有它们的人呢? 事实证明,每个人都被推荐相同的东西-不是很酷。


您可以推荐与该人在网站上看过的东西类似的东西-例如,看过鞋子,我们建议...其他鞋子! 无论听起来多么奇怪,它都会在实践中使用甚至起作用。


但是我们仍然想做一些特别的事情,以便每个人都能在信中看到他真正需要的一些个性,以便他有一次又一次回到商店的愿望。 我们在各个领域拥有近300家客户商店,这使这项任务变得复杂。 这些建议对每个建议都应适用,并自动调整以适应特定商店的具体情况。 因此,我们开始提出普遍的个人建议。


制作基本模型


阅读来自Amazon的文章后 ,我们决定制作最基本的个人推荐模型,并查看其显示方式。


首先,下载购物表并将其扩展为稀疏的客户端产品矩阵。


图片

将购物清单转换为客户-产品矩阵


接下来,我们使用协作过滤 。 直觉很简单:客户1号购买了产品1号,两个产品3号购买了产品。 2号客户也购买了1号产品-他可能想购买3号产品。


协同过滤包括将一个大的稀疏矩阵分解为两个大小明显较小的密集的细长潜在特征矩阵。 对于分解,我们使用隐式库中现成的AlternatingLeastSquares实现。


训练模型后,我们会为所有客户和所有产品获得潜在的症状。 它们分别以矩阵形式(客户数量x标志数量)和(产品数量x标志数量)表示。


潜在标志是没有明确设置在任何地方的标志,例如人的身高或公寓面积。 通常,它们是通过对原始数据进行一些数学转换而获得的。


排列潜在特征矩阵,以便将它们相乘得到与原始大小相同的矩阵。 按照高度的惯例,我们可以说,如果数字更大,那么数字将会更大-大约一个。 少即是少。 在零的地方,将有少量数字,接近零,可能为负数。 但是重要的是,在一些零的地方,将会出现大量数字-我们未来的建议。


图片

相互影响很大的购买以相同的颜色突出显示。 一个框突出显示了一些将来的建议。


现在,如果我们获取特定客户的特征向量并将其乘以产品特征矩阵,我们将获得该客户的所有产品的得分向量。 剩下的只是从中选择速度最快的几种产品。


细微差别-在推荐产品中很有可能是客户已经购买的产品-需要将它们排除在外。


奇怪的是,但是这种简单的方案却奏效了,客户很高兴测试我们的建议。 我们进行了AB测试,将个人推荐与畅销书进行了比较。 在某些情况下,两者之间没有差异,但是在某些情况下,他们看到转化率的统计上显着提高,最高可达10%。 这些主要是购买频率很高的商店,因此,有大量的数据。


我们使用更多数据。


很显然,仅有关购买的信息不足以提出好的建议。 如果仅仅是因为许多客户根本没有购物。 因此,我们决定改进我们的建议。


添加有关所有动作的信息


除了购买外,我们还开始考虑产品视图,并将其添加到购物篮,“收藏夹”等各种列表中。


对于每种类型的动作,我们选择一个权重并将其添加到具有此权重的稀疏矩阵中。


我们考虑了采取行动的时间


我们认为昨天的购买和一年前的购买对建议的影响应该不同。 因此,我们为所有动作引入了指数遗忘系数。


另外,对于某些商店(例如服装)来说,季节性很重要:如果是夏天,那么您需要比一个人六个月前在冬天更加关注一年前夏天在夏天购买的东西。


我们考虑了明显的迹象


我们的数据库包含各种信息。 我们决定应使用一切。


对于产品,我们开始使用价格,制造商,产品类别以及商店指示的其他各个字段(衣服尺寸,家具颜色,狗粮中是否存在转基因生物等)。


对于客户,他们使用了性别,年龄,邮箱域,上次会话的操作系统以及他进入数据库的渠道(在线,离线,社交网络等)。
要将所有这些附加到模型,我们:


  1. 我们制作了特征矩阵(分别针对客户和产品),之前使用标准方法进行了处理:缩放,一键编码。
  2. 基于产品的功能和现有的客户-产品矩阵,我们为客户恢复了配对的其他功能。 以产品属性的产品与客户属性配对的方式进行恢复,以使源矩阵尽可能接近。 将这些其他标志粘贴到现有的潜在标志上。
  3. 同样,我们以客户的迹象做。

图片

扩大潜在迹象


现在我们有了更多的迹象,我们可以提出更精确的建议。 从那时起,显示出具有统计意义的有利于个人推荐的结果的测试数量开始增长。 除了测试,专家的主观评估也得到了改善。


配置超参数


指标优先


当然,我们一直在测试我们的建议。 我们进行了离线测试和在线测试。


当然,在线AB测试是检查推荐质量的一种更可靠的方法。 这些测试显示出良好的结果。


但是,在线测试非常不便:


  • 您需要找到一家想要与其客户冒险的商店,并测试该算法的新版本。


  • 然后,您需要等待一天/一周/两天,以获得一些具有统计意义的结果。


  • 您需要重复100次才能测试100个不同的选项。



因此,脱机测试是必不可少的。 在这里不能不提我们如何执行它们。


作为离线指标,他们选择了流行且简单的-nDCG @ K(K处的归一化折扣累积收益) ,或者说是几千个客户的平均值。


此指标是排名质量。 它采用从0到1的值,并显示推荐的质量。


要计算指标值,您需要一个标准-理想的建议。 我们没有这样的标准。 但是我们找到了一条出路:我们在一个月前的某个时间点考虑了建议,并查看了一个人本月购买的商品-这是我们的标准。


这里有个小窍门:如果一个月前我们向客户推荐了一些东西,他可以买,但他没有买。 但是我们永远不会知道这一点。


还有一点:我们可以推荐带绒球的蓝帽子,而客户买了没有绒球的蓝帽子。 货物似乎相似,但有所不同-公制下垂。 因此,在计算度量时,我们开始考虑商品的相似性。


现在关于超参数


由于我们拥有离线指标,因此我们可以安全地测试各种建议的选项,而不必担心有人会遭受痛苦。


在一个令人费解的一周的想象力中,我们尝试了2-3种算法的不同修改,其中包括简单(例如不同的遗忘因素)和更复杂(例如使用其他算法来粘贴客户和产品的明显标志)。


某些修改在任何地方都无效。 有些在所有项目上都显示了改进-我们已修复它们。 一些项目中的一些改进了该指标,而另一些项目则恶化了。 这样我们得到了超参数设置


现在,我们有11个超参数。 花了几天的时间才能找到所有项目的最优值。


经过调整后,事实证明,所有项目的指标平均增长了6倍,增长最快的是35倍!


改善功能


我们可以提出良好的个性化建议。 好酷


但是它们如何工作? 这样的事情:每天晚上,当服务器上的负载下降时,我们开始重新计算所有项目的建议。 RAM和CPU的消耗开始减少,经过数小时,并且建议已准备就绪。 他们去了一个特殊的仓库,等到从那里带走。


为什么要吃 例如,发送一封信。 听起来不错。


或显示在网站上。 想象一下,您去了网站,选择了一部手机,并且窗口中有个人推荐,并为您提供...水壶! 为什么要烧水壶? 是的,因为您是一个月前购买微波炉的,并且该算法计算得出,那些购买微波炉的人经常需要水壶。


但是你需要一部手机! 怎么样


提出实时建议的时间到了。


从数学的角度来看,没有什么新鲜的东西:我们仅将模型训练的阶段和发布建议的阶段进行了划分。


我们仍然每天训练一次模型。


现在,我们可以在线发布建议。 只要有人在站点上执行某些操作(例如查看产品或将其添加到购物篮中),就会生成请求。 该请求指示谁做了什么,用什么产品。 推荐算法处理此请求,并作为响应为该客户端生成推荐列表。


为了实现这一点,我们需要:


  1. 创建一个存储库,在训练后将模型添加到该存储库中。
  2. 组织键值存储以存储客户端先前执行的操作,因为从数据库加载它们需要花费很长时间。
  3. 大大加快了我们的建议。 主要的加速点是使用nmslib来查找最近的邻居,从而为一个人选择最相关的产品。 微软的狡猾家伙提出了如何减少矩阵乘法的问题,并为寻找最近的邻居选择具有最高价值的元素顶部。
  4. 制作一个微服务,该微服务可跟踪人员在网站上的行为,发送建议请求,接受这些建议并将其显示给人员。

这台地狱机器赚了。 并迅速获得收入。 您一看手机,就会在一秒钟内重新计算出建议,并且已经向您推荐了手机,手机壳,眼镜等。
为了更加清楚快速,我们仅使用3个Intel Xeon 2.6 GHz CPU内核即可承受7000 rpm(每分钟的请求数)的负载。 在我们两个最大的客户的高峰活动中给出了此负载。


接下来是什么


从当前模型看来,我们压缩了所有可能的东西。


进一步的改进将需要重大的改变。


改进选项之一是将客户初步分成组。


人们的行为有所不同:有人经常一点一点地买东西,有人很少买东西,但是大量购买时,有人购买了昂贵的商品,有人购买了廉价的商品。 实际上,模型本身必须找到此类组并向他们推荐所需的组。


但是,例如,如果小组很小,可能会很困难。 例如,一小群法人实体。 或一群在女士商店里的男人。 由于妻子可以使用为丈夫发行的会员卡,因此不能总是由形式属性“性别”来确定,反之亦然。


如果先选择这些组,然后分别为它们中的每一个构建模型,则可以尝试帮助模型。


另一种更严肃的改进方法可能是考虑行动历史。


现在,我们仅考虑行动的规定,而这不允许我们识别行为模式。 例如,该模型无法理解,如果您先为孕妇买衣服,然后再购买尿布,那么该是推荐婴儿食品的时候了。


一般而言,我们认为,改进建议的工作几乎可以无限期地持续下去。 随着每个新客户的使用,出现了新的案例和新的改进假设。


因此,我们会不断改进,并会尝试写出我们在做什么。 不要说再见:)

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


All Articles