趋近智
虽然Scikit-Learn的GradientBoostingClassifier提供了经典算法的实现,但XGBoost从一开始就被设计为具有更高的效率和预测准确性。它的优点不仅是优化代码的结果,更源于显著的算法提升。这些改进解决了标准梯度提升机(GBM)的一些实际限制,使XGBoost成为一个更强大、更灵活的工具。
让我们看看使XGBoost区别于标准GBM实现的主要架构变化。
在标准GBM中,正则化通常是间接应用的。我们通过调整max_depth等超参数 (parameter) (hyperparameter)来限制树的大小,subsample来为每棵树使用部分数据,以及learning_rate来缩小每棵树的贡献,从而控制模型复杂度。尽管有效,但这本质上是启发式的。
XGBoost通过将其直接包含在它试图最小化的目标函数中来规范正则化。如本章概述中所述,目标函数包含两部分:训练损失和正则化项。
第一部分,,是衡量真实标签与预测值之间差异的损失函数 (loss function)。第二部分,,是XGBoost的创新之处。这一项惩罚添加到模型中的每棵树的复杂度。这一惩罚的具体公式是:
让我们分解一下:
T 是树中的叶子数量。w_j 是第j个叶子的得分(或权重 (weight))。通过最小化这个组合目标,XGBoost在很好地拟合训练数据和保持模型简单之间做出了直接权衡。这种内置的正则化是它在对抗过拟合 (overfitting)方面表现出色的主要原因。
实际数据集通常是稀疏的,包含许多缺失值或零项。大多数机器学习 (machine learning)算法要求你事先处理缺失值,例如,通过用平均值、中位数或常数来填充它们。
XGBoost通过其内置的稀疏感知分裂查找算法简化了这一过程。当在节点遇到缺失值时,XGBoost不会失败或要求填充。相反,在训练期间,它会为每个节点学习一个默认方向。
其工作原理如下:对于每个潜在的分裂点,算法通过评估两种情况来计算增益:
然后它选择产生更高增益(损失函数 (loss function)更大减少)的方向。当对含有缺失值的新数据进行预测时,它会将实例沿着该节点学习到的默认路径发送。这种方法比简单的填充更精巧,因为模型从数据本身学习处理缺失值的最佳方式。
对于具有许多连续特征的数据集,找到最优分裂可能计算量很大。贪婪算法需要评估每个特征的每个可能分裂点。对于大型数据集,这会成为性能瓶颈。
XGBoost采用近似分裂查找算法来加速这一过程。它不是枚举所有可能的分裂,而是首先根据特征分布的分位数提出一组有限的候选分裂点。然后算法只评估这些候选分裂以找到最好的一个。
这一过程通过加权分位数草图算法进一步优化。在梯度提升中,数据点并非一视同仁。那些被先前树预测较差的实例具有更大的梯度。XGBoost使用这些梯度(特别是二阶梯度,即Hessian)作为实例权重 (weight)。加权分位数草图算法在生成候选分裂时考虑这些权重,从而确保提议的分裂对模型难以处理的数据点更敏感。
XGBoost库在算法层面上被设计为高性能。
下图总结了标准GBM与XGBoost增强架构之间的主要差异。
标准梯度提升机和XGBoost架构方法的比较。XGBoost引入了正则化 (regularization)目标、原生缺失数据处理和优化的分裂查找作为主要特性。
总而言之,这些算法和系统层面的改进使得XGBoost成为一个快速、准确且可伸缩的梯度提升实现,非常适合多种机器学习 (machine learning)任务。
这部分内容有帮助吗?
© 2026 ApX Machine LearningAI伦理与透明度•