XGBoost
XGBoost 是一个梯度提升库,它逐个添加经过正则化的决策树,是表格数据的热门选择。介绍其工作原理并附代码。
XGBoost(极端梯度提升)是一个开源库,用于梯度提升决策树,也是表格数据领域使用最广泛的工具之一。Tianqi Chen 在华盛顿大学将其作为研究项目启动,并于 2014 年发布;2016 年与 Carlos Guestrin 合著的 KDD 论文 XGBoost:一种可扩展的树提升系统介绍了其正则化目标和系统设计。这个由 DMLC 社区维护的库可通过 Python、R、JVM 和 C 处理分类、回归及排序任务,可在 CPU 和 GPU 上运行,并可借助 Dask 和 Spark 扩展。论文报告称,Kaggle 博客在 2015 年公布的 29 个竞赛获胜方案中,有 17 个使用了 XGBoost。
XGBoost 的工作原理#
XGBoost 通过顺序方式构建集成模型:从一个常数预测开始,每轮提升增加一棵树,每棵树都针对之前树留下的损失进行优化。最终预测是各棵树输出的总和,每个输出都会乘以学习率(eta,默认值为 0.3)进行缩减,以避免某一棵树占主导地位。论文中的两个理念定义了每棵树的构建方式:
- 二阶目标:对于每一行,XGBoost 都会计算损失相对于当前预测的一阶和二阶导数,即梯度
g和 Hessianh。如果某个叶节点中各行的梯度总和为G、Hessian 总和为H,则该叶节点的权重为-G / (H + λ),这与二阶优化器采用的牛顿步相同。 - 正则化树:目标函数会为每个叶节点添加惩罚项
γ,并对叶节点权重添加 L2 惩罚项λ,还可选添加 L1 惩罚项α。只有当分裂增益½ [G_L²/(H_L + λ) + G_R²/(H_R + λ) − (G_L + G_R)²/(H_L + H_R + λ)] − γ为正时才保留该分裂,这就在树的构建过程中加入了正则化,并限制了过拟合。
树的深度有限制(max_depth,默认值为 6),除非 grow_policy="lossguide" 将生长方式切换为按叶节点生长,否则树会逐层生长。训练通常会在验证集上使用早停:
缺失值、速度和规模#
XGBoost 的稀疏感知分裂查找无需执行插补步骤,即可在存在缺失值的表格上训练。每次分裂时,它都会尝试将缺失值所在的行分别分配到左侧和右侧,并将增益较高的方向设为该节点的默认分支。同一机制还让它能够只扫描稀疏矩阵中实际存储的条目,例如独热编码矩阵。以下示例在 scikit-learn 的乳腺癌数据集中隐藏 30% 的特征值,并直接用缺失数据进行训练:
import numpy as np
import xgboost as xgb
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# Hide 30% of all values; each split learns a default branch for missing ones
rng = np.random.default_rng(0)
X_train_nan = np.where(rng.random(X_train.shape) < 0.3, np.nan, X_train)
X_test_nan = np.where(rng.random(X_test.shape) < 0.3, np.nan, X_test)
for name, train, test in [("complete", X_train, X_test), ("30% missing", X_train_nan, X_test_nan)]:
model = xgb.XGBClassifier(n_estimators=200, max_depth=4, learning_rate=0.1)
model.fit(train, y_train)
print(f"{name}: accuracy {model.score(test, y_test):.3f}")在完整数据上,它输出的测试准确率为 0.972;当训练集和测试集中都有 30% 的值缺失时,准确率为 0.951。
默认的 hist 树方法会将每个特征划分到至多 256 个分箱(max_bin),并在分箱边界上搜索分裂点,采用的方式与 LightGBM 相同;而 exact 会枚举每个排序后的值。设置 device="cuda" 可将训练移至 NVIDIA GPU,enable_categorical=True 可原生拆分类别列,而外存模式则能在大于 RAM 的数据集上训练。从 2.1 版开始,模型默认保存为二进制 UBJSON 格式。
XGBoost 与相关方法的比较#
- LightGBM: Microsoft 于 2016 年推出的提升框架,默认按叶节点生长树,并加入基于梯度的行采样和稀疏特征捆绑。如今两个库默认都使用直方图,并共享大多数技术。
- CatBoost: Yandex 的提升库,可构建对称树,并使用有序目标统计量编码类别特征。
- 随机森林: 一种装袋方法,在自助采样样本上独立训练深树并对结果求平均,可降低方差,且几乎不需要调参。
- 深度学习: 处理图像、音频和文本等非结构化输入的标准方法,网络能够从原始数据中学习特征。对于经过特征工程的表格数据,提升树仍是通常需要超越的基准;而 TabPFN 等表格基础模型如今也能在小型数据集上与之竞争。
实际应用#
- 欺诈检测和信用风险: 支付公司会根据金额、商户、地点、设备和账户历史等特征为每笔交易评分。这是预测建模的核心任务之一,而 XGBoost 的快速推理适合实时决策。
- 视觉检测:制造业质量系统会融合摄像头和传感器数据。Ultralytics YOLO26的预测结果提供摄像头侧的数据:
result.summary()会返回每个检测到的缺陷类别、置信度和边界框坐标;工厂可以按零件汇总这些结果,并与温度和压力读数关联,作为 XGBoost 故障预测模型的特征。 - 排序和点击预测:
XGBRanker默认使用rank:ndcg目标函数进行训练,以排列搜索结果;二分类器则用于预测广告点击率。 - 竞赛获胜类问题: KDD 论文列出了 2015 年获胜方案所解决的任务,包括商店销售额预测、高能物理事件分类、恶意软件分类,以及大规模在线课程辍学预测。










