基于树的集成方法:极端梯度提升(eXtreme Gradient Boosting, XGBoost)的数学原理、目标函数构建与优化求解过程
题目描述:
XGBoost是一种高效、灵活的梯度提升决策树(GBDT)实现。它通过对目标函数进行二阶泰勒展开,并加入正则化项来控制模型复杂度,从而在准确性与泛化能力之间取得平衡。请详细解释XGBoost的目标函数构建、正则化设计、泰勒展开近似、最优权重求解、树结构学习(分裂点选择)以及算法实现流程。
解题过程循序渐进讲解:
1. 问题形式化与目标函数构建
假设有数据集 \(D = \{(\mathbf{x}_i, y_i)\}\)(共 \(n\) 个样本,\(\mathbf{x}_i \in \mathbb{R}^m, y_i \in \mathbb{R}\))。集成模型由 \(K\) 棵回归树组成,预测输出为:
\[\hat{y}_i = \phi(\mathbf{x}_i) = \sum_{k=1}^K f_k(\mathbf{x}_i), \quad f_k \in \mathcal{F} \]
其中 \(f_k\) 是第 \(k\) 棵树,\(\mathcal{F}\) 是所有可能的回归树空间。目标函数为:
\[\mathcal{L}(\phi) = \sum_{i=1}^n l(y_i, \hat{y}_i) + \sum_{k=1}^K \Omega(f_k) \]
- \(l(y_i, \hat{y}_i)\) 是可微的损失函数(如平方损失、逻辑损失)。
- \(\Omega(f) = \gamma T + \frac{1}{2} \lambda \|w\|^2\) 是正则化项,其中 \(T\) 是树的叶子节点数,\(w \in \mathbb{R}^T\) 是叶子节点的权重向量,\(\gamma, \lambda\) 是控制复杂度的超参数。
正则化能防止过拟合,这是XGBoost相比传统GBDT的核心改进之一。
2. 目标函数的增量优化与泰勒展开
XGBoost采用加法训练(前向分步算法):在第 \(t\) 轮迭代,添加一棵新树 \(f_t\) 来优化当前模型。第 \(t\) 轮目标函数为:
\[\mathcal{L}^{(t)} = \sum_{i=1}^n l\left(y_i, \hat{y}_i^{(t-1)} + f_t(\mathbf{x}_i)\right) + \Omega(f_t) \]
对损失函数进行二阶泰勒展开(近似到二阶):
令 \(g_i = \partial_{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t-1)})\),\(h_i = \partial^2_{\hat{y}^{(t-1)}} l(y_i, \hat{y}^{(t-1)})\),则:
\[\mathcal{L}^{(t)} \approx \sum_{i=1}^n \left[ l(y_i, \hat{y}^{(t-1)}) + g_i f_t(\mathbf{x}_i) + \frac{1}{2} h_i f_t^2(\mathbf{x}_i) \right] + \Omega(f_t) \]
移除常数项 \(l(y_i, \hat{y}^{(t-1)})\),得到简化目标:
\[\tilde{\mathcal{L}}^{(t)} = \sum_{i=1}^n \left[ g_i f_t(\mathbf{x}_i) + \frac{1}{2} h_i f_t^2(\mathbf{x}_i) \right] + \gamma T + \frac{1}{2} \lambda \sum_{j=1}^T w_j^2 \]
其中 \(w_j\) 是叶子 \(j\) 的权重。
3. 最优叶子权重与树结构评分
定义叶子节点 \(j\) 包含的样本集合为 \(I_j = \{ i | q(\mathbf{x}_i) = j \}\),其中 \(q: \mathbb{R}^m \to \{1,2,\dots,T\}\) 将样本映射到叶子节点。将目标函数按叶子节点重新组合:
\[\tilde{\mathcal{L}}^{(t)} = \sum_{j=1}^T \left[ \left(\sum_{i \in I_j} g_i\right) w_j + \frac{1}{2} \left(\sum_{i \in I_j} h_i + \lambda\right) w_j^2 \right] + \gamma T \]
这是一个关于 \(w_j\) 的二次函数,最优解为:
\[w_j^* = -\frac{\sum_{i \in I_j} g_i}{\sum_{i \in I_j} h_i + \lambda} \]
代入得到最优目标值(结构分数):
\[\tilde{\mathcal{L}}^{(t)*} = -\frac{1}{2} \sum_{j=1}^T \frac{(\sum_{i \in I_j} g_i)^2}{\sum_{i \in I_j} h_i + \lambda} + \gamma T \]
该分数越小表示树结构越好。树的学习目标就是寻找分裂点,使分裂后该分数的降低(即增益)最大。
4. 树的分裂点选择算法
贪心算法:遍历所有特征和可能的分裂点,计算增益。对于候选分裂点将节点分为左子树 \(I_L\) 和右子树 \(I_R\):
\[\text{Gain} = \frac{1}{2} \left[ \frac{(\sum_{i \in I_L} g_i)^2}{\sum_{i \in I_L} h_i + \lambda} + \frac{(\sum_{i \in I_R} g_i)^2}{\sum_{i \in I_R} h_i + \lambda} - \frac{(\sum_{i \in I} g_i)^2}{\sum_{i \in I} h_i + \lambda} \right] - \gamma \]
其中 \(I = I_L \cup I_R\)。增益越大,分裂后损失降低越多。
算法步骤:
a) 对每个特征按值排序,通过一次扫描计算所有可能分裂点的增益。
b) 选择增益最大的分裂点,如果最大增益小于 \(\gamma\) 则停止分裂(预剪枝)。
c) 递归分裂直到达到最大深度或满足停止条件。
XGBoost还支持近似分裂算法(加权分位数草图)以加速大规模数据计算。
5. 算法实现流程总结
输入:训练集 \(D\),损失函数 \(l\),正则化参数 \(\gamma, \lambda\),树最大深度等。
- 初始化模型:\(\hat{y}_i^{(0)} = \arg\min_{\theta} \sum_i l(y_i, \theta)\)(如回归问题初始化为均值)。
- 对 \(t = 1\) 到 \(K\)(树的数量)循环:
a) 计算每个样本的一阶梯度 \(g_i\) 和二阶梯度 \(h_i\)。
b) 基于 \(\{(\mathbf{x}_i, g_i, h_i)\}\) 构建一棵回归树 \(f_t\):- 从根节点开始,递归选择分裂点以最大化增益,直到满足停止条件。
- 叶子节点权重 \(w_j^*\) 按第3步公式计算。
c) 更新模型:\(\hat{y}_i^{(t)} = \hat{y}_i^{(t-1)} + \eta f_t(\mathbf{x}_i)\),其中 \(\eta\) 是学习率(收缩步长)。
- 输出最终模型 \(\hat{y}_i = \sum_{k=1}^K \eta f_k(\mathbf{x}_i)\)。
关键特性:
- 二阶泰勒展开使得目标函数逼近更精确,步长计算更稳定。
- 正则化项 \(\Omega(f)\) 直接惩罚叶子权重和数量,提升泛化能力。
- 分裂点选择中增益计算包含正则化,实现自动剪枝。
- 支持并行化特征扫描、稀疏感知分裂、加权分位数草图等工程优化。
通过上述过程,XGBoost将树模型的构建转化为可微目标优化问题,结合高效的贪心算法,成为目前最成功的集成学习算法之一。