xgboost提供了python接口,同时部分支持sklearn。在分类任务和回归任务中提供了XGBClassifier和XGBRegressor两个类,这两个类可以当做sklearn中的estimator使用,与sklearn无缝衔接。
xgboost是支持rank任务的,但是它却没有提供rank功能的sklearn的支持。这对于像我这样的做ltr并且常用sklearn的开发人员是何等的不爽。
自己动手丰衣足食,实现一下。命名为XGBRanker。
note: 在我正在做这个事的时候发现github上已经有人在做这个事了,地址在此, 通过阅读他的代码我发现关于group的处置方法,我们的想法是一样的。所以我有一部分代码直接参考了他的。
主要工作如下:
- XGBRanker中
fit
和predict
的实现(参考https://github.com/bigdong89/xgboostExtension) - ndcg_score的实现
- 支持GridSearchCV
group问题
在sklearn中estimator的签名是这样的estimater.fit(X, y)
和estimator.predict(X, y)
,即,任务训练数据分为特征X
和labley
。 但是在ltr任务中,数据分为三部分X
、 y
、 group
,如下如所示:
为了保持签名一致,我的做法是将group
合并到featrue中,在XGBRanker的fit
,predict
等方法中再将其分离。
ndcg_score
评价ltr模型的一个重要标准就是ndcg。我实现了ndcg_at_5_scoring, ndcg_at_3_scoring, ndcg_at_10_scoring
三个指标。
note: 我没有使用继承_BaseScorer
的方法实现以上三个scoring。如果有需求我在增加。
GridSearchCV
sklearn提供了一些方便的工具用于Hyperparameter Tuning,如cross_val_score、validation curves和GridSearchCV,其中GridSearchCV是我常用的一个工具。
其实在GridSearchCV中的fit方法签名GridSearchCV.fit(X[, y, groups])
中可以看出GridSearchCV是支持groups参数的,通过阅读代码发现该参数是用于像GroupKFold
这样的数据分割类做交叉验证的,这个groups参数并没有传如estimater中。这也可以从侧面说明sklearn中的estimater最初的设计上只考虑了回归,分类和聚类这样的传统任务,为考虑ltr类型的任务。
代码介绍
- ndcg_scorer.py:实现
ndcg_at_5_scoring, ndcg_at_3_scoring, ndcg_at_10_scoring
- rank_GroupKFold.py:用于ltr的交叉验证数据分割方法,基于GroupKFold.py实现。
- rank_sklearn.py : XGBRanker实现类
- rank_util.py:工具类,用于第一列为group信息的数据
- xgbranker_sklearn_example.ipynb: 实例代码,包括模型训练,预测,GridSearchCV的使用
代码地址:https://github.com/Weirping/xgbranker_sklearn.git