基于梯度提升的多输出回归:Multi-Output Gradient Boosting Trees的原理与构建过程
题目描述
在机器学习中,我们常遇到多输出回归问题,即需要同时预测多个连续型目标变量。例如,在环境监测中,可能需要同时预测温度、湿度和PM2.5浓度。传统的梯度提升决策树(Gradient Boosting Decision Trees, GBDT)主要针对单输出问题设计。Multi-Output Gradient Boosting Trees(也称为多目标梯度提升树)扩展了GBDT框架,使其能够通过单一模型联合预测多个相关输出。本题目将深入讲解其核心思想、如何构建损失函数、如何进行多输出的梯度提升,以及模型的优化与预测过程。
解题过程
1. 问题形式化与核心思想
假设我们有训练数据集 \(\{ (\mathbf{x}_i, \mathbf{y}_i) \}_{i=1}^n\),其中输入 \(\mathbf{x}_i \in \mathbb{R}^d\),输出 \(\mathbf{y}_i \in \mathbb{R}^m\) 是一个 \(m\) 维向量(例如 \(m=3\) 表示预测三个环境指标)。目标是学习一个函数 \(F: \mathbb{R}^d \to \mathbb{R}^m\),使得预测误差最小。
核心思想是采用梯度提升框架,但将基学习器(通常是回归树)扩展为能够同时输出 \(m\) 个值的“多输出树”。在每轮提升中,我们针对所有 \(m\) 个输出维度联合拟合一个残差树,从而在提升过程中自动建模输出之间的相关性。
2. 多输出损失函数
首先,定义一个适用于多输出的损失函数。常用的选择是平方误差损失,它对每个输出维度独立计算误差后求和:
\[L(\mathbf{y}, F(\mathbf{x})) = \frac{1}{2} \sum_{j=1}^m (y_j - F_j(\mathbf{x}))^2 \]
其中 \(F_j(\mathbf{x})\) 是模型对第 \(j\) 个输出的预测值。这个损失是平滑可微的,便于梯度计算。
3. 多输出梯度与提升步骤
梯度提升是一种加法模型,通过迭代地添加基学习器(决策树)来最小化损失。在经典GBDT中,每轮迭代会计算当前模型关于单输出预测的负梯度(即伪残差),然后拟合一个树到这个伪残差。对于多输出问题,这个步骤需要为每个输出维度独立计算梯度,但用同一棵树结构来拟合所有维度的梯度。
- 初始化模型:
对于 \(m\) 个输出,我们通常初始化为常数向量。一个简单策略是用训练集每个输出维度的平均值初始化:
\[ F_0(\mathbf{x}) = \left( \bar{y}_1, \bar{y}_2, \dots, \bar{y}_m \right),其中 \bar{y}_j = \frac{1}{n} \sum_{i=1}^n y_{i,j} \]
- 第 \(t\) 轮迭代(对 \(t=1,2,\dots,T\)):
a) 计算伪残差:对于每个样本 \(i\) 和每个输出维度 \(j\),计算当前模型的负梯度(即伪残差):
\[ r_{i,j}^{(t)} = - \left[ \frac{\partial L(\mathbf{y}_i, F(\mathbf{x}_i))}{\partial F_j(\mathbf{x}_i)} \right]_{F=F_{t-1}} \]
对于平方损失,这个梯度很简单:
\[ r_{i,j}^{(t)} = y_{i,j} - F_{t-1, j}(\mathbf{x}_i) \]
因此,每个样本 \(i\) 的伪残差是一个 \(m\) 维向量:\(\mathbf{r}_i^{(t)} = (r_{i,1}^{(t)}, \dots, r_{i,m}^{(t)})\)。
b) 拟合多输出回归树:
我们用一棵回归树来拟合这些伪残差。注意,这棵树与单输出树的不同在于:叶子节点的值不再是标量,而是一个 \(m\) 维向量。具体过程如下:
- 树的分裂规则仍基于所有输出维度的总误差减少。常用平方误差作为分裂准则。假设在某个节点上有样本子集 \(I\),考虑一个分裂将该节点分为左子集 \(I_L\) 和右子集 \(I_R\)。我们评估这个分裂的质量(不纯度减少)时,需要计算所有 \(m\) 个输出维度的总平方误差变化。
- 具体地,分裂前的总平方误差为:
\[ E_{\text{before}} = \sum_{i \in I} \sum_{j=1}^m \left( r_{i,j} - \bar{r}_{j} \right)^2 \]
其中 \(\bar{r}_{j} = \frac{1}{|I|} \sum_{i \in I} r_{i,j}\) 是该节点上第 \(j\) 维伪残差的平均值。
- 分裂后的总平方误差为左右子节点的误差和:
\[ E_{\text{after}} = \sum_{i \in I_L} \sum_{j=1}^m \left( r_{i,j} - \bar{r}_{j}^{(L)} \right)^2 + \sum_{i \in I_R} \sum_{j=1}^m \left( r_{i,j} - \bar{r}_{j}^{(R)} \right)^2 \]
- 我们选择使 \(E_{\text{before}} - E_{\text{after}}\) 最大化的特征和切分点,这与CART回归树类似,只是误差对所有输出维度求和。
c) 确定叶子节点的输出值:
假设树生长后,叶子节点 \(l\) 包含样本子集 \(I_l\)。在经典梯度提升中,叶子节点值通常取为该节点上样本伪残差的平均值(对于平方损失),但对于多输出,我们需要为每个输出维度独立计算平均值,从而得到一个向量:
\[ \mathbf{v}_l = (v_{l,1}, v_{l,2}, \dots, v_{l,m}), \quad \text{其中} \quad v_{l,j} = \frac{1}{|I_l|} \sum_{i \in I_l} r_{i,j}^{(t)} \]
这个向量就是该叶子节点对所有 \(m\) 个输出的预测贡献。
d) 更新模型:
将新树加入到模型中,更新预测函数:
\[ F_{t,j}(\mathbf{x}) = F_{t-1,j}(\mathbf{x}) + \eta \cdot h_{t,j}(\mathbf{x}) \]
其中 \(h_{t,j}(\mathbf{x})\) 是第 \(t\) 棵树对第 \(j\) 个输出的预测(即样本 \(\mathbf{x}\) 落入的叶子节点对应的 \(v_{l,j}\) 值),\(\eta\) 是学习率(通常为0.05 ~ 0.1),用于防止过拟合。
4. 预测过程
对于新样本 \(\mathbf{x}\),最终的预测是所有树输出的加权和:
\[\hat{\mathbf{y}} = F_T(\mathbf{x}) = F_0(\mathbf{x}) + \eta \sum_{t=1}^T \mathbf{h}_t(\mathbf{x}) \]
其中 \(\mathbf{h}_t(\mathbf{x})\) 是第 \(t\) 棵树输出的 \(m\) 维向量。模型一次性输出所有目标变量的预测值。
5. 优化与实现细节
- 正则化:与单输出GBDT类似,可以通过限制树的最大深度、设置最小叶子样本数、使用学习率收缩以及引入随机性(如特征采样)来防止过拟合。
- 输出相关性建模:由于所有输出维度共享同一棵树结构,模型在分裂时会自动考虑所有维度的误差,从而隐式地建模了输出之间的相关性。例如,如果两个输出变量具有相似的变化模式,树的分裂会更倾向于同时减少两者的误差。
- 扩展性:这种方法在实现时,可以高效地将多输出目标存储为矩阵,并在计算分裂增益时并行计算各维度的误差,以加速训练。
总结
Multi-Output Gradient Boosting Trees 通过将梯度提升框架中的基学习器扩展为多输出树,实现了对多个相关目标变量的联合回归建模。其核心是在每一轮提升中,计算所有输出维度的伪残差,然后拟合一棵共享结构的树,树的叶子节点存储一个多维度输出向量。这种方法既保持了梯度提升的高预测精度,又通过共享树结构自然地捕捉了输出间的依赖关系,是多输出回归问题中一个强大而灵活的工具。