xgboost learning to rank 简明实用使用说明

说在前面

首先你要了解什么是xgboost、了解什么是监督学习、了解什么是learning to rank(ltr)、掌握基本的python常识等。
这些不赘述,有的是资源。
几个比较推荐的:

  • https://datascience.stackexchange.com/questions/10179/how-fit-pairwise-ranking-models-in-xgboost
  • https://zhuanlan.zhihu.com/p/111636490
  • 这个链接也太长了吧……
  • https://medium.com/predictly-on-tech/learning-to-rank-using-xgboost-83de0166229d
  • https://blog.csdn.net/lipengcn/article/details/80373744
  • https://www.jianshu.com/p/9caef967ec0a
    如有错误还请指正,谢谢您!

怎样使用

ltr实现方法有很多,我只介绍xgboost实现的。下载xgboost,xgb已经集成了ltr的pairwise、listwise、pointwise等,只需要改革参数就行了。不同参数对应的具体模型:

  • rank:pairwise ------- LambdaRank (pairwise模型)
  • rank:ndcg ------- LambdaMart (listwise模型)
  • rank:map ------- RankNet (pointwise模型)
  • (2021.8.24)更正说法:在这里插入图片描述
    摘自官网https://xgboost.readthedocs.io/en/latest/parameter.html,不同参数所对应的模型。上面三个划线的是其他博客的内容。为了和文档一致,还是和文档采用一种说法。

所以,在xgb的train的时候只要param变一下就可以了。(xgb集成得太方便。。)

xgb_rank_params = {
	# objective一定要写对。不然就是别的模型了。
    'objective':'rank:pairwise',
    'nthread':4,
    'eval_metric':'ndcg'
}
rankModel = xgboost.train(xgb_rank_params,train_data)

输入输出

由于ltr是监督学习,需要label。

输入

那输入模型的data要是什么?
是同一query下的已经标注好的数据。用图表示:
在这里插入图片描述
q 1 q_1 q1意思是一个query下, x n 1 x_n^1 xn1意思是在这个query下已经有label的数据。label是 x x x与query的相关程度。几点要注意:

  • 训练数据要分组,如图所示,一个框框是一组,分组不用自己手动分,xgb的Dmatrix类有set_group函数方便我们分组。只有在一个组内的数据才有比较性。
    # n group的意思是,同一个list中,相邻的几个是一组,也就是说,有几个数就有几组,数字本身代表本组有多少。
    # 本例通过n group把input_data_dmatrix分成了4组。
    n_groups=[4,10,39,5]
    input_data_dmatrix=xgb.DMatrix(np.array(input_data))
    input_data_dmatrix.set_group(n_groups)
    
  • 或者,我们不分组,也就是只用1组(同个query),此就不用调用set_group了,直接输入就可以。
test data的输出

learning to rank,顾名思义,我们的输出就是用来rank data的,是用来给data排序的。所以他的输出,是你predict数据的对应的打分,这个打分用来排序后,就可以作为输出排序了。还是有几点要注意:

  • 只能一次放入一个query下的数据,他不能区分不同query。如果你直接放入多个query下的数据,他打的分会混在一起,没法sort。
  • 输出的分没有任何实际意义,只用来排序,有负数。
  • test data的分数高低的意义取决于你训练数据label的意义。举例:假设你训练数据0-10代表从“不相关”到“相关”,那么test data输出的分数也是这样(负数也包含)。若是0-10是从“相关”到“不相关”,则test data的输出同。

最后放示例

此非能运行的code,只是个思路示例

import xgboost as xgb
# 准备x train和y train
train_data=DMatrix(x_train,y_train)
xgb_rank_params = {
    'objective':'rank:pairwise',
    'nthread':4,
    'eval_metric':'ndcg'
}
# 得到train好的model
rankModel = xgboost.train(xgb_rank_params,train_data)

# 做test(或者做任务)
# test data是同一query下的数据,多个query要predict多次
test_data=DMatrix(x_test)
scores=rankModel.predict(test_data)

# 然后按照score排个序就可得到排序号的test-data。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值