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
参数设置,废弃之前的silent
和debug_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
矩阵数据的优先支持; - 特征交互选择现在可用于
approx
和gpu_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;
hist
、approx
和gpu_hist
三种方法都支持离散特征的处理;- 该版本开始试验性地支持多输出模型;
approx
和hist
两种方法完整支持外存;- 基于
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.SparkXGBRegressor
、xgboost.spark.SparkXGBClassifier
和xgboost.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 补丁版本;