决策树之GBDT

245 阅读4分钟

本文从互联网搬运,只用于本人学习记录。

决策树之GBDT

GBDT(Gradient Boosting Decision Tree)是一种迭代的决策树算法,该算法由多棵决策树组成,属于 Boosting 策略。GBDT 是被公认的泛化能力较强的算法。

1. 思想

GBDT 由三个概念组成:Regression Decision Tree(即 DT)、Gradient Boosting(即 GB),和 Shrinkage(一个重要演变)。

1.1. 回归树 Regression Decision Tree

GBDT 的核心在于累加所有树的结果作为最终结果,所以 GBDT 中的树都是回归树,不是分类树。

对于分类树而言,其值加减无意义(如性别),而对于回归树而言,其值加减才是有意义的(如说年龄)。

回归树在分枝时会穷举每一个特征的每个阈值以找到最好的分割点,衡量标准是最小化均方误差。

1.2. 梯度迭代 Gradient Boosting

GBDT 的核心在于累加所有树的结果作为最终结果,GBDT 的每一棵树都是以之前树得到的残差来更新目标值,这样每一棵树的值加起来即为 GBDT 的预测值

模型的预测值可以表示为:
F k ( x ) = ∑ i = 1 k f i ( x ) F_k(x) = \sum^k_{i = 1}f_i(x) Fk​(x)=i=1∑k​fi​(x)
f i ( x ) f_i(x) fi​(x)为基模型与其权重的成绩,模型的训练目标是使预测值 F k ( x ) F_k(x) Fk​(x)逼近真实值 y y y,也就是说要让每个基模型的预测值逼近各自要预测的部分真实值。

整体模型的训练十分复杂,使用贪心方案解决:每次只训练一个基模型。
整体模型迭代式:
F k ( x ) = F k − 1 ( x ) + f k ( x ) F_k(x) = F_{k - 1}(x) + f_k(x) Fk​(x)=Fk−1​(x)+fk​(x)
这样,在每一轮迭代中,只要集中解决一个基模型的训练问题:使 F k ( x ) F_k(x) Fk​(x)逼近真实值 y y y

残差其实是最小均方损失函数关于预测值的反向梯度
− ∂ ( − 1 2 ( y − F k ( x ) ) 2 ) ∂ F k ( x ) = y − F k ( x ) -\frac{\partial (-\frac{1}{2}(y - F_k(x))^2)}{\partial F_k(x)} = y - F_k(x) −∂Fk​(x)∂(−21​(y−Fk​(x))2)​=y−Fk​(x)
即,预测值和实际值的残差与损失函数的负梯度相同。
基于残差GBDT容易对异常值敏感。 -> 一般回归类的损失函数会用绝对损失或者 Huber 损失函数来代替平方损失函数。

绝对损失:
L ( y , F ) = ∣ y − F ∣ L(y, F) = |y - F| L(y,F)=∣y−F∣
Huber损失:
L ( y , F ) = { 1 2 ( y − F ) 2 , ∣ y − F ∣ ≤ δ δ ( ∣ y − F ∣ − δ 2 ) , ∣ y − F ∣ > δ L(y, F) = \begin{cases} \frac{1}{2}(y -F)^2 & , {|y -F| \leq \delta} \\ \delta(|y - F| - \frac{\delta}{2}) & , {|y -F| > \delta} \end{cases} L(y,F)={21​(y−F)2δ(∣y−F∣−2δ​)​,∣y−F∣≤δ,∣y−F∣>δ​

GBDT 的每一步残差计算其实变相地增大了被分错样本的权重,而对与分对样本的权重趋于 0,这样后面的树就能专注于那些被分错的样本。

1.3 缩减 Shrinkage

每走一小步逐渐逼近结果的效果要比每次迈一大步很快逼近结果的方式更容易避免过拟合。即它并不是完全信任每一棵残差树
F i ( x ) = F i − 1 ( x ) + μ f i ( x ) , 0 < u ≤ 1 F_i(x) = F_{i - 1}(x) + \mu f_i(x), 0 < u \leq 1 Fi​(x)=Fi−1​(x)+μfi​(x),0<u≤1

Shrinkage 不直接用残差修复误差,而是只修复一点点,把大步切成小步。
本质上Shrinkage为每棵树设置了一个 weight,累加时要乘以这个weight,当weight降低时,基模型数会配合增大。

2. 优缺点

优点:

  1. 可以自动进行特征组合,拟合非线性数据;
  2. 可以灵活处理各种类型的数据。

缺点:

  1. 对异常点敏感。

3. 与Adaboost对比

相同:

  1. 都是 Boosting 家族成员,使用弱分类器
  2. 都使用前向分布算法

不同:

  1. 迭代思路不同:Adaboost 是通过提升错分数据点的权重来弥补模型的不足(利用错分样本),而 GBDT 是通过算梯度来弥补模型的不足(利用残差);
  2. 损失函数不同:AdaBoost 采用的是指数损失,GBDT 使用的是绝对损失或者 Huber 损失函数