XGBoost 基础教程

XGBoost 笔记

original icon
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.knowledgedict.com/tutorial/xgboost-intro.html

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)组里的陈天奇负责。

v0.1 初始版本

2014年3月27日,发布了 XGBoost 的初始版本 v0.1。

  • 主要是支持回归(regression)任务和二分类(binary classification)任务。

v0.2x 版本

  • 2014年5月20日,发布了 v0.2 版本;
    • 支持 python 模块;
    • 样本可调权重;
    • 支持 pairwise rank;
  • 2014年5月21日,发布了 v0.21 版本,修复了一个 v0.2 的一个 bug;
    • 修复 scale_pos_weight 参数在默认设置时,二分类任务错误运行的 bug;
  • 2014年8月23日,发布了 v0.22 版本;

v0.3x 版本

  • 2014年9月7日,发布了 v0.3 版本;
    • 支持 R 模块;
    • 更快的树结构模块,主要是可以采样特征(subsample columns)来实现,通过配置 bst:col_samplebytree=ratio
    • 引入 LambdaRank(实验版本);
    • 线性弱分类器(linear booster)支持并行化操作;
  • 2014年9月8日,发布了 v0.32 版本;
    • 增加了具有详细流程的 demo 文件夹;

v0.4x 版本

  • 2015年5月11日,发布了 v0.4 版本;
    • 可以在 YARN 分布式平台运行;
    • python 模块引入了 sklearn 包装模块;
    • 支持预设置树分裂参数;
    • 计数支持泊松回归;
  • 2016年1月14日,发布了 v0.47 版本;
    • 增加 Java API,允许 java 项目调用 xgboost;
    • 优化了 python 库和 R 库的一些 api;

v0.6 版本

  • 2016年7月29日,发布了 v0.6 版本;
    • 跳过 0.5 版本直接升级为 0.6 是因为内核有大量的升级;
    • 底层采用 c++ 11 的标准代码;
    • 可以通过 java 或 scala 使用,同时支持在 spark 和 flink 分布式平台上运行;
    • 随机数生成器默认为 std::mt19937
    • 从 dmlc-core 共享数据加载 pipeline 和日志记录模块;
    • 启用注册表模式以允许目标(objective)、指标(metric)、树构造函数(tree constructor)、数据加载器(data loader)等插件;

v0.7x 版本

  • 2017年12月30日,发布了 v0.7 版本;
    • 大量升级了 sklearn api;
    • 引入针对稀疏矩阵的 DMatrix 对象结构;
    • 重构 gbm 以允许更友好的缓存策略;
    • 鲁棒性更强的 DMatrix 类,从稀疏矩阵构造更友好;
    • 从 NumPy 二维矩阵更快地构建 DMatrix
    • 对 Solaris 和 ARM 的 Makefile 支持;
    • 添加 Dockerfile 和 Jenkinsfile 以支持 GPU 代码的持续集成;
  • 2018年4月11日,发布了 v0.71 版本,主要是修复一些问题;
    • 重构线性 booster(gblinear);
  • 2018年6月1日,发布了 v0.72 版本;
    • 从这个版本开始,计划每两个月发布一个新版本;
    • 修复多分类目标中的异常情况(接近零的二阶梯度);
    • 树的存储支持使用高精度的浮点值;

v0.8x 版本

  • 2018年8月13日,发布了 v0.80 版本;
    • JVM 包重大升级:为了整合 API,提升用户体验,我们对 XGBoost4J-Spark 的设计进行了重大重构;
    • 在 libsvm 数据结构支持 query id 列,主要针对 pairwise 和 listwise 的学习目标;
  • 2018年11月4日,发布了 v0.81 版本;
    • 使用 scikit-learn 接口进行 learning to rank;
    • R 接口支持基于 SHAP 的交互;
    • GPU predictor 可以使用多个 GPU 进行预测;
    • 分布式 XGBoost 支持更大规模的集群;
    • 针对 GPU 训练增加更多的目标函数;
  • 2019年3月3日,发布了 v0.82 版本;
    • 多核 CPU 训练时,更好的性能表现;
    • 新增分布式的快速直方图(histogram)算法;
    • 支持多节点多 GPU 训练;
    • XGBoost4J-Spark 支持多个验证数据集;
    • GPU 训练支持更多的指标函数;
    • 单节点支持列采样;
    • 日记级别通过 verbosity 参数设置,废弃之前的 silentdebug_verbose

