XGBoost 版本演进技术指南:从 2.0 多目标树、device 参数统一到学习排序与分布式新架构
【免费下载链接】xgboostScalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink and DataFlow项目地址: https://gitcode.com/gh_mirrors/xg/xgboost
导读
本文基于仓库根目录的 NEWS.md(即 XGBoost Change Log)整理而成,系统梳理 XGBoost 从 v0.1(2014 年)到 2.0.0(2023 年)的完整版本演进脉络。文章以 2.0.0 的重大架构变革(向量叶子多目标树、device参数统一、hist成为默认树方法、学习排序重写)为主体,结合仓库源码 src/tree/hist/hist_param.h、src/objective/lambdarank_obj.cc、src/context.cc 等实现细节进行验证与展开。读者读完可获得:2.0 迁移所需的完整破坏性变更清单、新参数(device、max_cached_hist_node、lambdarank_*)的用法与底层原理,以及 1.7 系列引入的QuantileDMatrix、PySpark 接口、分类特征支持等关键能力的演进背景。
说明:按照 NEWS.md 的说明,从 2.1.0 开始,发布说明已迁移到
doc/changes/目录下的文档中(如 doc/changes/v2.1.0.rst、doc/changes/v3.0.0.rst 等),本文件继续按时间倒序记录 2.0.0 及更早版本的变更。
一、XGBoost 2.0.0:一次面向未来的大版本重构
2.0.0(2023 年 8 月 16 日发布)是继 1.0.0 之后的又一个里程碑式大版本。它的核心主题可以概括为四个词:统一设备选择、默认算法切换、多目标原生支持、学习排序重写。
1.1 新的device参数:统一设备选择入口
在 2.0 之前,用户需要分别通过gpu_id、gpu_hist、gpu_predictor、cpu_predictor、gpu_coord_descent以及 PySpark 特有的use_gpu等一组参数来控制运行设备,参数繁多且容易混淆。
2.0 引入的device参数将这一组参数统一收编:用户只需通过device指定设备类型与设备序号即可。例如:
params = { "device": "cuda", # 指定在 CUDA 设备上运行 "tree_method": "hist", # 在 GPU 上执行 hist 树方法 }device="cuda", tree_method="hist"表示在 GPU 上运行hist树方法;device="cpu"则退回 CPU;- 该参数同样支持设备序号,例如
device="cuda:0"(可通过 src/context.cc 中的CUDAOrdinal逻辑看到,XGBoost 会校验可见 GPU 数量,并对超出范围的序号做取模回绕并给出警告)。
从源码看实现:src/context.cc 中定义了kDevice = "device"参数常量,训练、预测、数据构造共用的Context对象据此决定设备与线程配置。旧的gpu_hist行为被保留但标记为弃用;predictor参数则被直接移除(Python 包中同样移除,见 python-package/xgboost/core.py 的参数处理逻辑)。
1.2hist成为默认树方法
从 2.0 开始,hist(基于直方图的近似算法)成为默认tree_method。此前版本会根据输入数据与训练环境在approx与exact之间自动选择。新默认值让 XGBoost 训练更高效、行为更一致——直方图算法通过特征分箱(binning)将复杂度与数据规模解耦,是大规模训练事实上的标准路径。
1.3 多目标树(Multi-Target Trees)与向量叶子输出
这是 2.0 中处于"开发中"状态但方向性极强的特性:用一棵树同时为多个目标输出向量叶子(vector leaf),覆盖多目标回归、多标签分类与多分类任务。
此前 XGBoost 为每个目标各建一个独立模型;向量叶子方案则让一棵树同时拟合所有目标,带来的收益包括:
- 帮助防止过拟合(各目标共享树结构,天然引入正则化);
- 模型体积更小(树的数量可显著减少);
- 树结构能显式建模目标之间的相关性(correlation between targets)。
使用方式:训练时通过multi_strategy参数启用,并支持使用回调(callback)在一次训练会话中混合向量叶子树与标量叶子树。限制:目前仅有 CPU 上的hist(默认)树方法支持构建向量叶子树;相关实现分散在 src/gbm/gbtree.cc(训练入口)、src/gbm/gbtree_model.cc(模型存储)以及预测器 src/predictor/cpu_predictor.cc、src/predictor/gpu_predictor.cu 中。该特性的更多背景可参考 doc/tutorials/multioutput.rst(1.6 引入的多输出模型教程)。
1.4 直方图缓存上限参数max_cached_hist_node
为了控制 CPU 端直方图缓存的内存占用,2.0 新增max_cached_hist_node参数,用于限制直方图缓存的节点数上限。
底层原理:hist算法会缓存已计算节点的直方图以便复用,而缓存规模随树深度呈指数增长(每层节点数翻倍)。深树场景下缓存可能失控,该参数提供了硬性上限;不设缓存虽然可能略微降低性能,但不会影响模型精度,因此大多数用户无需配置。
从源码看默认值:src/tree/hist/hist_param.h 中HistMakerTrainParam定义:
NotSet()默认值(std::numeric_limits<std::size_t>::max());- CPU 默认缓存节点数
CpuDefaultNodes() = 1 << 16(65536); - CUDA 默认缓存节点数
CudaDefaultNodes() = 1 << 12(4096,因 GPU 显存更受限而取更小值); - 参数下限校验为 1(
set_lower_bound(1))。
同时,2.0 在分布式系统上通过把hist与approx的缓存减半,进一步压缩了内存占用。
1.5 外部内存(External Memory)支持大幅改进
外部内存(out-of-core)能力在 2.0 中仍标记为实验性,但性能显著提升:
- 用memory map(内存映射)替换了旧的文件 IO 逻辑;
- 降低了 CPU 内存占用;
- 补充了大量文档(见 doc/tutorials/external_memory.rst)。
使用建议:当QuantileDMatrix的内存节省不足以满足需求时,可以尝试使用hist树方法配合外部内存。底层数据迭代与分页读取逻辑可在 src/data/sparse_page_source.cc、src/data/file_iterator.cc 中查看。
1.6 Learning to Rank:全新实现
2.0 对学习排序任务进行了全新实现,新增/升级的能力包括:
| 特性 | 参数/说明 |
|---|---|
| 配对构造策略 | 新参数lambdarank_pair_method |
| 每组采样对数控制 | 新参数lambdarank_num_pair_per_sample |
| 无偏学习排序(实验性) | lambdarank_unbiased |
| NDCG 自定义增益函数 | ndcg_exp_gain |
| GPU 确定性计算 | 所有目标函数与评估指标在 GPU 上确定化 |
| 默认目标函数 | NDCG(原默认rank:pairwise不再默认) |
| 指标性能 | 使用缓存加速评估指标 |
| sklearn 工具 | XGBRanker获得 scikit-learn 工具链兼容 |
| 文档 | 专门的 learning-to-rank 教程 doc/tutorials/learning_to_rank.rst |
从源码看实现:src/objective/lambdarank_obj.cc 中可看到lambdarank_unbiased与ndcg_exp_gain在梯度计算路径中实际生效的分支(如增益计算处if (param_.ndcg_exp_gain)选择指数型增益);配对构造与分组策略的相关代码位于 src/common/ranking_utils.h 与 src/metric/rank_metric.cc。可运行的排序示例参见 demo/guide-python/learning_to_rank.py。
1.7 自动估计截距(Automatically Estimated Intercept)
此前base_score是用户手工设置的训练常量;2.0 起 XGBoost 会根据输入标签自动估计该参数,以获得更优的初始预测与精度。这意味着大多数场景下用户无需再手工调base_score。相关教程见 doc/tutorials/intercept.rst。
1.8 分位数回归(Quantile Regression)
2.0 正式支持分位数回归,其损失函数为分位数损失(也称 pinball loss)。XGBoost 还允许同时训练多个目标分位数——每个分位数对应一棵树,由quantile_alpha参数(可传列表)控制。例如:
params = { "objective": "reg:quantileerror", "quantile_alpha": [0.25, 0.5, 0.75], # 同时学习三个分位数 }实现位于 src/objective/quantile_obj.cc。同时,L1(reg:absoluteerror)与分位数回归两类目标因为缺乏有效的 Hessian(二阶导)值而使用自适应树,2.0 中它们支持按学习率缩放叶子值,提升收敛行为。
1.9 导出分箱切分点(Export Cut Value)
通过 Python 或 C 包,用户可以导出hist树方法使用的分位数(quantile)切分点——注意这不同于分位数回归。该能力便于用户理解特征分箱边界,相关接口见 python-package/xgboost/core.py 中 Booster 的数据导出方法。
1.10 列分片与联邦学习(Column-based Split & Federated Learning)
2.0 在列分片(按特征维度切分数据)上取得实质进展:
approx、hist、以及带向量叶子的hist均可配合按列切分的数据工作;- 支持纵向联邦学习(vertical federated learning)(特征在参与者间切分);
- GPU 支持仍在开发中。
这与 1.7 引入的横向联邦学习(基于 gRPC 联邦服务器聚合 allreduce)形成互补,详见下文 1.7 章节。分布式通信基础设施位于 src/collective/ 目录。
1.11 PySpark 接口成熟
2.0 中 PySpark 接口(python-package/xgboost/spark/)获得一批新特性:
- GPU 预测(
device参数驱动); - 数据初始化优化(避免栈操作);
- 支持预测特征贡献(feature contribution / SHAP);
- Python 类型标注支持;
use_gpu弃用,推荐device;eval_metric校验支持字符串列表;- 训练日志改进与多项维护性修复。
1.12 其他通用新特性与优化
- CSC 矩阵改用 array interface:XGBoost 统一线程数使用,并使 CSC 输入在按需类型转换下降低内存占用;
- CUDA compute 90 纳入默认构建;
- CPU 上 array interface(如 numpy)输入性能显著提升;
- 数据初始化相关的 CUDA 优化:使用最新 thrust 策略避免 GPU 设备同步;XGBoost 改为使用每线程 CUDA stream,防止与其他 stream 互相同步。
1.13 2.0 破坏性变更清单(迁移必读)
| 变更 | 说明 |
|---|---|
device统一 | gpu_id、gpu_hist、gpu_predictor、cpu_predictor、gpu_coord_descent、use_gpu均被device取代;predictor参数被移除 |
| 文本输入必须指定格式 | 必须显式给出文本输入格式;官方建议优先使用numpy.ndarray等第三方数据结构而非文本输入 |
Python 包移除ntree_limit | 该参数此前已弃用,2.0 中移除 |
| 移除单字符串特征信息 | 特征类型与特征名应使用字符串序列 |
save_model移除多余参数 | scikit-learn 接口的save_model不再接受额外参数 |
升级提示:若你的代码仍使用gpu_hist作为tree_method,2.0 下应改为device="cuda", tree_method="hist",二者在 GPU 上执行的是同一套直方图算法。
1.14 2.0 值得注意的 Bug 修复
- 线程安全的缓存:某些语言运行时用独立线程做垃圾回收,会破坏 XGBoost 的线程本地缓存;2.0 用轻量锁实现了线程安全缓存取而代之;
- 修复模型 IO 时未清空预测缓存的问题;
- 数据构造阶段即检查
inf值; - 保留已保存 updater 配置的顺序(使用
updater参数而非tree_method时可见); - 修复分类特征切分时的 GPU 显存分配问题;
- JSON 模型 dump 中特征名的转义序列(如
\t\n)处理; - 模型 IO 与文本输入的路径规范化(Windows 短路径、Unix 下含
~的路径),且所有路径输入要求 UTF-8 编码; - 修复 H100 上的整数溢出;
- 修复 GPU 上带分类特征的加权 sketching;
- 修复指标序列化(此前可能导致评估时部分指标丢失);
- 修复 MSVC x86 目标编译错误。
1.15 Python / R / JVM 包要点
Python 包(python-package/xgboost/):
- 支持 pyarrow 后端 pandas DataFrame 的原始类型;
- 警告消息改用 Python
warnings机制发出; plot_importance支持自定义条形图旁数值的格式化;- float16 半精度支持增强(pandas、cupy、cuDF,GPU 输入走 CUDA
__half,零拷贝); inplace_predict与QuantileDMatrix支持Series与 Python 原生类型;- 支持全部 pandas 可空整数类型;
- sklearn 接口的自定义指标支持
sample_weight; - 采用现代 Python 打包规范(PEP 517/518/621):
setup.py被 python-package/pyproject.toml 取代,并支持 Python 3.11; QuantileDMatrix缓存转换后的数据提升效率;DataIter只接受关键字参数;best_iteration仅在启用早停时定义(与文档行为一致)。
R 包(R-package/):
- 使用新的数据消费接口处理 CSR/CSC,线程数控制更好、性能提升;
- 训练时接受多个评估指标;
- 修复整数输入含
NA的问题;大量重构(感谢 @jameslamb 等贡献者)。
JVM 包(jvm-packages/):
- 预测不再使用 Rabit;
- 设置
feature_names与feature_types(为分类特征支持做准备); - 支持 Scala 2.13;
- 训练阶段从
ResultStage调整为ShuffleMapStage; - 早停自动设置最优分数的最大/最小方向;
- 破坏性变更:移除 Scala 版 tracker;
DeviceQuantileDmatrix更名为QuantileDMatrix; - 采用依赖机器人(dependabot)持续更新依赖。
二、1.7 系列:PySpark、QuantileDMatrix 与联邦学习的奠基
2.1 v1.7.0:特性密集的一次发布
1.7.0(2022 年 10 月)是 2.0 之前的"蓄力"版本,许多 2.0 特性的地基都源于此。
PySpark 初始支持:1.7 引入 PySpark 集成(实验性),接口改编自 databricks 的 PySpark XGBoost,并额外支持QuantileDMatrix与 rapidsai 插件(GPU 流水线)。用户可以在分布式集群上用 Python 定义自定义目标、回调用与指标。限制:分类特征与多输出模型暂不支持。教程见 doc/tutorials/spark_estimator.rst。
分类特征支持推进:1.7 中分类特征可以处理缺失值,并新增max_cat_threshold参数——该参数在使用分区算法(partition-based split)时启用,限制参与切分评估的类别数量,防止过拟合。sklearn 接口新增feature_types参数,允许为非 DataFrame 数据类型声明分类特征。完整教程见 doc/tutorials/categorical.rst。
实验性联邦学习与新通信模块collective:
- 联邦学习以 gRPC 联邦服务器实现,服务器聚合 allreduce 调用,联邦客户端在本地数据上训练,可使用
approx、hist、gpu_hist等现有树方法; - 目前仅支持横向联邦学习(样本在参与者间切分,各方拥有全部特征与标签);
- 未来计划包括纵向联邦学习以及同态加密、差分隐私等更强的隐私保障;
- 作为配套,1.7 用新的
collective模块替换了旧rabit模块作为网络通信接口,支持运行时选择后端(rabit或federated),此前后端在编译期固定不可改。相关代码见 src/collective/ 目录。
QuantileDMatrix:XGBoost 将内部的DeviceQuantileDMatrix(及其分布式版本)扩展支持 CPU 并更名为QuantileDMatrix。它针对hist/gpu_hist优化内存使用,对稠密数据尤其能显著降低 CPU 内存。特性要点:
- 可由 CPU 或 GPU 数据构造,且无论数据来源,构造出的实例都能被 CPU 与 GPU 算法用于训练与预测(设备不匹配时有一定转换开销);
- 新增
ref参数,可用它构造验证/测试数据集(复用训练数据的分箱结构,无需重新扫描); - 在 sklearn 接口中,当用户指定了受支持的树方法时默认使用。
参考实现:python-package/xgboost/data.py 中的QuantileDMatrix类,以及 src/data/quantile_dmatrix.cc。配套演示见 demo/guide-python/quantile_data_iterator.py。
平均绝对误差(MAE)目标:reg:absoluteerror加入目标函数家族。其特殊之处在于 MAE 的 Hessian 恒为零——而 XGBoost 依赖牛顿优化,缺少有效 Hessian 时收敛可能很慢。为此 XGBoost 在训练算法中引入了线性搜索(line search)。实现可参考 src/objective/absolute_error_obj.cc。
XGBoost 跑在浏览器里:借助 pyodide 项目,XGBoost 现在可以在浏览器中运行。
Dask 接口实验性支持 IPv6。
hist与 GPU Hist 优化:
- CPU
hist支持按列构建直方图(可选,依据输入数据条件自动配置),更好地适配不同形状的数据集;直方图内核更好地利用 CPU 寄存器; - GPU hist 对宽数据集(wide dataset)性能显著提升,支持批处理节点构建(batched node build),降低内核延迟、提高吞吐,深树 +
depthwise策略下提升尤为明显。
1.7 破坏性变更:
- 移除
grow_local_histmakerupdater(极少使用且无测试); - 移除单精度直方图(浮点误差大且危险);
- 发布二进制不再支持已弃用的 CUDA 架构;
rabit模块被collective模块替换(drop-in replacement,支持运行时后端选择)。
其他亮点:DMatrix/QuantileDMatrix新增get_data方法(Python 与 C)取回数据;修复 GPU 上缺失值的"幽灵梯度"(浮点误差导致);参数校验不再是实验特性;支持 IBM i 操作系统;Python 最低版本升至 3.8;XGBoostError的 sklearn 兼容性改进;scikit-learn 接口feature_names_in_属性等。
2.2 v1.7.6 / v1.7.5 / v1.7.4 / v1.7.3 / v1.7.2 / v1.7.1:补丁维护
- 1.7.6:修复混合稠密/稀疏分区的分布式训练;修复大树的 CPU 单调约束;Spark 模型 UID 与 estimator 一致;
QuantileDMatrix预测优化。CRAN 上 R 包保持在 1.7.5。 - 1.7.5:C++ 标准升至 C++-17,默认 CTK 为 CUDA 11.8;修复 pyspark ranker 导入、Windows wheel 与 Poetry 兼容性、GPU hist 列采样等。
- 1.7.4:R 包 macOS OpenMP 检测修复;numpy 数组对齐检查;gpu_hist 评估器列采样下的特征交互修复等。
- 1.7.3:
get_params不再返回内部配置值(Breaking);修复 L1 误差崩溃、CPU-only 构建加载 GPU pickle 模型、未见类别推理等。 - 1.7.2:适配更新的 thrust/libcudacxx;CUDA array interface 支持空值;AIX 平台
getsockname替换;pyspark 按 qid 排序等。 - 1.7.1:恢复
xgboost.rabit以保持向后兼容。
三、1.6 与 1.5:分类特征、外部内存与序列化格式变革
3.1 v1.6.0(2022 年 4 月)
分类特征支持全面化:Python 与 C 包中,hist、approx、gpu_hist全部支持分类数据训练。更重要的是引入了基于分区的分类切分(partition-based categorical split)——此前只支持 one-hot 式切分(形如x ∈ {c},特征与单个类别比较),新版本支持更富表达力的x ∈ S(特征与多个候选类别比较)。相关代码见 src/common/categorical.h 与 src/tree/hist/evaluate_splits.h。
多输出模型实验性支持:包括多输出回归与多标签分类;XGBClassifier支持 base margin 而无需用户手动展平输入。初始版本为每个目标各建一个模型(类似 sklearn 的 meta estimator)。教程见 doc/tutorials/multioutput.rst。
外部内存特性完备:基于迭代器接口,hist与approx在训练与预测时逐批迭代数据,移除了此前hist把所有 batch 拼成内部表示的逻辑,数据规模可扩展性更高(磁盘 IO 可能带来性能下降)。
重写approx:基于hist重写,消除功能差距并提升性能。用户可见变化包括:支持max_leaves与max_depth、支持grow_policy、单调约束、特征权重;用max_bin取代sketch_eps;支持分类数据;分布式训练性能与鲁棒性提升;depthwise策略下外部内存性能显著改善。
新序列化格式(UBJSON):在 JSON 基础上引入 UBJSON 作为更高效的备选,并计划逐步淘汰旧二进制模型格式。用户可在序列化函数中通过扩展名json或ubj选择格式;save_raw新增格式参数(json、ubj、deprecated);默认内部序列化格式改为 UBJSON(影响 Python pickle 与 R RDS)。模型 IO 相关实现见 include/xgboost/json_io.h,文档见 doc/tutorials/saving_model.rst。
其他:新增huber_slope参数(Pseudo-Huber 目标);aucpr指标重写并支持 GPU;指标计算改双精度;max_leave与max_depth默认行为统一;评估指标与线性模型结果确定性;num_parallel_tree从训练超参改为模型参数(修复随机森林模型 IO);Dask 接口不再视为实验性;Python 最低版本 3.7;Apple Silicon 预编译 wheel;R 包load.raw可返回 booster 等。
3.2 v1.5.0(2021 年 10 月)
分类特征:1.3 引入的原生分类特征(免 one-hot)在此版本得到全面完善——预测、SHAP、特征重要性、模型绘图均原生支持分类切分(形式仍为x ∈ {v});numpy/cupy、cuDF/pandas/modin 等数据结构全部支持。当时的启用条件为:Python 包 +gpu_hist+ JSON 模型格式。
外部内存新接口:全新的迭代器式外部内存实现(沿用DeviceQuantileDMatrix的数据迭代器),同时移除 lz4 压缩。该接口当时仍属实验性,官方建议从旧的"URL 后缀"式接口迁移。
其他:min_delta加入早停回调;Python 支持约束按特征名配置;R 包predict新增iteration_range;JVM 包支持 GPU dataframe 与DeviceQuantileDMatrix;CUDA compute capability 86 纳入默认构建;GPU 直方图构建提速(大数据集训练时间 2–3 倍提升)、移除deterministic_histogram参数(GPU 算法总是确定性);n_gpus移除;C API 的 Quantile DMatrix 与外部内存接口对齐。
四、1.0 ~ 1.4:现代化与生态扩展的关键阶段
4.1 v1.4.x(2021 年)
- R 包 GPU 预编译二进制:
R CMD INSTALL ./xgboost_r_gpu_linux.tar.gz即可安装带 GPU 支持的 R 包; - 预测函数统一重构:C API 与 Python API 预测接口统一,sklearn 接口默认使用 inplace predict,所有树模型预测线程安全,新增
strict_shape参数; - Dask 接口功能完备:支持学习排序(qid 分组)、SHAP、随机森林、安全 pickle、类型提示;预测显著加速;
- ROC-AUC 重实现:支持多分类与更广的排序任务,分布式平均语义更清晰;
- 全局配置:Python/R/C 接口支持全局参数(
verbosity、use_rmm); - array interface 增强:接受任意数组 strides(列主序支持、零拷贝),支持
__cuda_array_interface__v3; - 破坏性变更:预测函数的
data参数更名为X;不再生成伪特征名;binary:logitraw默认指标改为logloss。
4.2 v1.3.0(2020 年 12 月)
- GPUTreeSHAP:CUDA 加速 TreeSHAP,GPU 上计算 SHAP 特征归因;
- 新风格 Python 回调 API:可用惯用 Python 设计训练扩展,支持 Dask 原生 API 早停(python-package/xgboost/callback.py);
- 大型数据
DeviceQuantileDMatrix:绕过 >2^31 元素的 CUB/Thrust 整数溢出; - 模型切片:
[start, end)区间切分树集成;早停回调支持save_best; - 加权列采样:按特征权重采样,权重为 0 的特征永不参与切分(demo/guide-python/feature_weights.py);
- 分类特征直接切分(实验性):测试节点条件形如
feature_value ∈ match_set,须配合 JSON 模型序列化; - RMM 插件:共享 GPU 内存池(demo/rmm_plugin/README.md);
- oneAPI 实验性插件;
- 破坏性变更:分类默认指标改为
logloss/mlogloss(与binary:logistic目标在统计上一致);skmaker移除;JSON 模型不再存储叶子子节点数;要求 macOS 10.14+; - 性能:DMatrix 构建提速至 3.7x、CPU 预测 3.6x、
BuildHist线程本地内存分配 1.7x、JSON 序列化 1.5–2x(intrusive pointer)。
4.3 v1.2.0(2020 年 8 月)
- XGBoost4J-Spark 支持 GPU 训练;支持 CUDA 11 构建;
- R 环境模型持久化指引:推荐
xgb.save()/xgb.save.raw()而非saveRDS()(旧 RDS 兼容层仅为临时措施); - 新目标/指标:
reg:pseudohubererror(指标mphe);survival:aftGPU 加速; - sklearn 集成:
n_features_in_、XGBoostError继承ValueError; - Dask:异步接口、
DaskDeviceQuantileDMatrix零拷贝 GPU 阵列摄入、预测返回 GPU Series; - 外部数据类型处理逻辑集中重构;
- JSON 序列化增强:更快更小、Ryū 算法保证 round-trip 可复现与 locale 无关、支持从 S3 等远程源加载;
- 破坏性变更:
DaskXGBClassifier.predict()改为输出类别(概率用predict_proba());自定义评估指标接收原始(未变换)预测;XGBoost4J-Spark 要求 Spark 3.0 / Scala 2.12;Python 要求 3.6+;采用 C++14 标准。
4.4 v1.1.0(2020 年 5 月)
- 多核 CPU 性能缩放修复(Intel CPU 上效果显著);GPU 回归/分类算法确定化(单 GPU);
- GPU 外部内存:基于梯度的采样(gradient-based sampling)智能选择子集拷入显存;
- 参数校验:拼写错误的参数不再被静默忽略(sklearn 与 R 绑定同样生效);
- 线程安全的
inplace_predict():无需构造DMatrix,直接对numpy.ndarray/scipy.sparse.csr_matrix/cupy.ndarray/cudf.DataFrame/pd.DataFrame就地预测,可用共享模型对象服务并发请求; - 生存分析目标
survival:aft(加速失效时间模型),支持区间标签(doc/tutorials/aft_survival_analysis.rst); - macOS 安装简化:
brew install libomp+pip install xgboost; DeviceQuantileDMatrix:直接从 GPU 内存摄入数据(与 cuDF、cuPy、PyTorch 互通);- 破坏性变更:要求 Pip 19.0+;GPU 算法要求 CUDA 10.0+;移除
silent(用verbosity);自定义目标默认output_margin=True;移除 Makefile(统一 CMake);移除distcolupdater。
4.5 v1.0.x(2020 年 2–3 月)
1.0.0 是项目现代化里程碑:
- Apache 风格治理与语义化版本(semantic versioning)——主版本号变更即代表序列化格式不兼容;
- 多核 CPU 性能缩放重大改进;macOS 安装体验彻底改善;
- Kubernetes 分布式训练教程;Ruby 绑定;原生 Dask 接口(多 GPU/多节点,比上版本快 20%);
- cuDF/cuPy 一等公民支持:数据全程留在 GPU 显存,接受任何暴露
__array_interface__的结构; - 特征交互约束扩展到
approx与gpu_hist;学习排序 GPU 加速(NDCG/MAP/Pairwise); - 外部内存 GPU 训练(实验性);
- JSON 模型序列化(实验性引入):拆分"模型"与"内部配置",
save_model只保存模型,保证模型文件可在任意机器加载(修复 GPU 模型在无 GPU 机器上无法加载的问题); - 参数校验:未使用/拼写错误参数给出警告;
save_config()可检查全部生效训练参数; - 单个 worker 故障恢复(实验性);
- 破坏性变更:要求 Python 3.5+、CUDA 9.0+;移除
n_gpus(多 GPU 训练需分布式框架);移除gpu_exact、learning_rates、num_roots、GPU 前缀目标(如gpu:reg:linear);XGBoosterPredict()新增training参数;统一使用 CMake 构建。
五、0.x 时代:从初版到 GPU 与分布式生态成型
5.1 v0.90(2019 年 5 月)
- Python 包放弃 Python 2.x;XGBoost4J-Spark 要求 Spark 2.4.x(缺失值处理一致性修复);
- sklearn 风格随机森林 API:
XGBRFClassifier/XGBRFRegressor; - GPU 预测器支持外部内存输入(见 demo/c-api/basic/ 等 C 示例);CMake 提供
xgboost::xgboost目标方便嵌入 C/C++ 应用; - 多分类指标
merror/mloglossGPU 化;reg:linear弃用,改用reg:squarederror。
5.2 v0.82(2019 年 3 月)
- 分布式
hist算法;多节点多 GPU 训练(rabit AllReduce 传递 GPU 信息); colsample_bynode节点级列采样(与colsample_bytree/colsample_bylevel累积生效);verbosity日志级别(0 静默 / 1 警告 / 2 信息 / 3 调试),silent与debug_verbose弃用;- 外部内存多项重大修复;XGBoost4J 系列早停语义与 Python 对齐。
5.3 v0.81 / v0.80(2018 年)
- 特征交互约束(feature interaction constraints);sklearn 接口学习排序(
XGBRanker);R 接口 SHAP 交互; - GPU 预测器支持多 GPU 并行预测;大规模集群扩展(1.5k executors、120 亿行数据集);
- 新 GPU 目标函数:
hinge、multi:softmax、multi:softprob、count:poisson、reg:gamma、reg:tweedie; - XGBoost4J-Spark 重大重构(Spark ML Pipeline 风格 API、camelCase 与下划线双风格参数);
- GPU:NCCL2 多 GPU、共享内存原子操作加速、动态显存分配;LIBSVM 文件支持 qid 列;
binary:hinge目标;datatable 输入;total_gain/total_cover重要性指标。
5.4 v0.7x(2017–2018)
- v0.72:GPU 加速坐标下降;sklearn API 全面参数化(
n_jobs、random_state、booster 选择、sample_weight、训练续跑xgb_model); - v0.71:
pip install可用性大幅提升;gblinear重构支持多坐标下降 updater;hist/gpu_hist近似分位数 sketch 修复;L1/L2 正则按样本数归一化(与 sklearn/glmnet 一致)为破坏性变更; - v0.7(2017 年末,距 v0.6 一年半):直方图树算法
hist、GPU 树算法gpu_hist/gpu_exact、DART、单调约束、AVX、JSON 模型导出、Tweedie 回归、模型原地更新;sklearn 兼容层;JVM 包支持 Spark/Flink 分布式训练、早停、排序任务。
5.5 v0.6 及更早(2014–2016)
- v0.6:核心库大规模重构(模块化、C++11、
std::mt19937、插件注册机制);tree_method参数正式化;libxgboost.so;JVM 包支持 Flink 与 Spark;DART booster;CMake 构建系统; - v0.47:R 包缺失值语义切换(0 → NA);Python 包异常化、重要性/树绘图、逐轮学习率、训练续跑、CV 早停、pip 安装;Java API 可用;
- v0.4:YARN 分布式版本(十亿级样本)、S3/HDFS 直读、R 特征重要性可视化、泊松回归、早停、R/Python 原生保存加载、sklearn wrapper、实验性外部内存;
- v0.3:列采样(
bst:col_samplebytree)、从初始预测提升、LambdaRank 实验版、并行线性提升器、R 模块; - v0.2x / v0.1:Python 模块、样本加权、pairwise rank 初版(2014 年 3 月首次发布)。
六、总结:如何根据版本演进规划你的升级路线
| 关注点 | 建议版本与配置 |
|---|---|
| 新项目默认配置 | 2.0+,使用tree_method="hist",GPU 场景加device="cuda" |
| 老代码迁移 | 重点处理device参数替换(1.7 的gpu_hist写法 →device="cuda", tree_method="hist")、predictor移除、文本输入格式显式化 |
| 内存受限场景 | 2.0 的max_cached_hist_node+QuantileDMatrix(ref参数复用分箱) |
| 排序/搜索业务 | 2.0 的lambdarank_*参数族与 NDCG 默认目标,参考 doc/tutorials/learning_to_rank.rst |
| 多输出/多标签 | 2.0 向量叶子多目标树(实验性,CPUhist),或 1.6 起的多输出模型(doc/tutorials/multioutput.rst) |
| 分布式生态 | Dask(doc/tutorials/dask.rst)、PySpark(doc/tutorials/spark_estimator.rst)、JVM(jvm-packages/)、联邦学习(collective后端,src/collective/) |
最后提醒:发布说明自 2.1.0 起迁移至 doc/changes/ 目录,查看最新版本特性请直接阅读该目录下的对应版本文件(如 doc/changes/v3.4.0.rst),仓库根目录 NEWS.md 继续按时间倒序保留 2.0.0 及更早版本的历史记录。
【免费下载链接】xgboostScalable, Portable and Distributed Gradient Boosting (GBDT, GBRT or GBM) Library, for Python, R, Java, Scala, C and more. Runs on single machine, Hadoop, Spark, Dask, Flink and DataFlow项目地址: https://gitcode.com/gh_mirrors/xg/xgboost
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考