XGB-4: 学习排序

概述

在信息检索的背景下,学习排序的目标是训练一个模型,将一组查询结果排列成有序列表[1]。对于监督学习排序,预测器是以特征矩阵编码的样本文档,标签是每个样本的相关性程度。相关性程度可以是多级(分级)的,也可以是二进制的(相关或不相关)。训练样本通常根据它们的查询索引分组,每个查询组包含多个查询结果。

XGBoost通过一组目标函数和性能指标实现学习排序。默认目标是基于LambdaMART算法的rank:ndcg,该算法本质上是LambdaRank框架[3]对梯度提升树的一种调整。有关该算法的历史和摘要,请参阅[5]。XGBoost中的实现具有确定性GPU计算、分布式训练、位置去偏和两种不同的成对构建策略。

使用成对目标进行训练

LambdaMART是一个成对排名模型,它比较查询组中每一对样本的相关性程度,并为每一对计算一个代理梯度。默认目标rank:ndcg使用从ndcg指标导出的替代梯度。为了训练XGBoost模型,需要一个额外的排序数组,称为qid,用于指定输入样本的查询组。示例输入如下:

QIDLabelFeature
10 x 1 x_1 x1
11 x 2 x_2 x2
10 x 3 x_3 x3
20 x 4 x_4 x4
21 x 5 x_5 x5
20 x 6 x_6 x6

样本根据它们的查询索引按非递减的顺序进行排序。在上面的示例中,前三个样本属于第一个查询,接下来的四个样本属于第二个查询。为了简单起见,在以下代码片段中,将使用一个合成的二元学习-to-rank 数据集,其中二元标签表示结果是否相关,并随机分配查询组索引给每个样本。

from sklearn.datasets import make_classification
import numpy as npimport xgboost as xgb# Make a synthetic ranking dataset for demonstration
seed = 1994
X, y = make_classification(random_state=seed)
rng = np.random.default_rng(seed)
n_query_groups = 3
qid = rng.integers(0, 3, size=X.shape[0])# Sort the inputs based on query index
sorted_idx = np.argsort(qid)
X = X[sorted_idx, :]
y = y[sorted_idx]
qid = qid[sorted_idx]

使用 scikit-learn 估计器接口训练排序模型的最简单方法是继续上一个代码片段,可以训练一个简单的排序模型而不进行调整:

ranker = xgb.XGBRanker(tree_method="hist", lambdarank_num_pair_per_sample=8, objective="rank:ndcg", lambdarank_pair_method="topk")
ranker.fit(X, y, qid=qid)

由于目前scikit-learn 中还没有学习排名(learning-to-rank)的接口。因此,xgboost.XGBRanker 类没有完全遵循 scikit-learn 估计器指南,并且不能直接用于 scikit-learn 的一些实用功能。例如,scikit-learn 中的 auc_scorendcg_score 没有考虑查询组信息也没有考虑成对损失。大多数指标都是作为 XGBoost 的一部分实现的,但要使用 scikit-learn 的实用程序,如 sklearn.model_selection.cross_validation(),需要进行一些调整,以便将 qid 作为额外参数传递给 xgboost.XGBRanker.score()。给定一个数据帧 X(无论是 pandas 还是 cuDF),按照以下方式添加 qid 列:

df = pd.DataFrame(X, columns=[str(i) for i in range(X.shape[1])])
df["qid"] = qid
ranker.fit(df, y)  # No need to pass qid as a separate argumentfrom sklearn.model_selection import StratifiedGroupKFold, cross_val_score
# Works with cv in scikit-learn, along with HPO utilities like GridSearchCV
kfold = StratifiedGroupKFold(shuffle=False)
cross_val_score(ranker, df, y, cv=kfold, groups=df.qid)

上述代码片段使用LambdaMART和NDCG@8指标构建了一个模型。排名器的输出是相关性分数:

scores = ranker.predict(X)
sorted_idx = np.argsort(scores)[::-1]
# Sort the relevance scores from most relevant to least relevant
scores = scores[sorted_idx]

位置偏差Position Bias

