在 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 将首先尝试使该组的排名正确。
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并且在推理过程中我们不需要它们作为输入。
谢谢!