提升树(Boosting Tree)算法的原理与构建过程
题目描述
提升树是一种以决策树为基学习器的集成学习算法。其核心思想是采用加法模型与前向分步算法,通过不断拟合当前模型的残差来构建一系列决策树,最终将这些树的结果累加得到预测值。我们通常讨论的回归提升树和梯度提升决策树(GBDT)都属于这一框架。本题要求详细阐述回归提升树算法的原理、数学推导及逐步构建过程。
解题过程
1. 算法基本思想与模型形式
提升树模型采用加法模型:
\[F_M(x) = \sum_{m=1}^{M} T(x; \Theta_m) \]
其中 \(M\) 是树的总数,\(T(x; \Theta_m)\) 表示第 \(m\) 棵决策树,\(\Theta_m\) 是该树的参数(包括树的结构与叶子节点取值)。
前向分步算法:从初始模型开始,每一步只学习一个基学习器(一棵树)来拟合当前模型的“残差”,并逐步累加到总模型中。
2. 回归提升树的构建步骤
假设训练数据集 \(D = \{(x_1, y_1), (x_2, y_2), \dots, (x_N, y_N)\}\),其中 \(x_i \in \mathbb{R}^d\),\(y_i \in \mathbb{R}\)。
步骤1:初始化模型
初始模型通常是一个常数,即用训练集输出的均值作为初始预测:
\[F_0(x) = \arg\min_c \sum_{i=1}^{N} L(y_i, c) \]
对于平方损失函数 \(L(y, F(x)) = \frac{1}{2}(y - F(x))^2\),最优的 \(c\) 即为 \(y_i\) 的均值:\(c = \bar{y}\)。因此:
\[F_0(x) = \bar{y} \]
步骤2:迭代构建决策树(对 \(m = 1, 2, \dots, M\) )
在第 \(m\) 步,我们已经有了前 \(m-1\) 棵树的累加模型 \(F_{m-1}(x)\)。目标是构建第 \(m\) 棵树 \(T(x; \Theta_m)\)。
(a) 计算当前模型的残差
对于平方损失函数,第 \(i\) 个样本在第 \(m\) 轮的残差 \(r_{mi}\) 定义为真实值 \(y_i\) 与当前模型预测值 \(F_{m-1}(x_i)\) 的差:
\[r_{mi} = y_i - F_{m-1}(x_i) \]
注意,对于平方损失,残差恰好是损失函数关于当前模型预测值的负梯度(即 \(-\frac{\partial L}{\partial F_{m-1}} = y_i - F_{m-1}(x_i)\))。这建立了提升树与梯度下降的联系。
(b) 拟合残差
我们用一棵新的决策树 \(T(x; \Theta_m)\) 来拟合这些残差 \(\{(x_i, r_{mi})\}_{i=1}^{N}\)。即寻找树参数 \(\Theta_m\) 使得:
\[\Theta_m = \arg\min_{\Theta} \sum_{i=1}^{N} (r_{mi} - T(x_i; \Theta))^2 \]
这是一个标准的回归树拟合问题。通常采用二叉决策树,通过递归地选择特征和切分点来划分特征空间,最终得到 \(J\) 个不相交的区域 \(R_{mj}, j=1,2,\dots,J\)。在每个区域 \(R_{mj}\) 内,树输出一个常数 \(c_{mj}\)(即叶子节点的值)。因此树可表示为:
\[T(x; \Theta_m) = \sum_{j=1}^{J} c_{mj} I(x \in R_{mj}) \]
(c) 确定叶子节点值
对于平方损失,叶子节点 \(R_{mj}\) 的最优值 \(c_{mj}\) 是落入该区域的所有样本残差的平均值:
\[c_{mj} = \frac{1}{|R_{mj}|} \sum_{x_i \in R_{mj}} r_{mi} \]
其中 \(|R_{mj}|\) 表示区域 \(R_{mj}\) 中的样本数。
(d) 更新模型
将新树加到现有模型中:
\[F_m(x) = F_{m-1}(x) + T(x; \Theta_m) \]
这里通常还会引入一个学习率(或步长)\(\nu\)(\(0 < \nu \le 1\))来收缩每棵树的影响,防止过拟合:
\[F_m(x) = F_{m-1}(x) + \nu \cdot T(x; \Theta_m) \]
步骤3:得到最终模型
迭代 \(M\) 次后,得到最终提升树模型:
\[F_M(x) = F_0(x) + \nu \sum_{m=1}^{M} T(x; \Theta_m) \]
3. 算法流程总结与实例说明
假设我们有一个简单的数据集:\(x = [1, 2, 3, 4, 5]\),\(y = [5.0, 6.5, 8.0, 9.5, 11.0]\),使用平方损失,学习率 \(\nu = 0.1\),构建两棵树的回归提升树。
第一轮(m=1):
- 初始化:\(F_0(x) = \bar{y} = 8.0\)(所有样本预测值均为8.0)。
- 计算残差:\(r_{1i} = y_i - 8.0 = [-3.0, -1.5, 0.0, 1.5, 3.0]\)。
- 拟合残差:用一棵树拟合 \((x, r_1)\)。假设我们根据特征 \(x\) 以阈值3.5划分(简单起见),得到两个区域:\(R_{11}: x \le 3.5\),包含样本 \(x=1,2,3\);\(R_{12}: x > 3.5\),包含样本 \(x=4,5\)。叶子节点值分别为 \(c_{11} = (-3.0-1.5+0.0)/3 = -1.5\),\(c_{12} = (1.5+3.0)/2 = 2.25\)。
- 更新模型:\(F_1(x) = 8.0 + 0.1 \times T_1(x)\)。对于 \(x=1\),\(T_1(1) = -1.5\),所以 \(F_1(1) = 8.0 + 0.1 \times (-1.5) = 7.85\)。
第二轮(m=2):
- 当前模型预测:基于 \(F_1(x)\) 计算每个样本的预测值(例如 \(x=1\) 为7.85)。
- 计算新残差:\(r_{2i} = y_i - F_1(x_i)\)。
- 拟合新残差,得到第二棵树 \(T_2(x)\)。
- 更新模型:\(F_2(x) = F_1(x) + 0.1 \times T_2(x)\)。
通过多轮迭代,模型逐步逼近真实值。
4. 与梯度提升决策树(GBDT)的联系
上面描述的回归提升树特指使用平方损失函数的情况。更一般的梯度提升决策树(GBDT)框架将残差计算推广为任意损失函数的负梯度(即伪残差):
\[r_{mi} = -\left[ \frac{\partial L(y_i, F(x_i))}{\partial F(x_i)} \right]_{F(x)=F_{m-1}(x)} \]
然后拟合这些伪残差。因此,回归提升树是GBDT在平方损失下的特例。
5. 关键特性与注意事项
- 基学习器:通常使用CART回归树。
- 正则化:除了学习率 \(\nu\),还可以通过限制树的深度、叶子节点最小样本数、子采样等控制复杂度。
- 停止条件:可设置最大迭代次数 \(M\),或当验证集误差不再下降时提前停止。
- 优点:能自动进行特征组合,对异常值相对鲁棒(使用鲁棒损失时),常能得到高精度。
- 缺点:串行训练难以并行化,对超参数较敏感。
通过以上步骤,提升树以前向分步的方式,每一棵树都致力于纠正前一棵树的残差,最终将所有树的预测累加,形成一个强大的集成模型。