赞
踩
GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。
(本篇GBDT集成模型部分内容涉及到机器学习基础知识、决策树、回归树算法,没有先序知识储备的宝宝可以查看ShowMeAI的文章 图解机器学习 | 机器学习基础知识 、决策树模型详解 及 回归树模型详解)。
Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。
Bagging与Boosting的串行训练方式不同,Bagging方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。
GBDT的原理很简单:
如图是一个非常简单的帮助理解的示例,我们用GBDT去预测年龄:
最终,四棵树的结论加起来,得到30岁这个标注答案(实际工程实现里,GBDT是计算负梯度,用负梯度近似残差)。
回归任务下,GBDT在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数:
l(yi,yi)=12(yi−yi)2l(y_{i}, \hat{y_{i}})=\frac{1}{2}(y_{i}-\hat{y_{i}}){2}l(yi,yi)=21(yi−yi^)2
损失函数的负梯度计算如下:
−[∂l(yi,yi)∂yi]=(yi−yi^)-[\frac{\partial l(y_{i}, \hat{y_{i}})}{\partial \hat{y_{i}}}]=(y_{i}-\hat{y_{i}})−[∂yi∂l(yi,yi)]=(yi−yi^)
可以看出,当损失函数选用「均方误差损失」时,每一次拟合的值就是(真实值-预测值),即残差。
我们来借助1个简单的例子理解一下GBDT的训练过程。假定训练集只有4个人 (A,B,C,D),他们的年龄分别是 (14,16,24,26)。其中,A、B分别是高一和高三学生;C、D分别是应届毕业生和工作两年的员工。
我们先看看用回归树来训练,得到的结果如下图所示:
接下来改用GBDT来训练。由于样本数据少,我们限定叶子节点最多为2(即每棵树都只有一个分枝),并且限定树的棵树为2。最终训练得到的结果如下图所示:
上图中的树很好理解:A、B年龄较为相近,C、D年龄较为相近,被分为左右两支,每支用平均年龄作为预测值。
上图中的树就是残差学习的过程了:
最终的预测过程是这样的:
综上,GBDT需要将多棵树的得分累加得到最终的预测得分,且每轮迭代,都是在现有树的基础上,增加一棵新的树去拟合前面树的预测值与真实值之间的残差。
下面我们来对比一下「梯度提升」与「梯度下降」。这两种迭代优化算法,都是在每1轮迭代中,利用损失函数负梯度方向的信息,更新当前模型,只不过:
wt=wt−1−ρt∇wL∣w=wt−1w_{t}=w_{t-1}-\left.\rho_{t} \nabla_{w} L\right|{w=w{t-1}}wt=wt−1−ρt∇wL∣w=wt−1
L=∑il(yi,fw(wi))L=\sum_{i} l\left(y_{i}, f_{w}\left(w_{i}\right)\right)L=i∑l(yi,fw(wi))
F=Ft−1−ρt∇FL∣F=Ft−1F=F_{t-1}-\left.\rho_{t} \nabla_{F} L\right|{F=F{t-1}}F=Ft−1−ρt∇FL∣F=Ft−1
L=∑il(yi,F(xi))L=\sum_{i} l\left(y_{i}, F\left(x_{i}\right)\right)L=i∑l(yi,F(xi))
下面我们来总结一下GBDT模型的优缺点:
对比ShowMeAI前面讲解的另外一个集成树模型算法随机森林,我们来看看GBDT和它的异同点。
下面是我们直接使用python机器学习工具库sklearn来对数据拟合和可视化的代码:
python复制代码# 使用Sklearn调用GBDT模型拟合数据并可视化 import numpy as np import pydotplus from sklearn.ensemble import GradientBoostingRegressor X = np.arange(1, 11).reshape(-1, 1) y = np.array([5.16, 4.73, 5.95, 6.42, 6.88, 7.15, 8.95, 8.71, 9.50, 9.15]) gbdt = GradientBoostingRegressor(max_depth=4, criterion ='squared_error').fit(X, y) from IPython.display import Image from pydotplus import graph_from_dot_data from sklearn.tree import export_graphviz # 拟合训练5棵树 sub_tree = gbdt.estimators_[4, 0] dot_data = export_graphviz(sub_tree, out_file=None, filled=True, rounded=True, special_characters=True, precision=2) graph = pydotplus.graph_from_dot_data(dot_data) Image(graph.create_png()) ![](http://image.showmeai.tech/machine_learning_algorithms/176.png)
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。