说到learning to rank,大家应该都比较熟悉,但是说到用XGB做learning to rank,很少有人实现过.举个例子,比方说赛马,我们可以基于马的个头,体重,历史战绩等信息,建立XGB模型,进行二分类,最后选择赢的概率最高的马.这样做并没有问题,但是考虑到马是否能跑赢,和对手紧密相关,不管我选的马能力如何,只要他能跑赢同场比赛其他马即可,这就是排序.

Learning To Rank

学习排序其实也是有监督学习的一部分,和多分类和回归模型相比,我们并不是要预估一条样本的概率,而是预估很多个样本点的顺序.排序经常被用于搜索引擎,还有一些购物建议.在搜索框里搜任何一条query,top 3展示的一定是最相关的,越往后翻页相关度越低.

回到XGBoost,有3个目标函数,Point Wise,Pairwise和Listwise,这3种方法都可以用来排序,每个方法都有其优缺点.对于pointwise而言,每次仅仅考虑一个样本,预估的是每一条和query的相关性,基于此进行排序.Pairwise是每次取一对样本,预估这一对样本的先后顺序,不断重复预估一对对样本,从而得到某条query下完整的排序.Listwise同时考虑多个样本,找到最优顺序.

Point Wise虽然简单,但是存在不少问题.比如说赛马场景,马的输赢取决于对手.再比如搜索场景,我们确实可以预估每个query到每个document的点击率做为排序依据,但是点击率要考虑rank,例如排的越靠前的document点击率上占据优势,这些point-wise模型很难考虑进去.基于此,我们需要做learning to rank的模型.

建模

首先要明确的是训练数据,训练数据必须包含一列query id,该id下指明哪些样本要放到一起进行排序.同时特别需要注意的是,在训练集和测试集进行拆分时,需要按query id进行分割,如果直接随机拆分,同一个query id下的数据就会被分开,这样会导致模型出问题.我们可以用如下代码进行拆分.

from sklearn.model_selection import GroupShuffleSplit
gss = GroupShuffleSplit(test_size=.40, n_splits=1, random_state = 7).split(df, groups=df['query_id'])
X_train_inds, X_test_inds = next(gss)train_data= df.iloc[X_train_inds]
X_train = train_data.loc[:, ~train_data.columns.isin(['id','rank'])]
y_train = train_data.loc[:, train_data.columns.isin(['rank'])]# 模型需要输入按query_id排序后的样本
# 并且需要给定每个query_id下样本的数量
groups = train_data.groupby('id').size().to_frame('size')['size'].to_numpy()test_data= df.iloc[X_test_inds]#We need to keep the id for later predictions
X_test = test_data.loc[:, ~test_data.columns.isin(['rank'])]
y_test = test_data.loc[:, test_data.columns.isin(['rank'])]

我们的数据格式应该如下所示,如果数据长这样,那么我们上述代码中的groups就是[3, 4]:

然后我们就可以建模了,可以用XGBRanker训练排序模型,在这个场景下,我们无法自定义objective,也无法自定义mertic了.

import xgboost as xgbmodel = xgb.XGBRanker(  tree_method='gpu_hist',booster='gbtree',objective='rank:pairwise',random_state=42, learning_rate=0.1,colsample_bytree=0.9, eta=0.05, max_depth=6, n_estimators=110, subsample=0.75 )model.fit(X_train, y_train, group=groups, verbose=True)

训练完后我们就可以进行预估,因为预估方法并不会输入groups,所以我们需要做一些特殊处理:

def predict(model, df):return model.predict(df.loc[:, ~df.columns.isin(['id'])])predictions = (data.groupby('id').apply(lambda x: predict(model, x)))

这里选择了"rank:pairwise"作为loss,看官方文档还有其他rank loss可供尝试:

pair wise 方法相比pointwise有优势,可以学习到一些顺序。但是pairwise也有缺点:

1.只能给出排序,并不能给出有多好,好多少.比如在搜索场景下,可能一条与query相关的doc都没,pointwise可以通过卡阈值得到这个信息,但是rank方式就不能区分.

2.当一个query下有很多doc,会产生大量的pairs。

3.对噪声的label 非常敏感。

感兴趣的赶紧尝试起来吧!

用XGB learning to rank

