XGBOOST中如何合适的成对排名模型?
题
据我所知,要训练学习对模型进行排名,您需要在数据集中有三件事:
- 标签或相关性
- 组或查询ID
- 特征向量
例如, 微软学习排名数据集 使用此格式(标签,组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]
解决方案
根据 XGBoost文档, ,XGBoost期望:
- 同一组的示例是连续的示例,
- 一个具有每个组大小的列表(您可以将其设置为
set_group
的方法DMatrix
在Python)。
其他提示
set_group
对于排名非常重要,因为只有一个组中的分数是可比的。您可以根据自己的小组分数对数据进行排序。
对于简单排名,您可以使用我的 XGBoostExtension.