如何在 XGBoost 中拟合成对排名模型?

数据挖掘 搜索 排行 xgboost gbm
2021-10-01 23:14:10

据我所知,要训练学习对模型进行排名,您需要在数据集中拥有三样东西:

  • 标签或相关性
  • 组或查询 ID
  • 特征向量

例如,Microsoft Learning to Rank 数据集使用这种格式(标签、组 ID 和特征)。

1 qid:10 1:0.031310 2:0.666667 ...
0 qid:10 1:0.078682 2:0.166667 ...

我正在尝试利用 GBM 进行成对排名的 XGBoost。他们有一个排名任务的示例,该任务使用 C++ 程序在上面的 Microsoft 数据集上进行学习。

但是,我正在使用他们的 Python 包装器,似乎找不到可以输入组 ID 的位置(qid如上)。我可以只使用特征和相关性分数来训练模型,但我遗漏了一些东西。

这是一个示例脚本。

gbm = XGBRegressor(objective="rank:pairwise")

X =  np.random.normal(0, 1, 1000).reshape(100, 10)
y = np.random.randint(0, 5, 100)

gbm.fit(X, y) ### --- no group id needed???

print gbm.predict(X)

# should be in reverse order of relevance score
print y[gbm.predict_proba(X)[:, 1].argsort()][::-1]
2个回答

根据XGBoost 文档,XGboost 期望:

  • 同一组的例子是连续的例子,
  • 包含每个组大小的列表(您可以使用 Python 中的set_group方法设置DMatrix)。

set_group对排名非常重要,因为只有一组中的分数具有可比性。您可以根据他们在自己组中的分数对数据进行排序。

为了方便排名,您可以使用我的xgboostExtension