个人博客导航页(点击右侧链接即可打开个人博客):大牛带你入门技术栈

出门旅行,订酒店是必不可少的一个环节。住得干净、舒心对于每个出门在外的人来说都非常重要。

在线预订酒店让这件事更加方便。当用户在马蜂窝打开一家选中的酒店时,不同供应商提供的预订信息会形成一个聚合列表准确地展示给用户。这样做首先避免同样的信息多次展示给用户影响体验,更重要的是帮助用户进行全网酒店实时比价,快速找到性价比最高的供应商,完成消费决策。

酒店聚合能力的强弱,决定着用户预订酒店时可选价格的「厚度」,进而影响用户个性化、多元化的预订体验。为了使酒店聚合更加实时、准确、高效,现在马蜂窝酒店业务中近 80% 的聚合任务都是由机器自动完成。本文将详细阐述酒店聚合是什么,以及时下热门的机器学习技术在酒店聚合中是如何应用的。

Part.1 应用场景和挑战

1.酒店聚合的应用场景

马蜂窝酒旅平台接入了大量的供应商,不同供应商会提供很多相同的酒店,但对同一酒店的描述可能会存在差异,比如:

酒店聚合要做的,就是将这些来自不同供应商的酒店信息聚合在一起集中展示给用户,为用户提供一站式实时比价预订服务:

下图为马蜂窝对不同供应商的酒店进行聚合后的展示,不同供应商的报价一目了然,用户进行消费决策更加高效、便捷。

2.挑战

(1) 准确性

上文说过,不同供应商对于同一酒店的描述可能存在偏差。如果聚合出现错误,就会导致用户在 App 中看到的酒店不是实际想要预订的:

在上图中,用户在 App 中希望打开的是「精途酒店」,但系统可能为用户订到了供应商 E 提供的「精品酒店」,对于这类聚合错误的酒店我们称之为 「AB 店」。可以想象,当到店后却发现没有订单,这无疑会给用户体验造成灾难性的影响。

(2) 实时性

解决上述问题,最直接的方式就是全部采取人工聚合。人工聚合可以保证高准确率,在供应商和酒店数据量还不是那么大的时候是可行的。

但马蜂窝对接的是全网供应商的酒店资源。采用人工的方式聚合处理得会非常慢,一来会造成一些酒店资源没有聚合,无法为用户展示丰富的预订信息;二是如果价格出现波动,无法为用户及时提供当前报价。而且还会耗费大量的人力资源。

酒店聚合的重要性显而易见。但随着业务的发展,接入的酒店数据快速增长,越来越多的技术难点和挑战接踵而来。

Part.2 初期方案:余弦相似度算法

初期我们基于余弦相似度算法进行酒店聚合处理,以期降低人工成本,提高聚合效率。

通常情况下,有了名称、地址、坐标这些信息,我们就能对一家酒店进行唯一确定。当然,最容易想到的技术方案就是通过比对两家酒店的名称、地址、距离来判断是否相同。

基于以上分析,我们初版技术方案的聚合流程为:

  1. 输入待聚合酒店 A;

  2. ES 搜索与 A 酒店相距 5km 范围内相似度最高的 N 家线上酒店;

  3. N 家酒店与 A 酒店分别开始进行两两比对;

  4. 酒店两两计算整体名称余弦相似度、整体地址余弦相似度、距离;

  5. 通过人工制定相似度、距离的阈值来得出酒店是否相同的结论。

整体流程示意图如下:

「酒店聚合流程 V1」上线后,我们验证了这个方案是可行的。它最大的优点就是简单,技术实现、维护成本很低,同时机器也能自动处理部分酒店聚合任务,相比完全人工处理更加高效及时。

但也正是因为这个方案太简单了,问题也同样明显,我们来看下面的例子 (图中数据虚构,仅为方便举例):

相信我们每个人都可以很快判断出这是两家不同的酒店。但是当机器进行整体的相似度计算时,得到的数值并不低:

为了降低误差率,我们需要将相似度比对的阈值提升至一个较高的指标范围内,因此大量的相似酒店都不会自动聚合,仍需要人工处理。