获取查询结果的真实相关度通常是昂贵且费力的,需要人工标注者逐个标注所有结果。当这样的标注任务不可行时,可能会想要改为在用户点击数据上训练学习排名模型,因为点击数据相对容易收集。直接使用点击数据的另一个优点是它可以反映最新的用户偏好[1]。然而,用户点击通常是有偏的,因为用户倾向于选择显示在更高位置的结果。用户点击也是噪声的,用户可能会意外点击不相关的文档。为了缓解这些问题,XGBoost实现了无偏LambdaMART[4]算法来消除位置依赖的点击数据的偏差。可以通过lambdarank_unbiased参数启用该特性;有关相关选项,请参见排名学习参数(rank:ndcg, rank:map, rank:pairwise)。

损失函数Loss

XGBoost基于不同的度量标准实现了不同的LambdaMART目标。在这里列出它们作为参考。除了作为目标函数使用的度量标准之外,XGBoost还实现了用于评估的度量标准,如pre(用于精确度)。请参阅参数以获取可用选项,并查看以下部分以了解如何根据有效对数的数量选择这些目标。

  • NDCG

    归一化折扣累积增益(Normalized Discounted Cumulative Gain NDCG)可用于二进制相关性和多级相关性。目标的名称是 rank:ndcg

  • MAP

    平均精度(Mean average precision MAP)是一个二进制度量标准。当相关性标签为0或1时,可以使用它。目标的名称是 rank:map

  • Pairwise

    LambdaMART算法使用学习排名度量(如NDCG)来缩放逻辑损失,以期将排名信息包含到损失函数中。rank:pairwise 损失是成对损失的原始版本,也称为 RankNet 损失 [7] 或成对逻辑损失。与 rank:maprank:ndcg 不同,不进行缩放( ∣ Δ Z i j ∣ = 1 |\Delta Z_{ij}| = 1 ∣ΔZij=1)。

缩放LTR度量是否实际上更有效仍有争论;[8] 提供了一般lambda损失函数的理论基础和对框架的一些见解。

构建对Constructing Pairs

XGBoost实现了两种用于构建文档对以进行 λ \lambda λ梯度计算的方法,第一种是均值mean方法,另一种是topk方法。首选策略可以通过 lambdarank_pair_method 参数指定。

对于平均值策略,XGBoost为查询列表中的每个文档采样lambdarank_num_pair_per_sample个文档对。例如,给定一个包含3个文档的列表,如果将lambdarank_num_pair_per_sample设置为2,XGBoost将随机采样6个文档对,假设这些文档的标签不同。另一方面,如果将成对方法设置为topk,XGBoost将构建大约 k × ∣ q u e r y ∣ k \times |query| k×query数量的文档对,其中每个样本在顶部位置有 k = l a m b d a r a n k _ n u m _ p a i r k = lambdarank\_num\_pair k=lambdarank_num_pair*。这里计算的成对数量是一个近似值,因为跳过了具有相同标签的文档对。

调优

学习排序是一项复杂的任务,也是一个积极研究的领域。训练一个泛化性能良好的模型并不是一件简单的事情。XGBoost中有多个损失函数以及一组超参数。本节包含一些有关如何选择超参数的提示,作为起点。可以通过调整这些超参数来进一步优化模型。

首先要考虑的问题是如何选择与手头任务相匹配的目标如果输入数据具有多级相关度度量,那么应该使用 rank:ndcgrank:pairwise。然而,当输入具有二进制标签时,有多个基于目标度量的选项。[6] 对此主题提供了一些建议,并鼓励用户查看他们的工作中所做的分析。选择应基于有效对数的数量,这指的是能够生成非零梯度并有助于训练的对数的数量。具有MRRLambdaMART的有效对数最少,因为当对包含高于顶部相关文档的非相关文档时,梯度仅在这种情况下才为非零。因此,它在XGBoost中没有实现。由于NDCG是一个多级度量,通常会生成比MAP更多的有效对数。

然而,当存在足够多的有效对时,[6] 表明将目标度量与目标函数匹配是重要的。当目标度量为MAP且您使用可以提供足够多有效对的大型数据集时,rank:map 在理论上可以产生比 rank:ndcg 更高的MAP值。

