XGBoost 基础教程

XGBoost 笔记

XGBoost 算法简介


XGBoost 是一个 GBDT 即梯度提升算法的开源实现软件库,是 eXtreme Gradient Boosting 的简写,表示 XGBoost = Extreme + Gradient Boosting;此外,它为 C++、Java、Python、R、Julia 提供了已实现的框架,支持 Linux、Windows 和 Mac OS 平台。XGBoost 除了可以在单一机器上运行,也支持在 Apache Hadoop、Apache Spark、Apache Flink 等分布式框架上运行。 

优势

我们知道 XGBoost(eXtreme Gradient Boosting)是 Gradient Boosting 算法的一个优化的版本,它在标准的 Gradient Boosting 算法细节上做了很多的优化,主要如下:

正则化

xgb 实际上是以“正则化提升(regularized boosting)”技术而闻名。

  • 标准的 GBM 实现没有像 XGBoost 这样的正则化步骤;正则化对减少过拟合有非常大的帮助。

并行处理

  • XGBoost 可以实现并行处理,相比 GBM 有了速度的飞跃;其实,xgboost 的并行不是在树粒度的并行,它的并行是在特征粒度上的,它利用一种可并行的近似直方图算法,用于高效地生成候选的分割点,具体细节参考其它章节。
  • 高版本的 XGBoost 也支持在 Hadoop、Spark 平台上实现。

缺失值处理

  • XGBoost 内置处理缺失值的规则。
  • 用户需要提供一个和其它样本不同的值,然后把它作为一个参数传进去,以此来作为缺失值的取值。XGBoost 在不同节点遇到缺失值时采用不同的处理方法,并且会学习未来遇到缺失值时的处理方法。

剪枝

  • 当分裂时遇到一个负损失时,GBM会停止分裂。因此GBM实际上是一个贪心算法
  • XGBoost 会一直分裂到指定的最大深度(max depth),然后回过头来剪枝。如果某个节点之后不再有正值,它会去除这个分裂。
  • 这种做法的优点,当一个负损失(如 -2)后面有个正损失(如 +10)的时候,就显现出来了。GBM 会在 -2 处停下来,因为它遇到了一个负值。但是 XGBoost 会继续分裂,然后发现这两个分裂综合起来会得到 +8,因此会保留这两个分裂。

内置交叉验证

  • XGBoost 允许在每一轮 boosting 迭代中使用交叉验证,通过其可以方便地获得最优 boosting 迭代次数,往往通过训练参数 early_stopping_rounds 设置,改参数指定如果连续几轮 loss 不下降迭代训练就会停止。
  • 而 GBM 使用网格搜索,只能检测有限个值。

自定义优化目标和评价标准

  • XGBoost 允许用户定义自定义优化目标和评价标准,比较灵活。

历史及版本

XGBoost 最初是一个研究项目,由当时在 Distributed (Deep) Machine Learning Community(DMLC)组里的陈天奇负责。

  • 2014 年 3 月 27 日,发布了 XGBoost 的初始版本 v0.1;
  • 2014 年 5 月 20 日,发布了 v0.2x 版本;
    • 支持 python 模块;
    • 样本可调权重;
    • 支持 pairwise rank;
  • 2014 年 9 月 7 日,发布了 v0.3 版本;
    • 支持 R 模块;
    • 更快的树结构模块,主要是可以采样特征(subsample columns)来实现,通过配置 bst:col_samplebytree=ratio
    • 引入 LambdaRank(实验版本);
    • 线性弱分类器(linear booster)支持并行化操作;
  • 2015 年 5 月 11 日,发布了 v0.4 版本;
    • 可以在 YARN 分布式平台运行;
    • python 模块引入了 sklearn 包装模块;
    • 支持预设置树分裂参数;
    • 计数支持泊松回归;
  • 2016 年 1 月 14 日,发布了 v0.47 版本;
    • 增加 Java API,允许 java 项目调用 xgboost;
  • 2016 年 7 月 29 日,发布了 v0.6 版本;
    • 跳过 0.5 版本直接升级为 0.6 是因为内核有大量的升级;
    • 底层采用 c++ 11 的标准代码;
    • 可以通过 scala 使用,同时支持在 spark 和 flink 分布式平台上运行;
  • 2017 年 12 月 30 日,发布了 v0.7 版本;
    • 大量升级了 sklearn api;
    • 引入针对稀疏矩阵的 DMatrix 对象结构;
  • 2018 年 4 月 11 日,发布了 v0.71 版本;
  • 2018 年 6 月 1 日,发布了 v0.72 版本;
  • 2018 年 7 月 8 日,发布了 v0.72.1 版本;
  • 2018 年 8 月 13 日,发布了 v0.80 版本;
    • 在 libsvm 数据结构支持 query id 列,主要针对 pairwise 和 listwise 的学习目标;
  • 2018 年 11 月 4 日,发布了 v0.81 版本;
  • 2019 年 3 月 3 日,发布了 v0.82 版本;
  • 2019 年 5 月 18 日,发布了 v0.9 版本;
    • python 包正式放弃 python 2.x,全面采用 python 3.x;
    • XGBoost4J-Spark 不支持 spark 2.3,开始使用 spark 2.4.x;
  • 2020 年 2 月 19 日,发布了 v1.0.0 版本;
    • XGBoost4J 重大里程碑;
    • Kubernetes 的分布式支持;
    • 支持如下排序目标:NDGC, Map, Pairwise
  • 2020 年 2 月 21 日,发布了 v1.0.1 版本,是针对 v1.0.0 版本一些小 bug 的修复;
  • 2020 年 3 月 3 日,发布了 v1.0.2 版本,也是针对 v1.0.0 版本的 bug 的修复;
  • 2020 年 5 月 17 日,发布了 v1.1.0 版本;
  • 2020 年 6 月 6 日,发布了 v1.1.1 版本;
  • 2020 年 8 月 22 日,发布了 v1.2.0 版本;
    • XGBoost4J-Spark 支持 GPU 算法;
    • XGBoost 支持 CUDA 11;
    • 加强 scikit-learn 的集成;