最后,此版方案机器能自动处理的部分只占到约 30%,剩余 70% 仍需要人工处理;且机器自动聚合准确率约为 95%,也就是有 5% 的概率会产生 AB 店,用户到店无单,入住体验非常不好。

于是,伴随着机器学习的兴起,我们开始了将机器学习技术应用于酒店聚合中的探索之旅,来解决实时性和准确性这对矛盾。

Part.3 机器学习在酒店聚合中的应用

下面我将结合酒店聚合业务场景,分别从机器学习中的分词处理、特征构建、算法选择、模型训练迭代、模型效果来一一介绍。

3.1 分词处理

之前的方案通过比对「整体名称、地址」获取相似度,粒度太粗。

分词是指对酒店名称、地址等进行文本切割,将整体的字符串分为结构化的数据,目的是解决名称、地址整体比对粒度太粗的问题,同时也为后面构建特征向量做准备。

3.1.1 分词词典

在聊具体的名称、地址分词之前,我们先来聊一下分词词典的构建。现有分词技术一般都基于词典进行分词,词典是否丰富、准确,往往决定了分词结果的好坏。

在对酒店的名称分词时,我们需要使用到酒店品牌、酒店类型词典,如果纯靠人工维护的话,需要耗费大量的人力,且效率较低,很难维护出一套丰富的词典。

在这里我们使用统计的思想,采用机器+人工的方式来快速维护分词词典:

  1. 随机选取 100000+酒店,获取其名称数据;

  2. 对名称从后往前、从前往后依次逐级切割;

  3. 每一次切割获取切割词且切割词的出现频率+1;

  4. 出现频率较高的词,往往就是酒店品牌词或类型词。

上表中示意的是出现频率较高的词,得到这些词后再经过人工简单筛查,很快就能构建出酒店品牌、酒店类型的分词词典。

3.1.2 名称分词

想象一下人是如何比对两家酒店名称的?比如:

  • A:7 天酒店 (酒仙桥店)

  • B:如家酒店 (望京店)

首先,因为经验知识的存在,人会不自觉地进行「先分词后对比」的判断过程,即:

  • 7 天--->如家

  • 酒店--->酒店

  • 酒仙桥店--->望京店

所以要想对比准确,我们得按照人的思维进行分词。经过对大量酒店名称进行人工模拟分词,我们对酒店名称分为如下结构化字段:

着重说下「类型前 2 字」这个字段。假如我们需要对如下 2 家酒店名称进行分词:

  • 酒店 1:龙门南昆山碧桂园紫来龙庭温泉度假别墅

  • 酒店 2:龙门南昆山碧桂园瀚名居温泉度假别墅

分词效果如下:

我们看到分词后各个字段相似度都很高。但类型前 2 字分别为:

  • 酒店 1 类型前 2 字:龙庭

  • 酒店 2 类型前 2 字:名居

这种情况下此字段 (类型前 2 字) 具有极高的区分度,因此可以作为一个很高效的对比特征。

3.1.3 地址分词

同样,模拟人的思维进行地址分词,使之地址的比对粒度更细更具体。具体分词方式见下图:

下面是具体的分词效果展示如下:

小结

分词解决了对比粒度太粗的缺点,现在我们大约有了 20 个对比维度。但对比规则、阈值怎么确定呢?

人工制定规则、阈值存在很多缺点,比如:

  1. 规则多变。20 个对比维度进行组合会出现 N 个规则,人工不可能全部覆盖这些规则;

  2. 人工制定阈值容易受「经验主义」先导,容易出现误判。

所以,对比维度虽然丰富了,但规则制定的难度相对来说提升了 N 个数量级。机器学习的出现,正好可以弥补这个缺点。机器学习通过大量训练数据,从而学习到多变的规则,有效解决人基本无法完成的任务。

下面我们来详细看下特征构建以及机器学习的过程。

3.2 特征构建

我们花了很大的力气来模拟人的思维进行分词,其实也是为构建特征向量做准备。

特征构建的过程其实也是模拟人思维的一个过程,目的是针对分词的结构化数据进行两两比对,将比对结果数字化以构造特征向量,为机器学习做准备。

