作者:Eric He
编译:ronghuaiyang
导读
这是第一部分,Rocketmiles的搜索结果排名系列。
一个模型生成的排名的例子。谁知道某些赌场比其他赌场更受欢迎呢?
网上有很多文章讨论如何编写机器学习模型,但很少讨论数据科学家如何处理业务目标并将结果传达给管理层。本文试图通过介绍Rocketmiles酒店排名算法的商业方面来填补这一空白,也就是说,我们如何修改一个标准的排名模型来最大化业务价值,我们用来快速评估A/B测试性能的自定义指标,以及允许管理层解释所谓的“黑箱”模型的工具。
排序是在排在分类和回归问题之后的,所以并没有很多资源深入介绍电子商务公司如何实现智能排序的解决方案。通过分享我们的经验,我们希望能够帮助其他人在排序过程中做出更明智的决定。
我们把这篇文章分成三个部分:
- 排序模型应该考虑哪些因素才能最好地增加价值?
- 我们可以使用什么业务度量来评估模型性能?
- 我们如何确保模型符合常识?
让我们开始吧。
排序模型应该考虑哪些因素才能最好地增加价值?
要确定新解决方案的附加价值,了解前一个解决方案的缺点是很重要的。在我们转向机器学习模型之前,Rocket使用了一个基于分数的系统来对酒店进行排名,下面是一个通用的例子。
基于分数的排序系统
然后,我们将酒店按得分降序排序,得分最高的酒店将排在最前面。基于得分的方法是直观的,许多电子商务公司以前也采用过这种格式。例如,在AirBnB的搜索论文(https://arxiv.org/abs/1810.09591)的第二段:
搜索排名的第一个实现是一个人工设置的评分函数
然而,这种解决方案存在一些结构性的缺陷。
- 不灵活。所有的产品都需要权衡,酒店房间也不例外。有的太小,有的太大,有些太便宜,有些太贵。尽管Goldilocks区域(价格刚刚合适)的概念是适用的,但一个纯粹的线性评分函数无法复现这个概念,根据这个模型,价格越高要么是更好要么是更差。此外,函数的线性性使得从4.0星到5.0星的收益与从1.0星到2.0星的收益相同,因此没有任何收益递减的概念。
- 没有个性化。对于在新加坡过夜的背包客来说,胶囊旅馆或许是可以接受的,但对于在马耳他的新婚夫妇来说,就没那么诱人了。
胶囊旅馆会成为蜜月旅行的新选择吗?酒店:东京银座湾
- 权重太随意。这并不是对我们产品所有者的打击,因为他们的商业意识比我的要高几个数量级,但人类的判断根本不够精确,无法解决如此复杂、多方面的问题的最优权重。
- 没有考虑多样性。外观相同的两家酒店得分相同,排名也很接近。但是没有用户想要连续滚动得到60个Motel 6酒店。
更复杂的特征工程和权值调整可以解决这些问题。例如,我们可以将酒店价格与平均酒店价格之间的绝对距离做为一个特征,或者使用一个布尔标志来表示用户是否是商务旅行者。但是如果我们想要做这些调整,那么使用机器为我们做这些实际上是更简单的选择。让我们考虑一下机器学习方法的前景,看看它们能提供什么。
一般来说,有两种常用的机器学习方法来进行排序:
- 信息检索:来源于谷歌和Yahoo等搜索引擎,其目标是返回最合适的查询结果。
- 推荐系统:源自Netflix和亚马逊(Amazon)等产品推荐系统,其目标是推荐最符合用户潜在偏好的产品。
虽然这两种方法的主要模型在结构上可能有很大的不同,但是它们具有相同的核心原则,即通过关联进行匹配。在信息检索中,查询需要相关的结果,在推荐系统中,用户需要相关的物品。
相关性评分有两个问题:
- 没有多样性。像打分法一样,相似的结果有相似的分数,并且会被排列得很接近。但是一个愉快的酒店预订体验应该提供大量有吸引力的选择,查询结果应该可以从小旅馆到小屋都有。此外,一个聪明的排序系统应该两面下注,以防自己对用户的看法不正确。
- 不考虑价值。在我们决定如何排序时,我们必须考虑两件事:酒店对用户的相关性如何,以及对我们业务的影响如何。这对Rocket来说是一个显著的区别,因为用户购买不同酒店房间的时候价值的差异很大。
为了解决这些缺点,我们做了一个简单的修改。假定一个用户选了一个酒店,这个酒店的相关分数被处理成代表被选中酒店的价值。例如,如果凯悦酒店的预测为2%,这意味着用户从列表中订购了一家酒店,那么订购的酒店是凯悦酒店的概率为2%。
然后,我们用一个盈利能力的度量来乘以这个概率,这样的话我们现在就可以根据“盈利能力的期望”对酒店进行排名。这样做有一个很好的作用,那就是改变结果,使其更加多样化,因为类似的酒店可能不会给我们带来类似的利润率。
如果盈利能力和相关性之间没有很强的关联,那么仅仅将相关性乘以盈利能力就可以产生多样性。
什么是盈利能力的衡量标准?
—现在是你,前一段时间是我们的CFO
你可能注意到我们的盈利能力的度量指标是利润除以收入的平方根。这是一个奇怪的选择,因为既然我们要考虑最大化盈利能力,我们乘以利润。
原始的盈利能力需要重新调整的问题在于,它往往会将最贵的酒店推到最顶端,即使它们与用户没有什么特别的关系。这些酒店有很高的盈利能力只是因为贵,即使是差了百分之一,我们可能一块钱只赚几分钱。这个问题是原始的盈利能力高,而利润率低。如果我们有一个很好的方法将这两种盈利能力的概念结合到我们的计算中,会怎么样呢?事实上,我们就是这么做的!
当在销售中亏损时,这个等式就不成立了
上面的方程表明,利润除以收入的平方根就是利润和利润率的几何平均值。因此,我们不是乘以利润或利润率,而是乘以中间的某个数。
在实践中,这种盈利能力的衡量标准在高端豪华酒店和极其廉价的客栈和汽车旅馆之间取得了平衡,因为后者往往会将更高的利润率传递给分销商,以确保预订。
使用一个名为weighted Kendall 's Tau的排名相关度量,我们可以度量搜索请求的排名相对于每个排序系统的变化程度。
上面显示的柱状图显示了排序系统对测试集搜索请求与原始盈利能力、基于分数的排序系统和原始模型分数的相关性。我们可以看到,在考虑了盈利能力之后,我们的排名与直接使用原始盈利能力的排序系统有很大的不同。相比之下,模型评分更接近利润重新排序的大多数搜索请求排名。因此,在多个方面,这种盈利能力指标对排序系统进行了平衡:
- 用户相关性和公司盈利能力之间的平衡
- 利润与利润率之间的平衡
- 平衡高端和低端酒店
- 打破类似酒店的长链
有趣的是,我们没有看到任何论文讨论这种通过对利润率进行预估的方法进行重排序的方法,我们认为这样很明智。
这是另一个明智的想法,但这一次对管理层来说还不够明智:或许我们可以选择排名最高的滨海湾金沙(Marina Bay Sands)
我们可以使用什么业务度量来评估模型性能?启发式:基准酒店的平均排名
现在我们有一个不错的排名框架,经过一些离线测试,坐在我们的象牙塔里面,我们得到了一些数字(称为 “normalized discounted cumulative gain scores”),这些数字说我们的搜索结果排名模型是不错的。然而,一个精明的数据科学家可能希望在将模型投入市场之前,有一个更像样的度量标准供管理层查看。
要说明一种排序结果要比另一种排序结果更好是非常困难的。再撞了几次南墙之后,我就这个问题咨询了一个朋友。
“哦,那很容易,”她说。
等等,什么?
“只要搜索一下新加坡,就能看到滨海湾金沙酒店在这个国家的排名。如果不是前三,这就是垃圾。”
事实证明,在每一个测试集搜索请求中,模型都将滨海湾金沙排在第一位或第二位(在数百个测试请求中)。我不会谈论打分系统在滨海湾金沙赌场的排名,但从那一刻起,我对机器学习方法的信念是不可动摇的。
不过,还有一些不那么主观的度量标准。当我们第一次现场部署模型,我们设计了一个在一天内可以收敛的度量,叫做median positive percentile rank(MPPR)。MPPR不仅是一个好的交流排序系统对业务的影响的方式,它还帮助我们揭开了部署后的bug。
主要的度量:median positive percentile rank
每一列都是一个搜索请求。灰色单元格表示搜索结果,白色表示缺失。橙色单元格是购买的搜索结果。在这个例子中,median positive percentile rank是37.5%,用蓝色阴影表示。
让我们一步一步来看看median positive percentile rank。
- rank。这里没什么好说的。如果说滨海湾金沙(Marina Bay Sands)是最好的,那也只能排第一。
- percentile rank。你用排名除以排名中酒店的总数。如果滨海湾金沙是50家酒店中的第一家,它的排名百分位是1/50,即2%。
- positive percentile rank。对于导致购买的搜索请求,正百分位排名是所购买酒店的百分位排名。
- median positive percentile rank。正排名百分位的中位数是所有预订搜索请求的中位数。
如果MPPR是37.5%,这意味着有一半的时间,用户只需要看到前37.5%的结果就可以找到他们想买的东西。如果一个排序系统的MPPR低于另一个,那么该排序系统提供了更好的购物体验,因为用户可以在更短的浏览时间内,找到想要的商品。
只需一天就可以很好地了解MPPR的相关性能。
上面的图是我们A/B测试期间模型在基础上的每日MPPR值。我们可以看到模型的MPPR大约是基于打分的评分系统的一半,这意味着用户在找到他们的产品之前只需浏览一半的内容。与MPPR一起,我们监控更一般的A/B测试指标,特别是,我们想要确保我们看到“转化率”的增加,即客户在访问网站时进行预订的概率。而且确实也增加了!
当我在公司内部演示中花时间注释这张图片时,我意识到就在几个月前,我和家人一起去了Grand Fiesta Americana Coral海滩,在这个例子中排名第二。我的模型似乎认为我父母很有品味。
我们如何确保模型符合常识?
如果在这一点上,我们相信这个机器学习模型知道它在做什么,那么我们可能想要了解一点它对一个好酒店的定义。我们很幸运,因为有SHAP值(不了解SHAP值的话可以看看:https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions.pdf),我们可以询问我们的模型的每一个选择。
让我们从 Grand Fiesta Americana Coral Beach开始,它有非常高的排名。上面是SHAP值的图,它将模型的得分分解为模型中的各个特征的贡献(“SHAP值”)。红色特征使得分与对应条的大小成比例增加,表明模型认为这个特征值使结果更相关。相反,蓝色特征会降低得分,意味着模型认为它们降低了结果的相关性。
我们可以看到,最大的红色条对应于hotel_cumulative_share = 0.029。我们的模型喜欢这个酒店,因为这意味着Grand Fiesta占据了我们预订的3%,这个比例非常高。模型喜欢它的其他原因包括相对较高的评论数量,以及提供给用户的奖励量。
与此同时,推动分数下降的最大的蓝色条是user_preferred_price。此特征是对用户偏好的标准化价格水平的估计,由于该用户相对低端,酒店的相关性得分略有下降。
另一方面,模型不喜欢上面的酒店,把它放在列表的底部。尽管是一家五星级酒店,与Quintana Roo的其他所有度假胜地共享同一海滩,但这家酒店的分享数、评论数量和高标准化价格(srq_price_zscore)使它变得没有吸引力。
对模型的单个结果进行研究是有趣的,但是聚合视图可以让我们很好地查看模型给出的趋势。下面的摘要图按重要性降序列出了几个最重要的特征。每个点都是一个结果,它在x轴上的位置代表特征的SHAP值,颜色代表特征的相对大小,红色代表高,蓝色代表低。
迄今为止,历史记录是Rocket的酒店排名算法最重要的标准
我们可以看到,最重要的特征是hotel_cumulative_share,在右侧有一个红色的大条,表示分享的多的酒店是好的。接下来是previous_user_hotel_interaction,这是一个标记,表示用户以前是否曾经浏览过该酒店。虽然这个标志通常设置为0表示没有交互,但是当它不是0时,它的影响是巨大的。与股票或评论计数不同,较低的相对价格几乎总是被认为是更好的。一般来说,具有良好历史业绩的酒店,离用户申报的目的地较近的酒店(如果有的话),以及相对便宜的酒店,都在模型中排名较高。
我想扩展最后一点,因为之前我说过,一个好的机器学习模型应该能够为不同的用户找到一个合适的价格区间。虽然该模型认为相对便宜的酒店更好,但它强调,这是不正确的,有时根本不符合用户显示出对高端酒店的偏好。
该模型为低端用户提供廉价酒店,为高端用户提供高价酒店。
上面是一个部分依赖图,显示了x轴user_preferred_price上用户的价格水平和酒店的价格srq_price_zscore之间的交互。一条长长的红色线条大致沿着y-x线,这说明昂贵的酒店对于低端用户具有负 SHAP值,与低端用户的相关性较小,对于高端用户具有正 SHAP值,与高端用户的相关性更大。相反,垂直的蓝色条纹表明,该模型能够调整其对低端用户的期望。在不需要任何人工输入的情况下,该模型能够根据用户指定的价格水平将其与酒店进行匹配。
所以,对于那些来这里寻找关于酒店质量的洞察的人来说,请记住以下这些至理名言:
1、流行的酒店更好一些
2、距离目的地的酒店更好
3、低端用户喜欢廉价酒店
4、高端用户喜欢高价酒店
这几条基本不会引起争论。
前瞻:模型设计
到目前为止,你已经了解了用户相关性和公司盈利能力的模型,你知道对于用户的需求,模型是灵活的,然而,模型本身仍然是一个黑盒子。在Rocket Travel酒店排名系列的下一篇中,我们将解释为什么我们更喜欢一种名为LambdaMART的信息检索模型,而不是用于排名的标准推荐系统模型。
英文原文:https://medium.com/rocket-travel/measuring-the-business-value-of-a-hotel-ranking-model-c4396531b26e