v0.9 版本

  • 2019年5月18日,发布了 v0.9 版本;
    • python 包正式放弃 python 2.x,全面采用 python 3.x;
    • XGBoost4J-Spark 不支持 spark 2.3,开始使用 spark 2.4.x;
    • 强化了分布式训练;
    • GPU 训练多分类目标支持更多的指标函数;
    • 新增类似 Scikit-learn 的随机森林 API;
    • 在 GPU predictor 中使用外部存储器;
    • 支持 LIBSVM 文件中加注释;
    • 支持使用 CMake 将 XGBoost 嵌入到 C/C++ 应用中;

v1.0.x 版本

  • 2020年2月19日,发布了 v1.0.0 版本;
    • XGBoost 项目的一个重大里程碑;
    • Apache 风格的治理(governance)、贡献政策(contribution policy)和语义版本控制(semantic versioning);
    • 在多核 cpu 上更好的性能表现;
    • 改进了 Mac OSX 上的安装体验;
    • Kubernetes 上的分布式支持;
    • 支持 ruby 语言;
    • 针对多 GPU 和多节点扩展的新的本地 Dask 接口;
    • 对 NVIDIA 的 cuDF 数据集和 cuPy 矩阵数据的优先支持;
    • 特征交互选择现在可用于 approxgpu_hist 算法;
    • 加强 GPU 上 learning to rank,支持如下排序目标:NDGC, Map, Pairwise;
    • GPU 训练支持 gamma 参数;
    • GPU 训练支持使用外部存储;
    • 优化了 Scikit-Learn 接口;
    • XGBoost4J-Spark:重新设计了 checkpoint 机制;
    • XGBoost4J-Spark:处理本地代码(native code)抛出的错误;
    • 添加 BigDenseMatrix 以存储超过 Integer.MAX_VALUE 的元素;
    • 使用 JSON 进行鲁棒性更强的模型序列化;
  • 2020年2月21日,发布了 v1.0.1 版本,是针对 v1.0.0 版本一些小 bug 的修复;
  • 2020年3月3日,发布了 v1.0.2 版本,也是针对 v1.0.0 版本的 bug 的修复;

v1.1.x 版本

  • 2020年5月17日,发布了 v1.1.0 版本;
    • 多核 cpu;
    • Apache 风格的治理(governance)、贡献政策(contribution policy)和语义版本控制(semantic versioning);
    • 在多核 cpu 上更好的性能表现;
    • 确定 GPU 上回归和分类的算法;
    • 优化 GPU 使用外部存储;
    • 增加参数校验,检测未使用或不正确的参数;
    • 增加线程安全的 inplace_predict 预测函数;
    • 提升 Mac OSX 上 xgboost 的安装体验;
    • GPU 侧的数据矩阵可以直接从其他 GPU 库中获取;
    • 进一步使用 JSON 进行鲁棒性更强的模型序列化;
    • 优化与 Dask 的集成;
    • XGBoost4J-Spark:检查数据迭代器中的列数;
    • DMatrix 类的大重构;
    • python 包需要 pip 版本至少 19.0;
    • GPU 算法需要 CUDA 10.0 或更高版本;
    • silent 参数正式移除;
    • Makefile 正式删除;通过使用 CMake 来构建 XGBoost;
    • distcol updater 已删除;
    • 该版本最后支持 python 3.5,接下来的 v1.2.0 版本开始需要 python 3.6;
  • 2020年6月6日,发布了 v1.1.1 版本;

v1.2.x 版本

  • 2020年8月22日,发布了 v1.2.0 版本;
    • XGBoost4J-Spark 支持 GPU 算法;
    • XGBoost 支持 CUDA 11;
    • 新增一些目标和指标;
    • 优化与 scikit-learn 的集成;
    • 优化与 Dask 的集成;
    • 支持 Swift 语言;
    • XGBoost4J-Spark 需要 Spark 3.0 和 Scala 2.12;
    • XGBoost python 包需要 python 3.6 及更高的版本;
    • XGBoost 采用 C++14 标准;
  • 2020年10月14日,发布了 v1.2.1 版本,是针对 v1.2.0 的补丁版本,修复了一些小 bug;