对于不同供应商,我们确定能拿到的数据主要包括酒店名称、地址、坐标经纬度,可能获得的数据还包括电话和邮箱。

经过一系列数据调研,最终确定可用的数据为名称、地址、电话,主要是:因为

  1. 部分供应商经纬度坐标系有问题,精准度不高,因此我们暂不使用,但待聚合酒店距离限制在 5km 范围内;

  2. 邮箱覆盖率较低,暂不使用。

要注意的是,名称、地址拓展对比维度主要基于其分词结果,但电话数据加入对比的话首先要进行电话数据格式的清洗。

最终确定的特征向量大致如下,因为相似度算法比较简单,这里不再赘述:

3.3 算法选择:决策树

判断酒店是否相同,很明显这是有监督的二分类问题,判断标准为:

  • 有人工标注的训练集、验证集、测试集;

  • 输入两家酒店,模型返回的结果只分为「相同」或「不同」两类情况。

经过对多个现有成熟算法的对比,我们最终选择了决策树,核心思想是根据在不同 Feature 上的划分,最终得到决策树。每一次划分都向减小信息熵的方向进行,从而做到每一次划分都减少一次不确定性。这里摘录一张图片,方便大家理解:

(图源:《机器学习西瓜书》)

3.3.1 Ada Boosting OR Gradient Boosting

具体的算法我们选择的是 Boosting。「三个臭皮匠,顶过诸葛亮」这句话是对 Boosting 很好的描述。Boosting 类似于专家会诊,一个人决策可能会有不确定性,可能会失误,但一群人最终决策产生的误差通常就会非常小。

Boosting 一般以树模型作为基础,其分类目前主要为 Ada Boosting、Gradient Boosting。Ada Boosting初次得出来一个模型,存在无法拟合的点,然后对无法拟合的点提高权重,依次得到多个模型。得出来的多个模型,在预测的时候进行投票选择。如下图所示:

Gradient Boosting 则是通过对前一个模型产生的错误由后一个模型去拟合,对于后一个模型产生的错误再由后面一个模型去拟合…然后依次叠加这些模型:

一般来说,Gradient Boosting 在工业界使用的更广泛,我们也以 Gradient Boosting 作为基础。

3.3.2  XGBoost OR LightGBM

XGBoost、LightGBM 都是 Gradient Boosting 的一种高效系统实现。

我们分别从内存占用、准确率、训练耗时方面进行了对比,LightGBM 内存占用降低了很多,准确率方面两者基本一致,但训练耗时却也降低了很多。

内存占用对比:

准确率对比:

训练耗时对比:

(图源:微软亚洲研究院)

基于以上对比数据参考,为了模型快速迭代训练,我们最终选择了 LightGBM。

3.4 模型训练迭代

由于使用 LightGBM,训练耗时大大缩小,所以我们可以进行快速的迭代。

模型训练主要关注两方面内容:

  • 训练结果分析

  • 模型超参调节

3.4.1 训练结果分析

训练结果可能一开始差强人意,没有达到理想的效果,这时需要我们仔细分析什么原因导致的这个结果,是特征向量的问题?还是相似度计算的问题?还是算法的问题?具体原因具体分析,但总归会慢慢达到理想的结果。

3.4.2 模型超参调节

这里主要介绍一些超参数调节的经验。首先大致说一下比较重要的参数:

(1) maxdepth 与 numleaves

maxdepth 与 numleaves 是提高精度以及防止过拟合的重要参数:

  • maxdepth : 顾名思义为「树的深度」,过大可能导致过拟合

  • numleaves 一棵树的叶子数。LightGBM 使用的是 leaf-wise 算法,此参数是控制树模型复杂度的主要参数

(2) feature_fraction 与 bagging_fraction

feature_fraction 与 bagging_fraction 可以防止过拟合以及提高训练速度:

  • feature_fraction :随机选择部分特征 (0<feature_fraction <1)

  • bagging_fraction 随机选择部分数据 (0<bagging_fraction<1)

(3)  lambda_l1 与 lambda_l2

