NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

XGBoost 在携程搜索排序中的应用

  • 2019-12-27
  • 本文字数:3285 字

    阅读完需:约 11 分钟

XGBoost在携程搜索排序中的应用

一、前言

在互联网高速发展的今天,越来越复杂的特征被应用到搜索中,对于检索模型的排序,基本的业务规则排序或者人工调参的方式已经不能满足需求了,此时由于大数据的加持,机器学习、深度学习成为了一项可以选择的方式。


携程主站搜索作为主要的流量入口之一,是用户浏览信息的重要方式。用户搜索方式多样、对接业务多样给携程主站搜索(下文简称大搜)带来了许多挑战,如:


  • 搜索方式多样化

  • 场景多样化

  • 业务多样化

  • 意图多样化

  • 用户多样化


为了更好满足搜索的多样化,大搜团队对传统机器学习和深度学习方向进行探索。


说起机器学习和深度学习,是个很大的话题,今天我们只来一起聊聊传统机器学习中 XGBoost 在大搜中的排序实践。

二、XGBoost 探索与实践

聊起搜索排序,那肯定离不开 L2R。Learning to Rank,简称(L2R),是一个监督学习的过程,需要提前做特征选取、训练数据的获取然后再做模型训练。


L2R 可以分为:


  • PointWise

  • PairWise

  • ListWise


PointWise 方法只考虑给定查询下单个文档的绝对相关度,不考虑其他文档和给定查询的相关度。


PairWise 方法考虑给定查询下两个文档直接的相对相关度。比如给定查询 query 的一个真实文档序列,我们只需要考虑任意两个相关度不同的文档直接的相对相关度。相比 PointWise,PairWise 方法通过考虑任意两个文档直接的相关度进行排序,有一定的优势。


ListWise 直接考虑给定查询下的文档集合的整体序列,直接优化模型输出的文档序列,使得尽可能接近真实文档序列。


下面先简单介绍 XGBoost 的应用流程:



XGBoost 是一个优化的分布式梯度增强库,增强树模型,灵活便捷。但对高维度的稀疏矩阵支持不是很好,另外调参确实有点麻烦。

三、特征工程实践

在传统机器学习下,特征工程显的尤为重要,不论后续模型工程做的多好,如果前期的特征工程没有做好,那么训练的结果不会有多好。所以对特征处理的总体逻辑如下:


3.1 前期数据准备

首先,我们需要进行需求分析,就是在什么场景下排序。假设我们需要针对搜索召回的 POI 场景进行排序,那么需要确定几件事情:


  • 数据来源:搜索的数据就是各种 POI,然后需要确定我们有哪些数据可以用来排序,比如最近半年的搜索 POI 的曝光点击数据等;

  • 特征梳理:需要梳理影响 POI 排序的因子,例如查询相关特征、POI 相关特征、用户相关特征等;

  • 标注规则制定:每次搜索召回的每个 POI,会有曝光和点击数据,简单点,比如:我们可以将曝光位置作为默认标注分,当有点击,就将标注分在原来的基础上加一;

  • 数据埋点/数据抽取:这是两种方式,可以根据实际需求进行选择;

  • 数据埋点:可以在线上实时生成特征,然后进行日志埋点,离线分析的时候可以直接从日志中拉取即可,这种方式,需要提前进行埋点。

  • 数据抽取:可以通过大数据平台拉取历史数据,然后进行离线计算抽取所需特征,这种方式虽然慢点,但是可以拉取历史数据进行分析。

3.2 特征处理

前期的数据准备工作完成了,接下来可以开始看看数据质量了。


  • 查看缺失值:绝大多数情况下,我们都需要对缺失值进行处理;

  • 特征归一化处理:监督学习对特征的尺度非常敏感,因此,需要对特征归一化用来促进模型更好的收敛;

  • 噪声点处理:异常的数据会影响模型预测的正确性;

  • 特征连续值分析:分析特征的值分布范围是否均匀;

  • 特征之间的相关性分析;



通过连续值特征可以分析每个特征值的大致分布范围,有利于对相关特征进行数据补充或者重新筛选。



通过特征相关性的分析,如上我们看到几个特征之间有很高的相关性,那么可以帮助我们做特征组合或者特征筛选等等方面决策。

四、模型工程实践

4.1 评估指标制定

