2 提高树¶
关于提高树,咱们能够从字面上进行理解,能够认为提高树就是一种以决策树做为基学习算法的一种提高学习算法,能够用来解决分类问题,也能够用于解决回归问题。当用于分类问题时,提高树算法只需将AdaBoost算法中的基本学习器限制为二类分类树便可,能够说这时的提高树算法是AdaBoost算法的特殊状况,本文再也不细述,且本文主要介绍的GBDT算法不管是在分类问题中仍是回归问题汇总,都是从回归提高树的优化而来,因此下面叙述内容主要以回归提高树为主。
提高树模型能够看作是使用加法模型对决策树的线性组合: $${f_M}(x) = \sum\limits_{m = 1}^M {T(x;{\Theta _m})} \tag {1}$$ 式中,${f_M}(x)$是提高树的数学模型,$M$表示决策树的数量,${T(x;{\Theta _m})}$表示第$m$棵决策树,${{\Theta _m}}$表示决策树的参数。对于参数${{\Theta _m}}$的集合$\Theta = \{ {\Theta _1},{\Theta _2}, \cdots ,{\Theta _M}\} $,咱们选取的准则是对于集合$D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_N},{y_N})\} $使得损失函数$\sum {L\left( {{y_i},{f_M}({x_i})} \right)} $最小化,即: $$\arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_M}({x_i})} \right)} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},\sum\limits_{m = 1}^M {T(x_i;{\Theta _m})} } \right)} \tag {2}$$ 在前面介绍Adaboost算法博文中,咱们说过,提高学习系列算法采用前向分步算法来迭代训练个体学习器,提高树固然也不例外,因此提高树的迭代训练过程能够表示为: $${f_m}(x) = {f_{m - 1}}(x) + T(x;{\Theta _m}),m = 1,2, \cdots ,M \tag {3}$$ 在这个迭代训练过程当中,每一次迭代都训练完成一颗新的决策树${T(x;{\Theta _m})}$,在这一过程当中,也必须知足整体损失函数最小化,也就是说,对于第$m$次迭代所肯定的决策树${T(x;{\Theta _m})}$的参数${{\Theta _m}}$有: $${{\hat \Theta }_m} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_m}({x_i})} \right)} \tag {4}$$ 将式(3)代入式(4)中,有: $${{\hat \Theta }_m} = \arg \mathop {\min }\limits_\Theta \sum\limits_{i = 1}^N {L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right)} \tag {5}$$css
在提高树算法中,通常采用平方损失函数,因而: $$L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right) = {\left[ {{y_i} - {f_{m - 1}}({x_i}) - T({x_i};{\Theta _m})} \right]^2} \tag {6}$$ 式(6)中,${{y_i} - {f_{m - 1}}({x_i})}$是上一轮迭代中预测值与真实值之间的误差,这个误差在提高树中称为残差,用${{r_{m,i}}}$表示,因而式(6)能够表示为: $$L\left( {{y_i},{f_{m - 1}}({x_i}) + T({x_i};{\Theta _m})} \right) = {\left[ {{r_{m,i}} - T({x_i};{\Theta _m})} \right]^2} \tag {7}$$ 这就是第$m$次迭代训练第$m$棵决策树时的损失函数。能够看出,第$m$次迭代实际上是对上一次迭代的残差进行拟合,而不是相似Adaboost算法中利用上一轮迭代中的偏差率来更新样本权重,这就是提高树算法与Adaboost算法的根本性区别。所以,每一次迭代结束后,提高树算法使用训练样本$x_i$与当前的残差${{r_{m,i}}}$组成新的训练样本集${\{ (xi,{r_{m,i}})\} _{i = 1,2, \cdots ,N}}$来做为下一轮决策树的训练样本集。
用一个例子来加深理解,假如要预测人的年龄,假设真实年龄为30岁,第一棵决策树预测结果为20岁,那么有10岁的残差;第二棵树对10岁的残差进行拟合,输出结果为6岁,有4岁的残差;第3棵树继续对4岁的残差进行拟合……重复这个过程,知道最终的残差在可接受范围,最终的输出结果是每一棵树的预测结果之和。
总结一下提高树的流程:
输入:数据集$D = \{ ({x_1},{y_1}),({x_2},{y_2}), \cdots ,({x_N},{y_N})\} $
(1)初始化个体学习器${f_0}(x) = 0$;
(2)进行$M$次迭代,其中第$m$次迭代的具体过程以下:
(a)针对数据集$D$中每个样本$(x_i,y_i)$计算残差${r_{m,i}} = {y_i} - {f_{m - 1}}({x_i})$;
(b)利用${\{ (xi,{r_{m,i}})\} _{i = 1,2, \cdots ,N}}$来训练一棵新的决策树${T(x;{\Theta _m})}$;
(c)更新组合:${f_m}(x) = {f_{m - 1}}(x) + T(x;{\Theta _m})$;
(3)对$M$次迭代得到的$M$棵决策树进行集成,获得最终的提高树模型:${f_M}(x) = \sum\limits_{m = 1}^M {T(x;{\Theta _m})} $。html
上述过程当中,咱们使用的是平方偏差做为损失函数,这时候对残差的计算会比较简单,可是在不少状况下,咱们可能会使用其余的损失函数,这时候对残差的计算就变得复杂起来。为了更好地解决这一问题这一问题,也就有了梯度提高树。html5