lambda_l1 与  lambda_l2  都是正则化项,可以有效防止过拟合。

  • lambda_l1 :L1 正则化项

  • lambda_l2 :L2 正则化项

3.5 模型效果

经过多轮迭代、优化、验证,目前我们的酒店聚合模型已趋于稳定。

对方案效果的评估通常是凭借「准确率」与「召回率」两个指标。但酒店聚合业务场景下,需要首先保证绝对高的准确率(聚合错误产生 AB 店影响用户入住),然后才是较高的召回率。

经过多轮验证,目前模型的准确率可以达到 99.92% 以上,召回率也达到了 85.62% 以上:

可以看到准确率已经达到一个比较高的水准。但为保险起见,聚合完成后我们还会根据酒店名称、地址、坐标、设施、类型等不同维度建立一套二次校验的规则;同时对于部分当天预订当天入住的订单,我们还会介入人工进行实时的校验,来进一步控制 AB 店出现的风险。

3.6 方案总结

整体方案介绍完后,我们将基于机器学习的酒店聚合流程大致示意为下图:

经过上面的探索,我们大致理解了:

  1. 解决方案都是一个慢慢演进的过程,当发现满足不了需求的时候就会进行迭代;

  2. 分词解决了对比粒度太粗的缺点,模拟人的思维进行断句分词;

  3. 机器学习可以得到复杂的规则,通过大量训练数据解决人无法完成的任务。

Part 4 写在最后

新技术的探索充满挑战也很有意义。未来我们会进一步迭代优化,高效完成酒店的聚合,保证信息的准确性和及时性,提升用户的预订体验,比如:

  1. 进行不同供应商国内酒店资源的坐标系统一。坐标对于酒店聚合是很重要的 Feature,相信坐标系统一后,酒店聚合的准确率、召回率会进一步提高。

  2. 打通风控与聚合的闭环。风控与聚合建立实时双向数据通道,从而进一步提高两个服务的基础能力。

上述主要讲的是国内酒店聚合的演进方案,对于「国外酒店」数据的机器聚合,方法其实又很不同,比如国外酒店名称、地址如何分词,词形还原与词干提取怎么做等,我们在这方面有相应的探索和实战,总体效果甚至优于国内酒店的聚合,后续我们也会通过文章和大家分享,希望感兴趣的同学持续关注。

附Java/C/C++/机器学习/算法与数据结构/前端/安卓/Python/程序员必读/书籍书单大全:

(点击右侧 即可打开个人博客内有干货):技术干货小栈
=====>>①【Java大牛带你入门到进阶之路】<<====
=====>>②【算法数据结构+acm大牛带你入门到进阶之路】<<===
=====>>③【数据库大牛带你入门到进阶之路】<<=====
=====>>④【Web前端大牛带你入门到进阶之路】<<====
=====>>⑤【机器学习和python大牛带你入门到进阶之路】<<====
=====>>⑥【架构师大牛带你入门到进阶之路】<<=====
=====>>⑦【C++大牛带你入门到进阶之路】<<====
=====>>⑧【ios大牛带你入门到进阶之路】<<====
=====>>⑨【Web安全大牛带你入门到进阶之路】<<=====
=====>>⑩【Linux和操作系统大牛带你入门到进阶之路】<<=====

天下没有不劳而获的果实,望各位年轻的朋友,想学技术的朋友,在决心扎入技术道路的路上披荆斩棘,把书弄懂了,再去敲代码,把原理弄懂了,再去实践,将会带给你的人生,你的工作,你的未来一个美梦。

