码迷,mamicode.com
首页 > 其他好文 > 详细

Boosting 之 Gradient Boosting

时间:2016-07-14 01:52:03      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:

本文将即上一次的 基于权重的 Boosting 之后讨论 Boosting 中另一种形式 Gradient Boosting,基于权重的方法代表为 Adaboost ,在 Adaboost 中权重随着样本是否分类正确而在下一次迭代中发生改变,而 Gradient Boosting 中没有样本权重的概念,而是根据在每一次迭代中用基学习器拟合当前模型的输出与样本的监督值之间的残差,来达到一步步逼近损失函数的极值点。每一次建立模型是建立在之前模型的损失的梯度下降的方向

Gradient Boosting

Gradient Boosting 采用的也是 Additive Model 与前向分部算法,需要注意在 Gradient Boosting 中没有权值的概念,即每个基学习器是等概率的,其模型可以表示为:

\[f_M(x) = \sum_m T(x; \theta_m)\]

Gradient Boosting 也采用前向分布算法,首先确定初始模型,定义初始基学习器 $f_0(x) = c$ ,则迭代到第 m 步 的模型是:

\[f_m(x) = f_{m-1}(x) + T(x; \theta_m)\]

通过最小化损以下损失来确定参数 $\theta_m$ 的值:

\[arg \min_{\theta_m} \sum_iL(y_i,f_{m-1}(x_i) +T(x; \theta_m))\]

比如在前行分步中使用均方损失 $L(y,f(x)) = (y-f(x))^2$ ,在第 $m$ 步迭代中,已经得到 $f-{m-1}(x)$,需求解 $\theta_m$ ,对样本 $(x_i,y_i)$ 有:

\begin{aligned}
& \ \ \ \ L(y_i,f_{m-1}(x_i) + T(x; \theta_m)) \\
&=  [ y_i -f_{m-1}(x_i) - T(x ; \theta_m)]^2\\
&=   [r_i -  T(x ; \theta_m)]^2
\end{aligned}

这里 $r_i = y_i – f_{m-1}(x_i)$ 称之为残差 residual ,即当前模型 $f_{m-1}(x_i)$ 与监督目标值之间的差距,让当前的基学习器 $T(x; \theta_m)$ 拟合这个 $residual$ 即可使得 $f_{m}(x_i)$ 更接近 $y_i$ 。这便是拟合残差的思想,其实就是把残差当做标签训练模型而已。这样不断迭代使得残差逐步下降,残差的减小使得模型准确度也越来越高。所以建立模型的目标是要使得损失函数持续的下降,此问题等价于求解损失函数极小值的问题,最简单的求解损失函数极小值的方法不就是 Gradient Descent 吗?回忆 Gradient Descent ,对于给定的关于 $\theta$ 的损失函数 $L( \theta)$ :

\[ \theta ^{new} = \theta ^{old} - \frac{\partial L(\theta)}{ \partial \theta}\]

不断迭代,最终会找到一个最优的 $\theta^*$ ,满足 $\theta^*  = arg\min_{\theta} L(\theta)$ ,回到Gradient Boosting ,首先对于样本 $(x_i,y_i)$ ,给出一个损失函数 $L(y,f(x))$ ,该损失函数代表了当前模型的预测值与真实值的差异,当然是越小越好,把 $L(y_i,f(x_i))$ 看做 $f(x_i)$ 的函数,则该损失在沿 $f(x_i)$ 梯度下降的方向上会越来越小。对于第 $m$ 次迭代:

\[f_{m}(x_i) = f_{m-1}(x_i) – \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}\]

很明显 $– \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)}$ 即为两次迭代之间基学习器 $T(x ; \theta_m)$ 需要拟合的近似残差,拟合该残差后使得模型进一步朝梯度下降的方向前进,不断迭代得到便可得到使得损失最小的模型 $f_M(x)$。

综上这里给出一个 Gradient Boosting 的代码:

输入: 训练集 $\left \{ (x_i,y_i)\right \}^N_{i=1}$ , 损失函数 $L(y,f(x))$.

1. 用常数 $c$ 初始化模型:

\[f_0(x) = arg \min_c \sum_iL(y_i,c)\]

2. $for$ $m = 1,…,M$ $do$:

      计算近似残差:

     \[r_{mi} =  \left [ \frac{\partial L(y_i,f(x_i))}{\partial f(x_i)} \right ]_f(x_i) = f_{m-1}(x)  \ \ \  ,i= 1,2,…,N  \]

     用近似残差来拟合基学习器 $T(x; \theta_m)$,训练集为 $\left \{ (x_i,r_mi)\right \}^N_{i=1}$

     计算基学习器的权重 $\gamma_m$:

\[ \gamma_m = arg \min_{\gamma}\sum_iL(y_i,f_{m-1}(x_i) + T(x; \theta_m)) \]

      更新模型:$f_{m}(x) = f_{m-1}(x) + \gamma_m T(x; \theta_m)$

3.  输出最终模型$f_M(x)$.

需要注意过拟合的问题,即 Bias 与 Varance 之间的权衡,如果一味减小 Bias ,会导致 Variance 可能过大,进而失去了模型的泛化能力,Gradient Boosting 有两种方法可以避免过拟合:

1) 控制 M 的大小, M 太大虽然 Bias 会减小,M 可以通过 Cross Validation 的方式选取

2) Shrinkage(收缩)方法,Shrinkage 是在迭代过程中对模型进行更新时乘以一个参数 $v$ , 这里有 $0<v<1$, 即:

\[f_{m}(x) = f_{m-1}(x) + v\gamma_m T(x; \theta_m)\]

实践中设置很小的 Shrinkage 参数 $v$ 比如 $v < 0.1$ ,会比 $v = 1$ 产生非常好的泛华性能。但 $v$ 设置很小 需要的迭代次数 $M$ 大一些。

Gradient Boosting Decision Tree 其实就是基学习器采用的 Decision Tree 的 Gradient Boosting 方法,常用的就是 CART 了,既可用于分类,也可用于回归,这里给出基于 CART 的 GBDT 算法:

Boosting 之 Gradient Boosting

标签:

原文地址:http://www.cnblogs.com/ooon/p/5668289.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!