Xgboost Rank in Sklearn

xgboost提供了python接口,同时部分支持sklearn。在分类任务和回归任务中提供了XGBClassifier和XGBRegressor两个类,这两个类可以当做sklearn中的estimator使用,与sklearn无缝衔接。

xgboost是支持rank任务的,但是它却没有提供rank功能的sklearn的支持。这对于像我这样的做ltr并且常用sklearn的开发人员是何等的不爽。

自己动手丰衣足食,实现一下。命名为XGBRanker。

note: 在我正在做这个事的时候发现github上已经有人在做这个事了,地址在此, 通过阅读他的代码我发现关于group的处置方法,我们的想法是一样的。所以我有一部分代码直接参考了他的。

主要工作如下:

  1. XGBRanker中fitpredict的实现(参考https://github.com/bigdong89/xgboostExtension)
  2. ndcg_score的实现
  3. 支持GridSearchCV

group问题

在sklearn中estimator的签名是这样的estimater.fit(X, y)estimator.predict(X, y),即,任务训练数据分为特征X和labley。 但是在ltr任务中,数据分为三部分Xygroup,如下如所示:

为了保持签名一致,我的做法是将group合并到featrue中,在XGBRanker的fitpredict等方法中再将其分离。

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

参考

https://github.com/bigdong89/xgboostExtension