对于有效对数的选择也适用于对方法(lambdarank_pair_method)和每个样本的对数(lambdarank_num_pair_per_sample)的选择。例如,mean方法考虑的对数比NDCG@10多,因此前者生成更多有效对并提供比后者更多的细粒度。此外,使用mean策略可以通过随机采样帮助模型泛化。然而,与其使用所有对,有人可能希望将训练集重点放在前 k k k 个文档上,以更好地适应其实际应用。

在使用mean策略生成对的情况下,其中目标度量(如NDCG)是在整个查询列表上计算的,用户可以指定应为每个文档生成多少对,通过设置 lambdarank_num_pair_per_sample。XGBoost将为查询组中的每个元素随机采样 lambdarank_num_pair_per_sample 对( ∣ p a i r s ∣ = ∣ q u e r y ∣ × n u m _ p a i r s a m p l e |pairs| = |query| \times num\_pairsample pairs=query×num_pairsample)。通常,将其设置为1可以产生合理的结果。在由于生成的有效对数不足而导致性能不足的情况下,将 lambdarank_num_pair_per_sample 设置为较高的值。生成更多的文档对,也将生成更多的有效对。

另一方面,如果优先考虑前 k k k个文档,则 lambdarank_num_pair_per_sample 应设置为略高于 k k k
(带有一些更多的文档)以获得良好的训练结果。

总结:如果有大量的训练数据:

  • 使用与目标匹配的目标函数
  • 选择生成文档对的 topk 策略

另一方面,如果有相对较少的训练数据:

  • 选择NDCGRankNet损失(rank:pairwise)。
  • 选择生成文档对的mean策略,以获得更多的有效对

对于选择的任何方法,可以通过修改lambdarank_num_pair_per_sample来控制生成的对的数量。

分布式训练

XGBoost实现了与多个框架集成的分布式学习排序,包括Dask、Spark和PySpark。接口与单节点相似。有关详细信息,请参阅相应XGBoost接口的文档。将查询组分散到多个工作器上在理论上是合理的,但可能会影响模型的准确性。对于大多数用例,小的差异通常不是问题,因为在使用分布式训练时,通常训练数据的量很大。因此,用户不需要基于查询组对数据进行分区。只要每个数据分区按查询ID正确排序,XGBoost就可以相应地聚合样本梯度。

Reproducible Result

与任何其他任务一样,XGBoost在相同的硬件和软件环境(以及数据分区,如果使用了分布式接口)下应该生成可复现的结果。即使底层环境发生了变化,结果仍应保持一致。然而,当 lambdarank_pair_method 设置为 mean 时,XGBoost 使用随机抽样,结果可能取决于所使用的平台。在Windows上使用的随机数生成器(Microsoft Visual C++)与在其他平台(如Linux,GCC,Clang)上使用的不同1,因此在这些平台之间的输出会有显着差异。

[1] minstd_rand 在 MSVC 上的实现与 GCC 和 Thrust 上的实现产生相同的输出。

结果可复现

像任何其他任务一样,XGBoost在相同的硬件和软件环境(以及数据分区,如果使用了分布式接口)下应该生成可复现的结果。即使底层环境发生了变化,结果仍应保持一致。然而,当 lambdarank_pair_method 设置为 mean 时,XGBoost 使用随机抽样,结果可能取决于所使用的平台。在Windows上使用的随机数生成器(Microsoft Visual C++)与在其他平台(如Linux,GCC,Clang)上使用的不同,因此在这些平台之间的输出会有显着差异。

参考

[1] Tie-Yan Liu. 2009. “Learning to Rank for Information Retrieval”. Found. Trends Inf. Retr. 3, 3 (March 2009), 225–331.

[2] Christopher J. C. Burges, Robert Ragno, and Quoc Viet Le. 2006. “Learning to rank with nonsmooth cost functions”. In Proceedings of the 19th International Conference on Neural Information Processing Systems (NIPS’06). MIT Press, Cambridge, MA, USA, 193–200.

[3] Wu, Q., Burges, C.J.C., Svore, K.M. et al. “Adapting boosting for information retrieval measures”. Inf Retrieval 13, 254–270 (2010).

[4] Ziniu Hu, Yang Wang, Qu Peng, Hang Li. “Unbiased LambdaMART: An Unbiased Pairwise Learning-to-Rank Algorithm”. Proceedings of the 2019 World Wide Web Conference.