在搜索业务中,考虑的有以下两种情况:


  • 看重用户搜索的成功率,即有没有点击;

  • 看重页面第一屏的曝光点击率;


在文章开头提到的 L2R 的三种分类中,我们在 XGBoost 参数 objective 配置“rank:pairwise”,同时使用搜索系统常用的评估指标 NDCG (Normalized Discounted Cumulative Gain) 。


def _to_list(x):    if isinstance(x, list):        return x    return [x]
def ndcg(y_true, y_pred, k=20, rel_threshold=0): if k <= 0: return 0 y_true = _to_list(np.squeeze(y_true).tolist()) y_pred = _to_list(np.squeeze(y_pred).tolist()) c = list(zip(y_true, y_pred)) random.shuffle(c) c_g = sorted(c, key=lambda x: x[0], reverse=True) c_p = sorted(c, key=lambda x: x[1], reverse=True) idcg = 0 ndcg = 0 for i, (g, p) in enumerate(c_g): if i >= k: break if g > rel_threshold: idcg += (math.pow(2, g) - 1) / math.log(2 + i) for i, (g, p) in enumerate(c_p): if i >= k: break if g > rel_threshold: ndcg += (math.pow(2, g) - 1) / math.log(2 + i) if idcg == 0: return 0 else: return ndcg / idcg
复制代码

4.2 初始模型训练

前期通过基础的模型训练,可以初步得出一些初始参数和相关特征的重要度等相关信息。


train_dmatrix = DMatrix(x_train, y_train)valid_dmatrix = DMatrix(x_valid, y_valid)test_dmatrix = DMatrix(x_test)
train_dmatrix.set_group(group_train)valid_dmatrix.set_group(group_valid)test_dmatrix.set_group(group_test)
params = {'objective': 'rank:pairwise', 'eta': 0.5, 'gamma': 1.0, 'min_child_weight': 0.5, 'max_depth': 8,'eval_metric':'ndcg@10-','nthread':16}xgb_model = xgb.train(params, train_dmatrix, num_boost_round=1000, evals=[(valid_dmatrix, 'validation')])
复制代码



import pandas as pd print('特征名称', '特征权重值')feature_score = xgb_model.get_fscore()pd.Series(feature_score).sort_values(ascending=False)
复制代码


4.3 模型调优五部曲

通过上述基础的模型训练,我们可以得出相关的初始参数,进入到五部曲环节,XGBoost 参数调节基本为五个环节:


  • Step 1:选择一组初始参数;

  • Step 2:改变 max_depth 和 min_child_weight;

  • Step 3:调节 gamma 降低模型过拟合风险;

  • Step 4:调节 subsample 和 colsample_bytree 改变数据采样策略;

  • Step 5:调节学习率 eta;


例如我们在通过 step1,可以观察弱分类数目的大致范围,看看模型是过拟合还是欠拟合。



通过 step2 调整树的深度和节点权重,这些参数对 XGBoost 性能影响最大,我们简要概述他们:


  • max_depth:树的最大深度。增加这个值会使模型更加复杂,也容易出现过拟合,深度 3-10 是合理的;

  • min_child_weight:正则化参数。如果树分区中的实例权重小于定义的总和,则停止树构建过程。


可以通过网格搜索发现最佳结果,当然也可以通过其他方式。



我们看到,从网格搜索的结果,分数的提高主要是基于 max_depth 增加。min_child_weight 稍有影响的成绩,但是 min_child_weight = 6 会更好一些。

4.4 模型离线评估

通过调优五部曲,训练,生成最终的模型之后,就要进入离线评估阶段。离线拉取线上生产用户的请求,模拟生产,对模型预测的结果进行检验,根据在之前评估指标制定环节所提到的用户点击率和第一屏曝光点击率,比对线上用户点击产品的位置和模型预测的位置,同时对比两者之间的第一屏曝光点击率。

4.5 模型预测

通过 AB 实验,对模型进行线上预测,实时监测效果评估,方便之后的迭代和优化。

