GBDT
# [简介](https://www.cnblogs.com/pinard/p/6140514.html)
GBDT也是集成学习Boosting家族的成员,由梯度提升方法与回归树结合而成。
## 回归树
| 回归树生成算法 | |
|---|---|
| 输入:训练数据集$D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$ | |
| 1 | 选择最优的切分特征$j$与切分阈值 $s$ ,求解$$\min_{j,s} \left[ \min_{c_1} \sum_{x_i \in R_1(j,s)}(y_i - c_i)^2 + \min_{c_2} \sum_{x_i \in R_2(j,s)}(y_i - c_2)^2 \right]$$遍历所有的特征 $j$ ,对固定的切分特征 $j$ 扫描选取切分阈值$s$,选择使上式达到最小值的 $(j,s)$. |
| 2 | 用选定的 $(j,s)$ 划分区域并决定相应的输出值: $R_1(j,s)=\{ x|x[j]\leq s\} ,$ $R_2(j,s)=\{x|x[j]$>$s\}$ $ c_m = \frac {1}{N_m} \sum _{x_i \in R_m} y_i ~ m=1,2$ 其中,$N_m$ 表示属于$R_m$的样本个数 . |
| 3 | 继续对两个子区域调用步骤(1),(2),直至区域类样本一致或树的层数达到要求. |
| 4 | 将输入空间划分为$M$个区域 $R_1,R_2,...,R_M$,生成决策树: $$T(x) = \sum_{m=1}^M c_m$$ \mathrm{I}(x\in R_m)$$ |
| 输出:回归树 $T(x)$. | |
## 提升树
提升树可以表示为以下形式:这里我们约定 $T(x;Θ_m)$表示第$m$棵决策树;$Θ_m$表示决策树的参数;$M$为树的个数。强分类器$f_M(x)$可以由多个弱分类器$T(x;Θ_m)$线性相加而成$$f_M (x)=\sum_{m=1}^MT(x;Θ_m )$$提升树的前向分步算法。第$m$步的模型可以写成$$f_m (x)=f_{m-1} (x)+ T(x;Θ_m )$$然后得到损失函数$$L(f_m (x),y)=L(f_{m-1} (x)+ T(x;Θ_m ),y)$$迭代的目的是构建$T(x;Θ_m)$,使得本轮损失$L(f_m(x),y)$最小。思想其实并不复杂,但是问题也很明显,对于不同的任务会有不同的损失函数,当损失函数是平方损失和指数损失函数时,每一步的优化还是简单的。但是对于一般损失函数而言,每一步的优化并不容易
| 提升树算法 | |
|---|---|
| 输入:训练数据集$D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$ | |
| 1 | 初始化$f_0(x)=0$ |
| 2 | For $m=1,2,...,M$ |
| 3 | 针对每一个样本$(x_i,y_i)$计算残差$$r_{m,i}=y_i - f_{m-1}(x_i),~ i=1,2,...,N$$ |
| 4 | 利用$\{(y_i,r_{m,i})\}_{i=1,2,...,N}$训练一个决策树(回归树),得到 $T(x;\Theta_m)$ |
| 5 | 更新$f_m(x)=f_{m-1}(x)+T(x;\Theta_m)$ |
| 6 | 完成以上迭代,得到提升树$f_M(x) = \sum\limits_{m=1}^M T(x;\Theta_m)$ |
## 梯度提升树
**采用泰勒展开式将上式中的残差展开,**
### 泰勒公式
- 一元函数在点$x_k$处的泰勒展开式为: $$f(x) = f(x_k)+(x-x_k)f'(x_k)+\frac{1}{2!}(x-x_k)^2f''(x_k)+o^n$$
- 二元函数在点(xk,yk)处的泰勒展开式为: $$f(x,y)=f(x_k,y_k)+(x-x_k)f'_x(x_k,y_k)+(y-y_k)f'_y(x_k,y_k)\\
+\frac1{2!}(x-x_k)^2f''_{xx}(x_k,y_k)+\frac1{2!}(x-x_k)(y-y_k)f''_{xy}(x_k,y_k)\\
+\frac1{2!}(x-x_k)(y-y_k)f''_{yx}(x_k,y_k)+\frac1{2!}(y-y_k)^2f''_{yy}(x_k,y_k)\\
+o^n$$
- 多元函数(n)在点xk处的泰勒展开式为: $$f(x^1,x^2,\ldots,x^n)=f(x^1_k,x^2_k,\ldots,x^n_k)+\sum_{i=1}^n(x^i-x_k^i)f'_{x^i}(x^1_k,x^2_k,\ldots,x^n_k)\\
+\frac1{2!}\sum_{i,j=1}^n(x^i-x_k^i)(x^j-x_k^j)f''_{ij}(x^1_k,x^2_k,\ldots,x^n_k)+o^n$$
### 拟合残差的近似
梯度提升思想正是为了解决上面的问题。它的主要思想是先求$h_m$,再求$β_m$。观察式子$$\sum _{i=1}^N = L(y_i,f_{m-1}(x_i)+\beta h_m(x_i))$$我们要最小化的式子由N部分相加而成,如果能够最小化每一部分,自然也就最小化了整个式子。考察其中任一部分,并将其进行泰勒一阶展开$$L(y_i,f_{m-1}(x_i)+\beta h_m(x_i))=L(y_i,f_{m-1}(x_i))+\beta h_m(x_i)\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} \\
L(y_i,f_{m-1}(x_i)+\beta h_m(x_i))-L(y_i,f_{m-1}(x_i))=\beta h_m(x_i)\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} $$由于需要$$L(y_i,f_{m-1}(x_i)+\beta h_m(x_i))-L(y_i,f_{m-1}(x_i))<0\Rightarrow \beta h_m(x_i)\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)} <0$$由于$β$是大于0的,则$$h_m(x_i)=-\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)}$$这说明,我们已经成功地降低了在第$i$个样本点上的预测损失。同理,我们可以降低在每一个样本点上的预测损失。条件就是$$h_m(x_i)=-\frac{\partial L(y_i,f_{m-1}(x_i))}{\partial f_{m-1}(x_i)}$$这个条件其实告诉了我们如何去寻找基学习器$h_m$,用回归树拟合$h_m(x_i)$。我们已经有了$h_m$,下面优化求解$β$,很显然,这是一个一维搜索问题,如下:$$β_m=\underset{β}{argmin}\sum_{i=1}^{N}L(y_i,f_{m-1}(x_i)+βh_m(x_i))$$在上面的泰勒一阶展开时,有一个条件就是$βh_m(x_i)$要足够小,显然,执行一维搜索后得到的β会满足这个条件
# GBDT回归算法
| GBDT 算法 | |
|---|---|
| 输入:训练数据集$D=\{(x_1,y_1),(x_2,y_2),...,(x_N,y_N)\}$;损失函数$L(y,f(x))$ | |
| 1 | 初始化$f_0(x) = \arg \min\limits_c \sum\limits_{i=1}^N L(y_i, c)$ |
| 2 | For $m=1,2,...,M$ |
| 3 | 对于每一个样本$(x_i,y_i)$,计算残差$$r_{m,i} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1}(x)} ~,~i=1,2,...,N$$ |
| 4 | 利用$\{(x_i,r_{m,i})\}_{i=1,2,...,N}$ 训练出第$m$棵回归树$T_m$,其叶节点划分的区域为$R_{m,j},j=1,2,...,J$ |
| 5 | 对于回归树$T_m$的每一个叶节点对叶子区域$j =1,2,..J$,计算其输出值$$c_{m,j} = \arg \min_c \sum_{x_i\in R_{m,j}} L(y_i, f_{m-1}(x_i)+c) ,~ j=1,2,...,J$$ |
| 6 | 更新$f_m(x) = f_{m-1}(x) + \sum\limits_{j=1}^J c_{m,j}I(x \in R_{m,j})$ |
| 7 | 得到最终提升回归树$$\hat f(x) = f_M(x) = \sum_{m=1}^M \sum_{j=1}^J c_{m,j} I(x \in R_{m,j})$$ |
| 输出:梯度提升树$\hat f(x)$ | |
以上算法将回归树和提升树的算法结合起来,在第5步中求解 $c_{m,j}$ ,如果损失函数为平方损失函数,则解法与前面的回归树一致,直接取均值即可。如果是其他损失函数,则需要具体进行求解。具体而言,就是取导数为零来解等式
# GBDT分类算法
## 二元GBDT分类算法
对于二元GBDT,如果用类似于逻辑回归的对数似然损失函数,则损失函数为:$$L(y,f(x))=log(1+exp(−yf(x)))$$
其中$y∈{−1,+1}$。则此时的负梯度误差为$$r_{ti} = -\bigg[\frac{\partial L(y, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{t-1}\;\; (x)} = y_i/(1+exp(y_if(x_i)))$$
利用$\{(x_i,r_{m,i})\}_{i=1,2,...,N}$训练出第$m$棵回归树$T_m$,其叶节点划分的区域为$R_{m,j},j=1,2,...,J$
对于生成的决策树,我们各个叶子节点的最佳残差拟合值为$$c_{m,j} = \arg \min_c \sum_{x_i\in R_{m,j}} \log (1+\exp (-y_i (f_{m-1}(x_i) + c))) \tag{15}$$
由于上式比较难优化,我们一般使用近似值代替$$c_{m,j} =\left. \sum_{x_i\in R_{m,j}} r_{m,i} \middle / \sum_{x_i\in R_{m,j}} |r_{m,i}|(1-|r_{m,i}|) \right. \tag{16}$$
除了负梯度计算和叶子节点的最佳残差拟合的线性搜索,二元GBDT分类和GBDT回归算法过程相同。
## 多元GBDT分类算法
多元GBDT要比二元GBDT复杂一些,对应的是多元逻辑回归和二元逻辑回归的复杂度差别。假设类别数为K,则此时我们的对数似然损失函数为$$L(y,f(x)) = - \sum_{k=1}^K y_k log p_k(x) \tag{17}$$
其中,如果样本输出类别为$k$ ,则$y_k=1$ ;$p_k(x) $表示模型$ f(x) $判定$ x$ 属于第$ k $类的概率,其表达式为$$p_k(x) = \frac{\exp (f_k(x))}{ \sum_{l=1}^K \exp(f_l(x))} \tag{18}$$
注意此处,对于多分类问题,回归树训练时,会为每一个类别训练一个决策树。
由此,我们可以计算出第$ m $轮的第$ i $个样本对应类别$ l $的负梯度误差为$$r_{m,i,l} = -\left[ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right]_{f(x)=f_{m-1,l}(x)} = y_{i,l} - p_{m,l}(x_i) \tag{19}$$
观察上式可以看出,其实这里的误差就是样本$ i $对应类别$ l $的真实概率和$ m−1 $轮预测概率的差值。
对于生成的决策树,对应第$ l $类别的决策树的叶节点输出为$$c_{m,l,j} = \arg \min_c \sum_{x_i \in R_{m,l,j}} L(y_{i,l}, f_{m-1,l}(x_i) + c) \tag{20}$$
类似的,我们用近似值代替$$c_{m,l,j} = \frac{K-1}{K} \frac{\sum\limits_{x_i \in R_{m,l,j}}r_{m,i,l}}{ \sum\limits_{x_i \in R_{m,l,j}} |r_{m,i,l}|(1-|r_{m,i,l}|) } \tag{21}$$
## 实例
| 编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签值) |
|---|---|---|---|
| 1 | 5 | 20 | 1.1 |
| 2 | 7 | 30 | 1.3 |
| 3 | 21 | 70 | 1.7 |
| 4 | 30 | 60 | 1.8 |
| 5(要预测的) | 25 | 65 | ? |
1、初始化学习器
$$f_0(x) =arg\; \underset{c}{min}\sum\limits_{i=1}^{N}L(y_i, c)$$由于此时只有根节点,样本1,2,3,4都在根节点,此时要找到使得平方损失函数最小的参数$c$,怎么求呢?平方损失显然是一个凸函数,直接求导,倒数等于零,得到$c$。 $$\frac{\partial L(y_i,c)}{\partial c}=\frac{\partial (\frac{1}{2}[y-c]^2)}{\partial c}=c-y$$令$c−y=0$,得$c=y$。
所以初始化时,$c$取值为所有训练样本标签值的均值。$c=(1.1+1.3+1.7+1.8)/4=1.475$,此时得到初始学习器$f_0(x) $。$$f_0(x)=c=1.475$$
2、对迭代轮数m=1:
计算负梯度——残差 $$r_{i1} = -\bigg[\frac{\partial L(y_i, f(x_i)))}{\partial f(x_i)}\bigg]_{f(x) = f_{0} (x)}$$说白了,就是残差(上面已经解释过了),在此例中,残差在下表列出:
编号 | 真实值 | $f_0(x)$ | 残差
-|-|-|-
1 | 1.1 | 1.475 | -0.375
2 | 1.3 | 1.475 | -0.175
3 | 1.7 | 1.475 | 0.225
4 | 1.8 | 1.475 | 0.325
此时将残差作为样本的真实值训练$f_1(x)$,即下表数据
| 编号 | 年龄(岁) | 体重(kg) | 身高(m)(标签值) |
|---|---|---|---|
| 1 | 5 | 20 | -0.375 |
| 2 | 7 | 30 | -0.175 |
| 3 | 21 | 70 | 0.225 |
| 4 | 30 | 60 | 0.325 |
接着,寻找回归树的最佳划分节点,遍历每个特征的每个可能取值。从年龄特征的5开始,到体重特征的70结束,分别计算方差,找到使方差最小的那个划分节点即为最佳划分节点。
例如:以年龄7为划分节点,将小于7的样本划分为一类,大于等于7的样本划分为另一类。样本1为一组,样本2,3,4为一组,两组的方差分别为0,0.047,两组方差之和为0.047。所有可能划分情况如下表所示
| 划分点 | 小于划分点的样本 | 大于等于划分点的样本 | 总方差 |
|---|---|---|---|
| 年龄5 | / | 1,2,3,4 | 0.082 |
| 年龄7 | 1 | 2,3,4 | 0.047 |
| 年龄21 | 1,2 | 3,4 | 0.0125 |
| 年龄30 | 1,2,3 | 4 | 0.062 |
| 体重20 | / | 1,2,3,4 | 0.082 |
| 体重30 | 1 | 2,3,4 | 0.047 |
| 体重60 | 1,2 | 3,4 | 0.0125 |
| 体重70 | 1,2,4 | 3 | 0.0867 |
以上划分点是的总方差最小为0.0125有两个划分点:年龄21和体重60,所以随机选一个作为划分点,这里我们选年龄21。
此时还需要做一件事情,给这两个叶子节点分别赋一个参数,来拟合残差。 $$c_{j1} =arg\; \underset{c}{min}\sum\limits_{x_i \in R_{j1}} L(y_i,f_{0}(x_i) +c)$$
这里其实和上面初始化学习器是一个道理,平方损失,求导,令导数等于零,化简之后得到每个叶子节点的参数$c$,其实就是标签值的均值。
根据上述划分节点:
样本1,2为左叶子节点,$(x_1,x_2 \in R_{11})$,所以$c_{11}=(−0.375−0.175)/2=−0.275。 $
样本3,4为左叶子节点,$(x_3,x_4 \in R_{11})$,所以$c_{21}=(0.225+0.325)/2=0.275。 $
此时可更新强学习器 $$f_{1}(x) = f_{0}(x) + \sum\limits_{j=1}^{2}\Upsilon_{j1}I(x \in R_{j1})$$
3、对迭代轮数m=2,3,4,5,…,M:
循环迭代M次,M是人为控制的参数,迭代结束生成M棵树
4、得到最后的强学习器:
为了方别展示和理解,我们假设M=1,根据上述结果得到强学习器:$$f(x) = f_M(x) =f_0(x) + \sum\limits_{m=1}^{M}\sum\limits_{j=1}^{J}c_{jm}I(x \in R_{jm})$$
<center>
</center>
# 工作流程
在使用回归做回归时,难以避免在预测值与实际值之间产生误差,GDBT主要是通过估算误差,达到提升模型的泛化能力(预测能力,分类能力)。
- $y(i)$:对应第$i$个$x$的实际$y$值
- $\hat{y}(i)$:对应第$i$个$x$的预测$y$值
$L(y(i),\hat{y}(i)) $:预测值与实际值之间的差异度,叫误差。例如:做回归时候,$L(y(i),\hat{y}(i)) = y(i) -\hat{y}(i)$,但并不是所有的误差都是相减,例如在做概率预测时预测的概率就不能简单的用做差来估算误差。
## 例子
| 训练数据表 | ||||||||||
| $x_1$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| $y_1$ | 5.56 | 5.7 | 5.91 | 6.4 | 6.8 | 7.05 | 8.9 | 8.7 | 9 | 9.05 |
1. 使用一个一层的回归树,根据最小方差(MSE)作为目标函数对其分类,后得到$$T_1(x) = \left\{\begin{matrix}
6.24, & x<6.5 \\
8.91, & x\geqslant 6.5
\end{matrix}\right.\\$$其中$$\begin{align*}
6.24 &= (5.56+5.7+5.91+6.4+6.8+7.05)/6 \\
8.91 &=(8.9+8.7+9+9.05)/4
\end{align*}$$ $$f_1(x)=T_1(x)$$
2. 计算误差并根据误差建立二层决策树
| 一层误差数据表 | ||||||||||
| $x_1$ | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| $y_1$ | -0.68 | -0.54 | -0.33 | 0.16 | 0.56 | 0.81 | -0.01 | -0.21 | 0.09 | 0.14 |
$$T_2(x) = \left\{\begin{matrix}
-0.52, & x<3.5 \\
0.22, & x\geqslant 3.5
\end{matrix}\right.\\$$其中$$\begin{align*}
-0.52 &= (-0.68+-0.54+-0.33)/3 \\
0.22 &=(0.16+0.56+0.81+-0.01+-0.21+0.09+0.14)/7
\end{align*}$$ $$f_2(x)=f_1(x)+T_2(x)= \left\{\begin{matrix}
5.72, & x<3.5 \\
6.46, & 3.5\leqslant x<6.5 \\
9.13, & x\geqslant 6.5
\end{matrix}\right.$$

浙公网安备 33010602011771号