[5] Burges, Chris J.C. “From RankNet to LambdaRank to LambdaMART: An Overview”. MSR-TR-2010-82

[6] Pinar Donmez, Krysta M. Svore, and Christopher J.C. Burges. 2009. “On the local optimality of LambdaRank”. In Proceedings of the 32nd international ACM SIGIR conference on Research and development in information retrieval (SIGIR ‘09). Association for Computing Machinery, New York, NY, USA, 460–467.

[7] Chris Burges, Tal Shaked, Erin Renshaw, Ari Lazier, Matt Deeds, Nicole Hamilton, and Greg Hullender. 2005. “Learning to rank using gradient descent”. In Proceedings of the 22nd international conference on Machine learning (ICML ‘05). Association for Computing Machinery, New York, NY, USA, 89–96.

[8] Xuanhui Wang and Cheng Li and Nadav Golbandi and Mike Bendersky and Marc Najork. 2018. “The LambdaLoss Framework for Ranking Metric Optimization”. Proceedings of The 27th ACM International Conference on Information and Knowledge Management (CIKM ‘18).

[9] minstd_rand implementation is different on MSVC. The implementations from GCC and Thrust produce the same output.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/675081.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【ASP.NET Core 基础知识】--部署和维护--部署ASP.NET Core应用程序

一、部署准备 1.1 打包应用程序 打包应用程序是将ASP.NET Core应用程序准备好以便于部署到目标环境的关键步骤之一。在本文中,我们将从编译代码、收集依赖项和设置配置三个方面详细讲解如何打包ASP.NET Core应用程序,以确保在部署过程中的顺利进行。 编…

win32编程系统BUG(Win32 API中的WM_SETTEXT消息)

由于频繁使用Win32 API中的WM_SETTEXT消息,导致内存占用直线上升。 暂未找到有效解决方案。

HCIA--OSPF实验

1.划分网段,子网划分已完成;接口配置: AR1配置 : [Huawei]int g0/0/0 [Huawei-GigabitEthernet0/0/0]ip add 172.16.64.1 20 [Huawei-GigabitEthernet0/0/0]qu [Huawei]int l0 [Huawei-LoopBack0]ip add 172.16.80.1 20AR2配置…

Prime(VulnHub)

Prime 文章目录 Prime1、nmap2、web渗透随便看看首页隐写查看目录爆破gobusterferoxbusterdirsearchdirb whatwebsearchsploit WordPress 5.2.2/dev/secret.txtFuzz_For_Webwfuzzimage.phpindex.php location.txtsecrettier360文件包含漏洞包含出password.txt尝试ssh登入尝试登…

c#通过ExpressionTree 表达式树实现对象关系映射

//反射expression实现对象自动映射 void Main() {Person p1new(){Id1,Name"abc"};var persondto p1.MapTo<Person, PersonDto>();Console.WriteLine($"id:{persondto.Id}-name:{persondto.Name}"); }public static class AutoMapperExs { public s…

MPLS VPN功能组件

VPN实例 VPN实例即为VPN路由转发表VRF&#xff0c;不同VPN之间的路由隔离通过VPN实例实现&#xff0c;PE上存在多个路由转发表&#xff0c;包括一个公网路由转发表&#xff0c;以及一个或多个VPN路由转发表。 PE为每个直接相连的Site建立并维护专门的VPN实例&#xff0c;VPN实…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1&#xff1a;智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

C/C++ - 异常处理

目录 错误处理 异常处理 异常传播 异常规划 标准异常 自定异常 错误处理 在C语言中&#xff0c;错误通常通过函数的返回值来表示。 错误返回值 对于能返回特殊值&#xff08;如NULL或负值&#xff09;的函数&#xff0c;在调用时检查这些值来处理错误。 #include <st…

C#系列-面向对象特性继承封装多态(2)

C#继承 在C#中&#xff0c;继承是面向对象编程的一个核心概念&#xff0c;它允许一个类&#xff08;派生类或子类&#xff09;继承另一个类&#xff08;基类或父类&#xff09;的属性和方法。通过继承&#xff0c;子类可以重用基类的代码&#xff0c;同时还可以添加新的成员或重…

