什么是 XGBoost 中的查询 ID(“qid”)

数据挖掘 机器学习 xgboost 排行
2021-10-11 09:35:35

在 XGBoost文档中,据说对于排名应用程序,我们可以在训练数据集中指定查询组 ID 的qid ,如下面的代码片段所示:

1 qid:1 101:1.2 102:0.03
0 qid:1 1:2.1 10001:300 10002:400
0 qid:2 0:1.3 1:0.3
1 qid:2 0:0.01 1:0.3
0 qid:3 0:0.2 1:0.3
1 qid:3 3:-0.1 10:-0.3
0 qid:3 6:0.2 10:0.15

我有几个关于qid的问题(搜索查询和文档的标准 LTR 设置集,它们由查询、文档和查询文档特征表示):

1)假设我们的训练文件中有qid这是否意味着将仅在每个查询的基础上执行优化,所有其他指定的特征都将被视为文档特征并且不会发生交叉查询学习?

2)假设查询由查询特征表示。我们应该在训练文件中仍然指定qid还是应该只列出查询、文档和查询文档特征?

更新:

到目前为止,我有以下解释,但我不知道它有多正确或不正确:

训练集中的每一行都对应一个查询-文档对,因此在每一行中我们都有查询、文档和查询-文档特征。如果我们将“qid”指定为每个查询(=查询组)的唯一查询 ID,那么我们可以为每个查询组分配权重。如果某个查询组中的权重很大,那么 XGBoost 将首先尝试使该组的排名正确。

来自XGBoost repo 中的文件

weights = np.array([1.0, 2.0, 3.0, 4.0])
...
dtrain = xgboost.DMatrix(X, label=y, weight=weights)
...
# Since we give weights 1, 2, 3, 4 to the four query groups,
# the ranking predictor will first try to correctly sort the last query group
# before correctly sorting other groups.

还有_

In ranking task, one weight is assigned to each query group
(not each data point). This is because we only care about the
relative ordering of data points within each group, so it
doesn't make sense to assign weights to individual data points.

更新 2:

找到这个链接给定

3 qid:1 1:1 2:1 3:0 4:0.2 5:0 # 1A
2 qid:1 1:0 2:0 3:1 4:0.1 5:1 # 1B
1 qid:1 1:0 2:1 3:0 4:0.4 5:0 # 1C
1 qid:1 1:0 2:0 3:1 4:0.3 5:0 # 1D 
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2A 
2 qid:2 1:1 2:0 3:1 4:0.4 5:0 # 2B
1 qid:2 1:0 2:0 3:1 4:0.1 5:0 # 2C
1 qid:2 1:0 2:0 3:1 4:0.2 5:0 # 2D 
2 qid:3 1:0 2:0 3:1 4:0.1 5:1 # 3A
3 qid:3 1:1 2:1 3:0 4:0.3 5:0 # 3B
4 qid:3 1:1 2:0 3:0 4:0.4 5:1 # 3C
1 qid:3 1:0 2:1 3:1 4:0.5 5:0 # 3D

生成以下成对约束集(示例由 # 字符后的信息字符串引用):

1A>1B, 1A>1C, 1A>1D, 1B>1C, 1B>1D, 2B>2A, 2B>2C, 2B>2D, 3C>3A, 3C>3B, 3C>3D, 3B>3A, 3B>3D, 3A>3D

因此qid似乎指定了组,以便每个组内的相关值可以相互比较,而组之间的相关值不能直接比较(包括在训练过程中)。所以在训练过程中我们需要有qid并且在推理过程中我们不需要它们作为输入。

谢谢!

1个回答

在信息检索的排名应用中,训练数据由查询和匹配它们的文档以及每个匹配的相关度组成。

例如,在谷歌中搜索某些内容时,训练数据可能由人工评估员(或谷歌称其为评估员)手动准备,他们检查某些查询的结果并确定每个结果的相关性。

检查所有文档的相关性是不可行的,因此通常只检查一些现有排名模型检索到的前几个文档。

学习算法使用训练数据生成一个排名模型,该模型计算文档与实际查询的相关性。

等级配置文件可以有一个或两个阶段:

  1. 第一阶段应该使用计算成本低的函数来对候选人进行排名
  2. 第二阶段在一个小的候选集上运行

简而言之,查询选择和第一阶段排名减少了计算的规模——然后机器学习模型可以用于第二阶段对每个节点的 rerank-count 文档进行排名。这使得排名可扩展(请参阅大小):

  • 控制第二阶段候选集大小
  • 添加内容节点以减少每个节点的文档排名

机器学习搜索引擎的可能架构。

现在让我们回答您的问题:

1)假设我们的训练文件中有qid。这是否意味着优化将仅在每个查询的基础上执行,所有其他指定的特征都将被视为文档特征并且不会发生交叉查询学习?

这意味着为了对所有候选者进行排名,它将仅对第一个候选者进行排名,以降低计算成本。所以它只会在第一个查询中查找广泛的排名搜索。

2)假设查询由查询特征表示。我们应该在训练文件中仍然指定qid,还是只列出查询、文档和查询文档特征?

是的,通常使用 rank_feature 查询,以便将其相关性分数添加到其他分数查询中。

请注意,qid 仅用于训练集https://github.com/Microsoft/LightGBM/issues/1398

来源: -维基百科 - 学习排名 - Vespa - Tank - Vespa - Phased Ranking - Elastic - Rank feature query