v1.3.x 版本

  • 2020年12月9日,发布了 v1.3.0 稳定版本;
    • XGBoost4J-Spark:发生异常时优雅地取消任务,而不是直接 kill SparkContext;
    • GPUTreeSHAP:TreeSHAP 算法的 GPU 加速;
    • 新式的 Python callback API;
    • 允许对大数据使用 DeviceQuantileDMatrix 和 DaskDeviceQuantileDMatrix
    • 支持树模型的切片,predict 时可以通过 ntree_limit 参数指定迭代到的树上限;
    • 特征列子采样的权重支持;
    • 提升与 Dask 的集成;
    • 对分类特征的直接分割的支持(实验);
    • 英特尔 RAPIDS 内存管理器的实验性插件;
    • 英特尔 oneAPI 编程模型的实验性插件;
    • pickle 持久化 XGBoost 模型时将触发 JSON 序列化;
    • 在多 cpu 等方面的性能提升;
    • 一些 API 增加了参数;
    • 重要变化:分类的默认评估指标从 accuracy 更改为 logloss / mlogloss
    • 重要变化:skmaker 移除;
    • 重要变化:JSON 格式模型不再存储叶子子节点数;
    • 重要变化:Mac 平台上运行该版本需要 MacOS 10.14(Mojave)以及更高版本;
  • 2020年12月22日,发布了 v1.3.1 版本,是针对 v1.3.0 版本的补丁;
  • 2021年1月13日,发布了 v1.3.2 版本,也是补丁版本,修复了 v1.3.0 及 v1.3.1 的一些 bug;
  • 2021年1月20日,发布了 v1.3.3 版本,也是 v1.3.x 系列版本的补丁;

v1.4.x 版本

  • 2021年4月11日,发布了 v1.4.0 稳定版本;
    • 引入 R 语言的预构建二进制包,同时也支持 GPU;
    • 预测方法的改进;
    • Dask 接口的改进;
    • Xgboost 内部实现了 ROC-AUC 指标计算;
  • 2021年4月20日,发布了 v1.4.1 版本,是针对 v1.4.0 版本的补丁;
  • 2021年5月13日,发布了 v1.4.2 版本,也是补丁版本;

v1.5.x 版本

  • 2021年10月18日,发布了 v1.5.0 稳定版本;
    • 支持离散特征的处理,但是需要通过 gpu_hist 算法训练;
    • 引入 R 语言的预构建二进制包,同时也支持 GPU;
    • 预测方法的改进;
    • Dask 接口的改进;
    • Xgboost 内部实现了 ROC-AUC 指标计算
  • 2021年11月23日,发布了 v1.5.1 补丁版本;
    • 所有 GPU 的训练都基于 CUDA 11.0 构建;
  • 2022年1月17日,发布了 v1.5.2 补丁版本;

v1.6.x 版本

  • 2022年4月16日,发布了 v1.6.0 稳定版本;
    • python 包需要最低 python 3.7;
    • histapprox 和 gpu_hist 三种方法都支持离散特征的处理;
    • 该版本开始试验性地支持多输出模型;
    • approxhist 两种方法完整支持外存;
    • 基于 hist 树方法重写了 approx
    • 基于 json 的模型序列化引入了更高效的 UBJSON 序列化格式;
  • 2022年5月9日,发布了 v1.6.1 补丁版本;
    • 开始支持 Spark barrier mode;
  • 2022年8月23日,发布了 v1.6.2 补丁版本;

v1.7.x 版本

  • 2022年11月1日,发布了 v1.7.0 稳定版本;
    • python 包需要最低 python 3.8;
    • 引入新的模块 xgboost.spark,其包含 xgboost.spark.SparkXGBRegressorxgboost.spark.SparkXGBClassifierxgboost.spark.SparkXGBRanker 等;
    • 开始试验性地支持联邦学习(federated learning)和新的网络通信;
    • 支持 mae(mean absolute error)优化目标;
    • 利用 pyodide 可以通过浏览器使用 xgboost;
    • Dask 试验性地支持 IPv6;
  • 2022年11月3日,发布了 v1.7.1 补丁版本;
  • 2022年12月8日,发布了 v1.7.2 补丁版本;
  • 2023年1月6日,发布了 v1.7.3 补丁版本;
什么是算法?简而言之,任何定义明确的计算步骤都可称为算法,接受一个或一组值为输入,输出一个或一组值。 ...
本节整理了 XGBoost 开发中的一些技巧及经验之谈。 ...
排序算法分为两大类,一是内部排序,即数据记录在内存中进行排序,另一个是外部排序,主要是因排序的数据很大,一次不能容纳全部的排序记录,在排序过 ...
Java 是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级 Web 应用开发和移动应用开发。 ...
查找是在大量的信息中寻找一个特定的信息元素,在计算机应用中,查找是常用的基本运算。折半查找的前提条件是需要有序表顺序存储,对于静态查找表,一 ...