高考志愿填报模拟系统的功能和技术总结

一、金秋志愿高考志愿填报系统主要功能&#xff1a; 用户注册与登录&#xff1a;允许学生和家长注册账号&#xff0c;使用注册的账号登录系统。 个人信息管理&#xff1a;允许用户查看、修改个人信息&#xff0c;如姓名、性别、联系方式等。 高考成绩输入&#xff1a;学生输…

windows上卸载完程序后,清理残余文件,无法删除的情况处理

现象&#xff1a;通常在卸载完软件后&#xff0c;要删除残余文件或者移动残余文件时候&#xff0c;会弹出来 原因&#xff1a; 因为文件被其他程序已经加载&#xff0c;处理的目标是找到使用这个文件的进程&#xff0c;然后kill掉。类似于linux上的lsof命令查找到进程号&…

SpringOne2023解读-01-使用spring-cloud-contract与TestContainer构建可靠程序

个人创作公约&#xff1a;本人声明创作的所有文章皆为自己原创&#xff0c;如果有参考任何文章的地方&#xff0c;会标注出来&#xff0c;如果有疏漏&#xff0c;欢迎大家批判。如果大家发现网上有抄袭本文章的&#xff0c;欢迎举报&#xff0c;并且积极向这个 github 仓库 提交…

如何在vue中使用拖动排序组件sortablejs

效果图&#xff1a; 1.首先&#xff0c;我们需要在vue项目中安装依赖&#xff1a; npm install -save sortablejs2.创建demo文件>demoTest.vue&#xff0c;直接附上实例代码&#xff1a; <template><div><div id"table-names"><div class&…

如何使用CLZero对HTTP1.1的请求走私攻击向量进行模糊测试

关于CLZero CLZero是一款功能强大的模糊测试工具&#xff0c;该工具可以帮助广大研究人员针对HTTP/1.1 CL.0的请求走私攻击向量进行模糊测试。 工具结构 clzero.py - 工具主脚本&#xff1b; default.py - 包含了大多数标准攻击测试方法和字符&#xff1b; exhaustive.py - 包…

山西电力市场日前价格预测【2024-02-08】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-02-08&#xff09;山西电力市场全天平均日前电价为200.58元/MWh。其中&#xff0c;最高日前电价为347.58元/MWh&#xff0c;预计出现在07:00。最低日前电价为0.00元/MWh&#xff0c;预计出…

Redhat7.9/Centos7.9配置双网卡bonding

一、网卡bonding及其7种模式简介&#xff1a; 1、网卡bonding&#xff1a; 一台服务器如果只有一块网卡&#xff0c;当这块网卡故障时&#xff0c;服务器网络就会瘫痪。bonding&#xff08;绑定&#xff09;是一种Linux系统下的网卡绑定技术&#xff0c;是Linux系统内核层面实…

蓝桥杯第八届省赛题笔记------基于单片机的电子钟程序设计与调试

题目要求&#xff1a; 一、基本要求 1.1 使用 CT107D 单片机竞赛板&#xff0c;完成“电子钟”功能的程序设计与调试&#xff1b; 1.2 设计与调试过程中&#xff0c;可参考组委会提供的“资源数据包”&#xff1b; 1.3 Keil 工程文件以准考证号命名&#xff0c;保存在…

RibbonOpenFeign源码(待完善)

Ribbon流程图 OpenFeign流程图

python3实现gitlab备份文件上传腾讯云COS

gitlab备份文件上传腾讯云COS 脚本说明脚本名称&#xff1a;upload.py 假设gitlab备份文件目录&#xff1a;/opt/gitlab/backups gitlab备份文件格式&#xff1a;1706922037_2024_02_06_14.2.1_gitlab_backup.tar1.脚本需和gitlab备份文件同级目录 2.根据备份文件中的日期判断…

C++面向对象编程:explicit关键字

explicit关键字的作用就是防止有一个参数的类构造函数进行隐式自动转换。 所以explicit只能用于修饰只有一个参数的类构造函数,表明该构造函数是显示的, 而非隐式的, 跟它相对应的另一个关键字是implicit, 意思是隐藏的,类构造函数默认情况下即声明为implicit(隐式)。 explicit…