用 XGBoost 做 Learning To Rank相关推荐

  1. 利用lightgbm做learning to rank 排序,解析模型中特征重要度

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx 去年实习时,因为项目需要,接触了一下Learning to Rank(以下简称L2R),感觉很 ...

  2. Learning to Rank 简介(转载)

    Learning to rank(简写 LTR.L2R) 也叫排序学习,指的是机器学习中任何用于排序的技术. 目录 一.LTR引言 1.1 LTR的出现背景 1.2 LTR基本框架 二.训练数据的获取 ...

  3. lightGBM用于排序(Learning to Rank )

    向AI转型的程序员都关注了这个号???????????? 机器学习AI算法工程   公众号:datayx Learning to Rank 简介 去年实习时,因为项目需要,接触了一下Learning ...

  4. Learning To Rank之LambdaMART的前世今生

    Learning To Rank之LambdaMART的前世今生 标签: 机器学习排序模型Learning To RankLambdaMARTRanknet 2014-11-02 17:57 1448 ...

  5. 《Rank-LIME: Local Model-Agnostic Feature Attribution for Learning to Rank》论文精读

    文章目录 一.论文信息 摘要 二.要解决的问题 现有工作存在的问题 论文给出的方法(Rank-LIME)介绍 贡献 三.前置知识 LIME Feature Attribution Model-Agno ...

  6. 如何用XGBoost做时间序列预测?

    ↑↑↑关注后"星标"Datawhale 每日干货 & 每月组队学习,不错过 Datawhale干货 来源:Jason Brownlee,整理:数据派THU 本文约3300字 ...

  7. 论文笔记 DNorm: disease name normalization with pairwise learning to rank

    一.动机 疾病词的标准化是一个非常复杂的任务,疾病词通常是由希腊和拉丁的词根和词缀构造的,比如hemochromatosis(血色素沉着病).另一种灵活的疾病词创建方式是疾病分类(disease ca ...

  8. 独家 | 如何用XGBoost做时间序列预测?

    作者:Jason Brownlee 翻译:wwl 校对:王雨桐 本文约3300字,建议阅读10分钟 本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证 ...

  9. python 分类变量xgboost_如何用XGBoost做时间序列预测?

    作者:Jason Brownlee翻译:wwl校对:王雨桐本文约3300字,建议阅读10分钟本文介绍了如何用XGBoost做时间序列预测,包括将时间序列转化为有监督学习的预测问题,使用前向验证来做模型 ...

最新文章

  1. Anaconda安装Python,提示Python不是内部或外部命令解决方法
  2. 三、oracle 用户管理一
  3. Nginx反向代理多个应用时,通过BluePring使Flask支持二级路径(URL前缀)
  4. 【正一专栏】谁能阻止超神的曼城
  5. html制作花样链接卡页面_花样链接卡.html
  6. FAILED: Error in metadata: MetaException(message:Got exception: java.net.ConnectException
  7. 【渝粤题库】广东开放大学 现代服务学概论 形成性考核 (2)
  8. git 配置origin_GitHub/Git配置与简单的使用
  9. 【Kafka】Kafka如何通过源码实现监控
  10. slam十四讲第二版 pdf_先搞定SLAM,再谈如何抓住下一代互联网产业爆发点!
  11. 如何在苹果Mac上通过通知中心禁用通知?
  12. 如何将Android手机用作调制解调器; 无需生根,Redux
  13. 元器件型号: ATMEGA328P-AU
  14. Python 函数注释
  15. kux格式怎么转换成mp3_优酷kux1080转码工具 1080p kux格式转换mp4|优酷kux格式转换成MP4格式...
  16. sis最新ip地址2020入口一_【新版教材】2020最新人教版高中化学教材必修一电子课本...
  17. U-BOOT中mmc命令简介
  18. 2022你不容错过的软件测试项目实战(APP项目实战)免费版
  19. SDRAM中数据掩码DQM的作用
  20. acer台式电脑怎么重装系统_宏基台式电脑怎么装系统

热门文章

  1. Pyhton学习——Day9
  2. Unity之计时器功能(转)
  3. 关于cookie 跨页面处理
  4. 160329(二)、web.xml配置详解
  5. 工厂模式一之简单工厂
  6. HITAG 2 125kHz RFID IC Read-Write 256 bits
  7. 如何知道自己的研究课题是不是领域热点?
  8. 激光SLAM学习--移动机器人技术系列课(智东西)
  9. 人工智能 | SLAM与Visual Odometry技术综述(浙江大学智能系统和控制研究所)
  10. pdf html5 阅读进度,HTML5的进度条progress元素