五、总结与展望

  • 对于传统的机器学习,最重要的一步是要做好需求分析,评估这种算法是否能有效解决该问题,否则得不偿失;

  • 前期的特征工程非常关键。通过多次的摸索发现,特征没有选取好,或者数据覆盖不全,标注没做好,导致后续模型不论怎么调优,都无法达到预定的效果;

  • 选定目标后,可以先尝试一些优秀的开源工具、优秀的数据分析工具。直观的图表能帮助你做更好的决策,优秀的算法库,能避免重复造轮子;

  • 单一的算法无法满足搜索排序应用场景,多模型融合以及深度学习方向需要做更深入的探索与实践;


作者介绍


曹城,携程搜索部门高级研发工程师,主要负责携程搜索的个性化推荐和搜索排序等工作。


本文转载自公众号携程技术(ID:ctriptech)。


原文链接


https://mp.weixin.qq.com/s/X4K6UFZPxL05v2uolId7Lw


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2019-12-27 14:002732

评论

发布
暂无评论
发现更多内容

华云大咖说 | 华云数据助力高校建设实训室平台

华云数据

千亿级数据迁移mongodb成本节省及性能优化实践

杨亚洲(专注MongoDB及高性能中间件)

MySQL 数据库 mongodb 架构 分布式数据库mongodb

个推“D-M-P”三步走, 打造每日治数平台,助力行业数字化升级

个推

大数据 数据中台 数据治理 数据智能

高并发存储优化篇:诸多策略,缓存为王

Coder的技术之路

缓存 缓存击穿 缓存雪崩 缓存架构

Spring 实例化方式有几种?为什么会用到 Cglib?

小傅哥

Java spring 小傅哥 cglib 手写框架

🔎【Java 源码探索】深入浅出的分析Mutex底层源码

洛神灬殇

Java JVM mutex Condition 5月日更

知乎的一次29.7元的咨询

why技术

Java 程序员

QCon 演讲实录 | 大型软件团队的数字化项目管理实践

万事ONES

研发管理 团队协作 数字化 ONES Qcon

六一特辑丨8岁小程序员献礼儿童节:我DIY了聊天机器人,做3D printer,还想和外星人对话!

华为云开发者联盟

编程 程序员 开发者 代码 机器人

带你看懂MySQL执行计划

Simon

MySQL 执行计划

并发王者课-青铜8:分工协作-从本质认知线程的状态和动作方法

MetaThoughts

Java 多线程 并发 并发王者课

Java程序员简历这么写,还过不了筛选算我输!

Java架构师迁哥

和12岁小同志搞创客开发:如何选择合适的传感器?

不脱发的程序猿

DIY 传感器 创客开发 如何选择合适的传感器?

阿里面试题:MySQL 磁盘满了,怎么办?

Java架构师迁哥

SphereEx 获数百万美元天使融资,接力 ShardingSphere 开启 Database Plus 新篇章

SphereEx

.Net Core Configuration Etcd数据源

yi念之间

etcd .net core

如何优化你的HTTPS?

运维研习社

https HTTP2.0 5月日更

重庆区块链公共服务平台—“渝快链”2.0正式发布

浪潮云

带你读论文丨异常检测算法及发展趋势分析

华为云开发者联盟

深度学习 异常检测算法 深度异常检测算法 深度半监督 群体异常检测

JWT(auth0):RS256非对称加密算法实现Token的签发、验证

西门阿杰

Java Token RS256

震惊,PostGIS还可以这样用!!!

华为云开发者联盟

数据库 分布式 GaussDB 地理数据库 PostGIS

Geek 青年说北京沙龙分享

看山

Geek青年说

怎样节省 2/3 的 GPU?爱奇艺 vGPU 的探索与实践

爱奇艺技术产品团队

深度学习 gpu

非官方不权威Java面试宝典

北游学Java

Java 面试

鸿蒙操作系统发布在即 万物互联时代将给开发者带来更多机遇

科技汇

6月日更,优质更文,“定制”来袭~

InfoQ写作社区官方

6月日更 热门活动

日常Bug排查-系统失去响应-Redis使用不当

无毁的湖光

Java redis

长连接网关技术专题(五):喜马拉雅自研亿级API网关技术实践

JackJiang

Netty nio 网关

OpenResty入门

捉虫大师

nginx openresty

react源码解析1.开篇介绍和面试题

全栈潇晨

React React Hooks react源码

开发人员应该害怕低代码吗?

禅道项目管理

程序员 低代码 开发 低代码平台

XGBoost在携程搜索排序中的应用_大数据_曹城_InfoQ精选文章