一文让你马上了解机器学习在马蜂窝酒店聚合中的应用初探相关推荐

  1. 机器学习在马蜂窝酒店聚合中的应用初探

    出门旅行,订酒店是必不可少的一个环节.住得干净.舒心对于每个出门在外的人来说都非常重要. 在线预订酒店让这件事更加方便.当用户在马蜂窝打开一家选中的酒店时,不同供应商提供的预订信息会形成一个聚合列表准 ...

  2. 一文读懂:快速入门机器学习,基础向

    [提前声明] 文章由作者:张耀峰 结合自己生产中的使用经验整理,最终形成简单易懂的文章 写作不易,转载请注明,谢谢! 代码案例地址: ?https://github.com/Mydreamandrea ...

  3. DeepLearning tutorial(2)机器学习算法在训练过程中保存参数

    FROM: http://blog.csdn.net/u012162613/article/details/43169019 DeepLearning tutorial(2)机器学习算法在训练过程中保 ...

  4. Dataset:数据集集合(综合性)——机器学习、深度学习算法中常用数据集大集合(建议收藏,持续更新)

    Dataset:数据集集合(综合性)--机器学习.深度学习算法中常用数据集大集合(建议收藏,持续更新) 目录 常规数据集 各大方向分类数据集汇总 具体数据集分类 相关文章 DL:关于深度学习常用数据集 ...

  5. 机器学习将在游戏开发中的6种应用

    机器学习正在改变几乎每个行业,从农业中的作物规划到医疗保健中的癌症诊断.这些主题通常会得到更广泛的讨论,因为它们已经产生了切实的,对人类有益的影响.对于游戏行业而言,不幸的是,游戏开发中的机器学习仍处 ...

  6. sql机器学习服务_机器学习服务–在SQL Server中配置R服务

    sql机器学习服务 The R language is one of the most popular languages for data science, machine learning ser ...

  7. 机器学习在植物病害识别研究中的应用

    机器学习在植物病害识别研究中的应用 1.文章思路 阐述传统机器学习方法到深度学习的模式分类技术变迁,重点提出深度学习在植物病害识别中的应用优势:然后,调研机器学习在植物病害应用的相关研究文献,对文献所 ...

  8. 毛远丽教授谈机器学习技术在检验医学中的新应用|专家论坛

    机器学习(Machine Learning, ML)是一门多领域交叉学科技术,通过算法使得机器从大量数据中学习和发现规律,从而对新的样本或数据进行分析和研究的方法.从1949年的赫布理论诞生,机器学习 ...

  9. 机器学习在无线信道建模中的应用现状与展望

    [摘  要]为了适应未来6G通信系统的超宽频谱.超大规模天线阵列.高度异构化以及众多新型应用场景,信道建模成为新系统开发必不可少的技术基础.由于6G通信系统将具有典型的大数据特征,基于机器学习的数据驱 ...

最新文章

  1. mac下,svn配置
  2. 第六代微型计算机是,AMD Carrizo第六代A系列处理器技术解析
  3. java16位字符串压缩成8位_在8位UART上发送16位值
  4. <马哲>劳动价值论的理论及实践意义
  5. OpenViDial:一个大规模多模态对话数据集
  6. cocos2d-x jni相关目录分析
  7. POJ3678-Katu Puzzle【2-SAT】
  8. Linux学习之基本介绍
  9. 引入外部机构需要注意的事项_如何与外部营销机构合作
  10. ubuntu18.04 server配置静态ip
  11. ffmpeg实现mp4文件转h264文件
  12. 乱得那么认真|阿里小二办公桌上的秘密~内部流出
  13. jsp游戏补丁共享网站设计
  14. 北方大学 ACM 多校训练赛 第四场 题解
  15. 《开源软件开发导论》作业1
  16. MINIO-Bucket数据迁移方案
  17. 使用代码操作Excel文件(easyExcel)
  18. WPF和Silverlight到底有什麼不同?
  19. D3.js 制作中国地图 .net 公共基础类
  20. android 4.3以上修改DNS 及 流程(netd)

热门文章

  1. 图文实战linux常见命令
  2. [04][02][02] SPI 机制
  3. 【DSP】【第四篇】如何生成bin和dat文件
  4. C#简单粗暴的飞行棋
  5. Navicat for Mysql数据库实操
  6. JS中Class类的静态属性和静态方法
  7. 终于把傅雷的《世界美术名作二十讲》看完了
  8. 显卡驱动对应的cuda版本
  9. 班章管家讲解固收理财有危险吗?固收理财有什么危险?
  10. java+bizx文件_14.Teambiz后台开发规范