GBDT(Gradient Boosting Decision Tree),全名叫梯度提升决策树,是一种迭代的决策树算法,又叫 MART(Multiple Additive Regression Tree),它通过构造一组弱的学习器(树),并把多颗决策树的结果累加起来作为最终的预测输出。该算法将决策树与集成思想进行了有效的结合。
GBDT中的树是回归树(不是分类树),GBDT用来做回归预测,调整后也可以用于分类。
Boosting方法训练基分类器时采用串行的方式,各个基分类器之间有依赖。它的基本思路是将基分类器层层叠加,每一层在训练的时候,对前一层基分类器分错的样本,给予更高的权重。测试时,根据各层分类器的结果的加权得到最终结果。
Bagging 与 Boosting 的串行训练方式不同,Bagging 方法在训练过程中,各基分类器之间无强依赖,可以进行并行训练。
1、GBDT与负梯度近似残差
回归任务下,GBDT在每一轮的迭代时对每个样本都会有一个预测值,此时的损失函数为均方差损失函数:
损失函数的负梯度计算如下:
「均方误差损失」时,每一次拟合的值就是(真实值-预测值),即残差。
2、GBDT训练过程
我们来借助1个简单的例子理解一下 GBDT 的训练过程。假定训练集只有4个人(A、B、C、D),他们的年龄分别是(14,16,24,26)。其中,A、B分别是高一和高三学生;C、D分别是应届毕业生和工作两年的员工。
我们先看看用回归树来训练,得到的结果如下图所示:
接下来改用 GBDT 来训练。由于样本数据少,我们限定叶子节点最多为2(即每棵树都只有一个分枝),并且限定树的棵树为2。 最终训练得到的结果如下图所示:
上图中的树很好理解:A、B年龄较为相近,C、D年龄较为相近,被分为左右两支,每支用平均年龄作为预测值。
## 使用Sklearn调用GBDT模型拟合数据并可视化
import numpy as np
import pydotplus
import os
from sklearn.ensemble import GradientBoostingRegressor
os.environ["PATH"]+=os.pathsep+'C:/Program Files/Graphviz/bin/' #指定路径
import sklearn
sklearn.__version__
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 ='mse').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())
阅读量:227
点赞量:0
收藏量:0