说在前面
首先你要了解什么是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。