为什么在 xgboost 中使用 'rank:pairwise' 时不需要设置测试组?

数据挖掘 机器学习 Python xgboost 学习排名
2021-09-29 03:27:27

我是学习排名的新手。我正在尝试学习xgboost 提供的Learning to rank 示例。发现核心代码如下rank.py

train_dmatrix = DMatrix(x_train, y_train)
valid_dmatrix = DMatrix(x_valid, y_valid)
test_dmatrix = DMatrix(x_test)

train_dmatrix.set_group(group_train)
valid_dmatrix.set_group(group_valid)

params = {'objective': 'rank:pairwise', 'eta': 0.1, 'gamma': 1.0,
               'min_child_weight': 0.1, 'max_depth': 6}
xgb_model = xgb.train(params, train_dmatrix, num_boost_round=4,
                           evals=[(valid_dmatrix, 'validation')])
pred = xgb_model.predict(test_dmatrix)

组数据用于训练和验证集。但是测试集预测不使用组数据。我还查看了一些解释来介绍模型输出,例如XGboost 使用“rank:pairwise”的输出是什么?.

实际上,在 Learning to Rank 领域,我们试图预测每个文档对特定查询的相对分数。

我的理解是,如果测试集没有分组数据,则不指定查询。模型如何输出指定查询的相对分数?

我已经尝试添加test_dmatrix.set_group(group_test). 两种方法的输出结果非常吻合,例如:

[ 1.3535978  -2.9462705   0.86084974 ... -0.23594362  0.712791
 -1.633297  ]

所以我的问题如下:

  1. 为什么在 xgboost 中使用 'rank:pairwise' 时不需要设置测试组?

  2. 如何根据预测分数结果获取指定组查询的标签?

谁能给我解释一下?提前致谢。

2个回答

输出是一个可用于对样本进行排名的分数,这种排名问题的重点是您只关心同一组内的样本排名(您认为这是给定查询的结果) .

但这可以安全地留给您在测试集上。(实际上,您不妨只对每个组单独运行预测。您可能会将您的案例中的输出视为假设测试集全部来自单个查询。)对于测试集的评分,可能很重要指定的组是,但不仅仅是为了做出预测。

对于训练,需要组数据,因此算法知道不校准组间比较的排名。

另请参阅:
如何在 xgBoost 中拟合成对排名模型?
https://github.com/dmlc/xgboost/blob/master/doc/tutorials/input_format.rst#group-input-format

我将尝试回答您的问题:

  1. 训练/测试分组是机器学习/数据科学中的常见做法。这种分离的目的是呈现一些案例(训练),这样算法就可以在不记忆模型的情况下学习模型(过度拟合),这意味着模型解决了训练案例,然后用模型为测试中的案例提供了解决方案数据集。这样,解决方案对所有情况都是通用的。rank:pairwise 中的情况是相同的:您对训练数据集进行建模并将其应用于测试数据集(您不知道其输出)。

当您将模型应用于测试数据集时,您会得到一个解决方案,并将其与解决方案进行比较() 的测试数据集。这样你就有了一个真正的解决方案和一个模型解决方案。在数据科学中,两者的比较是模型的真正容量。

2. 如何根据预测得分结果获取指定分组查询的标签?

功能

pred = xgb_model.predict(test_dmatrix)

必须给你你正在寻找的标签。这段代码有什么问题?

注意:如果您的模型没有过度拟合,那么使用训练/测试分组进行验证是一种很好但不太常见的做法,并且在验证它没有过度拟合之后再次获得包含所有数据集的模型。