梯度提升树(GBDT)

梯度提升树是Boosting家族的一员.个体学习器被定为CART回归树.

回归问题的提升树算法

假设用提升树拟合价值100万的房子,第一个回归树拟合80万,残差20万,再用第二个树12万去拟合剩下残差,这时残差8万,再用第三个树5万去拟合剩下的残差,现在残差3万,如果仍不满意还可以继续下去,直到满意为止.

对比一下Boosting家族的另一种算法Adaboost,我在另一篇文章集成学习中介绍过他,Adaboost在训练个体学习器的时候,会根据上一个个体学习器的结果,将错误分类样本的权重提升,最终达到总体分类效果最好.

提升树与Adaboost即又相同之处,又有不同之处.相同点在于都是用更多的基学习器来弥补前面学习器的不足.不同点在于,Adaboost是通过调整样本权重来训练后面的学习器,而提升树是通过拟合残差来训练后面的学习器.

提升树也是采用加法模型:

f _ { m } ( x ) = f _ { m - 1 } ( x ) + T \left( x ; \Theta _ { m } \right)

采用平方损失函数:

L ( y , f ( x ) ) = ( y - f ( x ) ) ^ { 2 }

结合上面两式有:

L \left( y , f _ { m - 1 } ( x ) + T \left( x ; \Theta _ { m } \right) \right)= \left[ y - f _ { m - 1 } ( x ) - T \left( x ; \Theta _ { m } \right) \right] ^ { 2 }

于是损失函数最小,只需使当前决策树拟合当前残差即可:

T \left( x ; \Theta _ { m } \right) = y - f _ { m - 1 } ( x )

梯度提升

平方损失函数的残差很好计算,但是对于一般的损失函数就不那么好计算了.

这里可以把残差当成一个函数 J ,我们可以使用梯度下降的方法找到最小的 J .

对于一颗树 f(x) ,损失函数是相当于关于 f(x) 的函数,若想是损失函数减小,可以参考类似梯度下降的方法:

f_M \left( x \right) = f_1 ( x ) - \frac { \partial L ( y , f_1 ( x ) ) } { \partial f_1 ( x ) }

现在增加另外一棵树,相当于:

f_M (x) = f_1(x) + f_2(x)

这相当于新增加的树为当前模型的负梯度:

f_2(x) = - \frac { \partial L ( y , f_1 ( x ) ) } { \partial f_1 ( x ) }

对比上一种方法回归树用来拟合残差,也就有了负梯度是残差的近似值的说法.

常见损失函数

提升树不仅能解决回归问题,也能解决分类问题,相应的损失函数会有所不同.来看一下常见的损失函数有哪些.

指数损失函数

指数损失函数通常用来处理二分类问题:

L(y, f(x)) = exp(-yf(x))

对数损失函数

对数损失函数有二元和多元两种,对应二元逻辑回归和多元逻辑回归.

二元对数损失函数:

L(y, f(x)) = log(1+ exp(-yf(x)))

多元对数损失函数:

L(y, f(x)) = - \sum\limits_{k=1}^{K}y_klog\;p_k(x)

平方损失函数

用于处理回归问题.

L(y, f(x)) =(y-f(x))^2

绝对值损失函数

和平方损失函数差不多,只不过损失不会被平方放大.

L(y, f(x)) =|y-f(x)|

XGBoost

XGBoost的全称是eXtreme Gradient Boosting,它是GBDT的一个C++实现,并能够自动利用CPU的多线程进行并行,同时在算法上加以改进提高了精度。它相对于传统的GBDT部分增强功能如下:

XGBoost相对GBDT的提升还是很大的,如果你想用提升树的话,直接用XGBoost吧.


参考:
李航<统计学习方法>

posted @ 2018-12-24 14:08:50
评论加载中...
发表评论