用xgboost做排序任务——xgboost下的learning2rank

以下是xgboost中关于rank任务的文档的说明:

XGBoost支持完成排序任务。在排序场景下,数据通常是分组的,我们需要分组信息文件来指定排序任务。XGBoost中用来排序的模型是LambdaRank,此功能尚未完成。目前,我们提供pairwise rank.

XGBoost supports accomplishing ranking tasks. In ranking scenario, data are often grouped and we need the group information file to specify ranking tasks. The model used in XGBoost for ranking is the LambdaRank, this function is not yet completed. Currently, we provide pairwise rank.

首先,从dmlc上将xgboost的库下载下来:

git clone --recursive https://github.com/dmlc/xgboost

xgboost中的rank任务的目录为:

xgboost/demo/rank/

根据该目录下的README.md文档的指引即可将xgboost部分的排序任务在所给的示例数据上跑通。

顺利实现以上过程之后,就可以开始细究xgboost中rank任务的来龙去脉了。

Learning to Rank

Learning to Rank简要介绍

首先来简单了解一下排序任务。在互联网搜索诞生之初,检索模型所依赖的特征是相对简单的,这些特征的设计主要是基于query与文档的相似度来对文档进行排序,也即相关度排序模型。另一种传统排序模型是重要性排序模型,重要性排序模型就不考虑query,而仅仅根据网页(文档)之间的图结构来判断文档的权威程度,常用的如PageRank等。

在互联网不断发展的今天,更多复杂有效的特征被应有到检索里面,人工调参已不能满足需求,此时机器学习被应用到这项任务中,同时由于互联网海量数据的特点,基于大数据的learning to rank逐渐成为热门领域。

搜索

query:检索词条, 文档(doc):检索结果

搜索这一过程的本质是自动选取与用户输入的关键词(query)最相关的一组文档(docs,或称网页,urls)的过程。目前主要通过如下两个步骤实现:

(1)query-doc匹配:寻找与当前输入的query相关度高的docs(粗排)

(2)高相关度docs精确排序:对(1)中返回的docs,选取更多特征并按照用户点击该doc的可能性大小精确排序。有时我们还会选择不同的特征,召回多组(1)并将它们通过排序算法融合为一组。(精排)

Learning to Rank是一种用来实现步骤(2)的机器学习模型。它使用机器学习的方法,可以把各个现有排序模型的输出作为特征,然后训练一个新的模型,并自动学得这个新模型的参数,从而很方便的可以组合多个现有的排序模型来生成新的排序模型。

Learning to Rank算法

下图为机器学习排序的原理图,机器学习排序系统由4个步骤组成——人工标注训练数据、文档特征抽取、学习分类函数、在实际搜索系统中采用机器学习模型
机器学习排序

图1 机器学习排序原理

Learning to Rank主要包含pointwise方法、pairwise方法和listwise方法三种类型。

(1)pointwise方法:对于某一个query,它将每个doc分别判断与这个query的相关程度,由此将docs排序问题转化为了分类(比如相关、不相关)或回归问题(相关程度越大,回归函数的值越大)。

(2)pairwise方法:pairwise方法并不关心某一个doc与query相关程度的具体数值,而是将排序问题转化为任意两个不同的docs di和dj谁与当前的query更相关的相对顺序的排序问题。一般分为di比dj更相关、更不相关和相关程度相等三个类别,分别记为{+1, -1, 0},由此便又转化为了分类问题。

(3)listwise方法:将一个query对应的所有相关文档看做一个整体,作为单个训练样本。

xgboost做排序任务

流程

用xgboost做排序任务即使用xgboost解决图1中的“学习分类函数”这个一步。关于xgboost的具体原理可以参照:xgboost具体原理

xgboost在机器学习排序中的作用
图2 xgboost在机器学习排序中的作用

更为通俗一点的流程如下:

  • 训练样本输入——>

  • 获得特征候选集——>

  • 根据xgboost对应寻找划分点的方法找到划分点——>重复上一步直到不能再分裂生成一棵完整的树(得到叶子)——>

  • 进行拟合(最小化pairwise loss(auc))生成下一棵树——>

  • 生成设定数目的树之后,训练完成——>

  • 输入测试样本——>

  • 根据训练所得模型和具体打分机制进行打分——>

  • 获得每条<query, doc>对的打分

当在xgboost下做排序时,需将objective设置为rank:pairwise,官方文档对该参数的介绍为:

rank:pairwise -set xgboost to do ranking task by minimizing the pairwise loss

当我们在具体使用xgboost的时候,如果采用了rank:pairwise的设置,其实我们输入的训练集中label在一定意义上可以看成是数据真实的得分,当使用model.predict进行预测是输出的相关度,并不指具体的得分情况。因此以上流程中的打分同样也是相关度的一种表示,并不会映射到某个具体数值。关于这一点后续还会有更具体的说明。

打分机制

为了方便理解上一小节中所介绍的内容以及更清楚展示本小节的打分机制,以下举一个实例。

首先随机生成了20条数据,每条数据有5个特征,label为0或1.将这份数据同时设置为训练数据、验证数据和测试数据。

train20.txt

进行数据的预处理操作之后,在rank.py中添加

xgb_model.dump_model('model.txt')

两行代码,随后进行训练

python rank.py

获得的打分结果如下:
打分结果

训练所得的模型如下:
model
经整理,每个样本在每棵树下获得的分数如下:
bst_predict
根据xgboost的核心算法思想:

xgboost核心算法思想
最终打分结果为,将每棵树对应的分数加起来。

于是最终的打分机制为:

打分机制
关于base_score,官方文档上的解释如下:

base score

For sufficient number of iterations, changing this value will not have too much effect.

从该解释可以看出,xgboost的排序任务中——打分是相关度的一种表示,并不会映射到某个具体数值。

参考文献(排序不分先后)

【1】机器学习算法-初识Learning to Rank
【2】浅谈Learning to Rank中的RankNet和LambdaRank算法
【3】从L2R开始理解一下xgboost的 ‘objective’: 'rank:pairwise’参数
【4】XGBoost Documentation
【5】xgboost/demo/rank/
【6】机器学习排序之Learning to Rank简单介绍
【7】通俗理解kaggle比赛大杀器xgboost
【8】如何理解机器学习和统计中的AUC?
【9】XGBoost learning-to-rank model to predictions core function?
【10】『我爱机器学习』集成学习(三)XGBoost
【11】XGBoost_源码初探
【12】XGBoost Parameters

  • 3
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值