从L2R开始理解一下xgboost的objective:rank:pairwi参数

更新时间:2023-05-15 08:16:32 阅读: 评论:0

从L2R开始理解⼀下xgboost的objective:rank:pairwi参数我们⾸先对概念进⾏⼀下简单的介绍,然后结合例⼦来验证⼀下
两部分以红⾊为分界线
----------------------------------------------------------------------------------------------------------------
⾸先说⼀下 ranking即排序问题,这在信息检索等领域是需要解决的核⼼问题
简单来说需要解决的问题就是客户给定⼀个查询q,需要系统返回⼀个⽂档(document)序列,并且该序列中按照⽂档d与q的相关度或重要性依次进⾏了排序
⽐如现在在360浏览器中我输⼊了⼀个名为“仙剑”的查询q,会返回⼀些document序列d1 ,d2 , d3 ,..............等等,其中该浏览器认为《仙剑奇侠传六》官⽅⽹站这个是我最想要的,其次⽼胡男神参演的仙⼀电视剧是我第⼆想要的结果,接下来是仙剑的游戏.......等等
所以rank解决的问题就是
其排序的模型有两种即相关度排序模型和重要性排序模型
接下来说⼀下pairwi:
它是伴随L2R的出现⽽出现的,L2R全称Learning to Rank即将器学习的技术很好的应⽤到了排序中,关于为什么要将机器学习应⽤到rangking问题当中也很好理解,传统的rank模型只能够考虑单⼀模型即相关度排序模型或重要性排序模型,即使可以将两者进⾏组合使⽤,但怎么组合以及怎么设置参数都是很⼤的挑战
⽽机器学习恰好善于处理这种问题,以及现在流⾏的深度学习善于进⾏抽象学习。
怎么结合呢?思路也⾮常简单:c盘能格式化吗
可以将现有排序模型(ranking system)的输出作为机器学习的输⼊特征,然后训练⼀个机器学习的模型(learning system)
该learning system的贡献就是:反作⽤ranking system参数,使之更加准确的评分(个⼈觉得思想上有点像深度学习中的Actor-Critic),
那么在众多机器学习模型中到底选⽤哪个?机器学习模型中的训练数据具体是什么样⼦?话句话说数据的label是什么呢?
注意:这⾥之所以说到label是因为我们在L2R问题中采⽤的都是有监督的机器学习(以及深度学习)模型
L2R的训练数据可以有三种形式:对于每个查询,各个⽂档的绝对相关值(⾮常相关,⽐较相关,不相关,等等);对于每个查询,两两⽂档之间的相对相关值(⽂档1⽐⽂档2相关,⽂档4⽐⽂档3相关,等等);对于每个查询,所有⽂档的按相关度排序的列表(⽂档1>⽂档2>⽂档3)。这三种形式的训练数据之间可以相互转换
针对以上问题可以将L2R算法归为三⼤类:
劳动法年假规定
PointWi,PairWi,ListWi
PointWi:只考虑给定查询下,单个⽂档的绝对相关度,⽽不考虑其他⽂档和给定查询的相关度。亦即给定查询q的⼀个真实⽂档序列,我们只需要考虑单个⽂档di和该查询的相关程度ci,亦即输⼊数据应该是如下的形式:
这⾥可以采⽤机器学习的分类模型,那么其label就可以简单粗暴的设为其真实的相关度,还可以采⽤回归模型,其实这⾥ranking system 就可以直接看出是⼀个learning system
PairWi:可以看到上述⽅法没有考虑到排序的⼀些特征,⽐如⽂档之间的排序结果针对的是给定查询下的⽂档集合,⽽PairWi则是考虑了任意两个相关度不同的⽂档之间的相对相关度
它对应的机器学习就是⼆分类模型,⼆分类模型有很多啦,其中就包括下⾯的xgboost,它是将⽂档序列中的⽂档两两组合(⼀对,这也是pair命名的原因,当然对这⼀对的要求就是得分不能⼀样)这个作为⼆分类模型的输⼊,那么该⼆分类模型的label是什么呢?那就是+1和-1,他们是依据什么规则来标注训练集的呢?很简单就是看看这⼀对⽂档组合中第⼀个⽂档得分是否⽐第⼆个⾼,是的话就是+1否的话就是-1,当然啦,这个规则还可以改成别的,但最后作⽤给ranking system就是使其更评分精确。
Listwi:直接考虑给定查询下的⽂档集合的整体序列,直接优化模型输出的⽂档序列,使得其尽可能接近真实⽂档序列。
----------------------------------------------------------------------------------------------------------------
下⾯回归到xgboost中objective 设为rank:pairwi的问题
xgboost就是⼀种⼆分类模型,当将objective设为rank:pairwi意思就是说采⽤评分机制进⾏训练
官⽹介绍–t XGBoost to do ranking task by minimizing the pairwi loss
注意当我们在具体使⽤xgboost的时候,如果采⽤了rank:pairwi的设置,其实我们输⼊的训练集中label在⼀定意义上可以看成是数据真实的得分,当使⽤model.predict进⾏预测是输出的相关度,但是其范围可能有点难理解,⽐如我们输⼊的训练集的label是0和1,那么看成得分后含义就是训练集的数据中只有两种得分0和1,那么我们⽤测试集去测试会发现测试集的得分有负数有正数,含义就是正数得分⾼,负数得分低。
这⾥测试集输出的相关度并不能完全等同与得分,⽐如我们将label设为100和10即普遍提⾼得分,会发现测试集输出的相关度并没有普遍提⾼(下⾯有例⼦),所以两者并不是完全等同,有⼈也将其理解为AUC,这⾥有负值,显然这样理解不是很恰当,它只是代表和正样本有多⼤的相关度,负值就是相关度低,正数就是相关度⾼。⾄于怎么确定哪⼀类是正样本呢?可以简单的理解为分数⾼的就是正样本,即⼆分类中label标签⼤的那⼀类就是正样本,⼀般来说⼆分类问题label是0和1或者-1和1,但是为了理解我们还是会举⼀些⽐较不太恰当的例⼦。
下⾯看个例⼦
我们产⽣两个DataFrame作为数据集,分别为train和test
这⾥是⼆分类问题,即以y=x这条直线作为分界线,位于其上的label为1,其下的label为0
GetLabel:获取label
DropDuplicate:将分界线上的点移动到分解线外
import pandas as pd
import xgboost as xgb
import random
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
def GetLabel(row):
if row.y-row.x<0:
return 0
el:
return 1
def DropDuplicate(row):
if row.x==row.y:
return row.y+1
el:
return row.y
train = pd.DataFrame({
'x': [random.randrange(20) for i in range(1000)],
'y': [random.randrange(20) for i in range(1000)],
})
乌镇西栅住宿train.y = train.apply(DropDuplicate,axis=1)
train['label'] = train.apply(GetLabel,axis=1)
test = pd.DataFrame({
'x': [random.randrange(20) for i in range(30)],
'y': [random.randrange(20) for i in range(30)],
})
test.y = test.apply(DropDuplicate,axis=1)
test['label'] = test.apply(GetLabel,axis=1)
#可视化
咽喉炎吃什么train_0 = train[train.label==0]
train_1 = train[train.label==1]
test_0 = test[test.label==0]
test_1 = test[test.label==1]
ax1 = plt.subplot(211)
ax2 = plt.subplot(212)
ax1.scatter(train_0.x, train_0.y, s=30, c='r' ,edgecolors= 'white')
ax1.scatter(train_1.x, train_1.y, s=30, c='b' ,edgecolors= 'white')
联通gprsax2.scatter(test_0.x, test_0.y, s=30, c='r' ,edgecolors= 'white')
ax2.scatter(test_1.x, test_1.y, s=30, c='b' ,edgecolors= 'white')
plt.show()
上图为训练集,下图为测试集
下⾯我们就将'objective':这个超参数设置为'rank:pairwi'来训练出model进⽽预测:
注意这⾥我们就不对其它超参数进⾏优化啦,即这⾥不讨论优化问题,即对每⼀个超参数随便设⼀个常⽤的值炮兵司令朱瑞
train_data = train[['x','y']]
train_label = train[['label']]
test_data = test[['x','y']]
test_compare = test
datat1 = xgb.DMatrix(train_data,label=train_label) datat2 = xgb.DMatrix(test_data)
params={'booster':'gbtree',
'objective': 'rank:pairwi',
'eval_metric':'auc',
'gamma':0.1,
'min_child_weight':1.1,幼儿园教师教育随笔
'max_depth':5,
'lambda':10,
'subsample':0.7,
'colsample_bytree':0.7,
'colsample_bylevel':0.7,
'eta': 0.01,
'tree_method':'exact',
'ed':0,
'nthread':12
}
model = ain(params,datat1,num_boost_round=100) print('-------------model train done-----------')
test_compare['labelpre'] = model.predict(datat2)
print(test_compare)
-------------model train done-----------
x  y  label  labelpre
0    7  2      0  0.365744
1    7  8      1  0.529373
2  16
3      0 -0.136610
3    3  11      1  0.884958
4    6  11      1  0.744852
5    7  3      0  0.368131
6    6  16      1  0.883681
7  18  3      0 -0.146025
8  10  19      1  0.892916
9    1  19      1  1.187794
10  4  17      1  0.998889
11  19  9      0  0.139502
12  1  17      1  1.187794
13  5  0      0  0.433676
14  1  7      1  0.747284
15  8  6      0  0.319912
16  8  4      0  0.263565
17  8  2      0  0.215807
18  14  8      0  0.203753
19  2  6      1  0.677499
20  13  3      0  0.060727
21  15  10      0  0.393613
22  4  0      0  0.381093
23  12  18      1  0.682859
24  9  4      0  0.242880
25  3  0      0  0.516810
26  8  15      1  0.677383
27  10  19      1  0.892916
28  1  6      1  0.680136
29  19  15      0  0.313164
汽车强制报废

本文发布于:2023-05-15 08:16:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/898816.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:模型   学习   得分   训练   排序
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图