1、GBDT算法简介
GBDT,全称Gradient Boosting Decision Tree,梯度提升决策树。该算法于1999年由Friedman最早提出。
在boosting集成学习算法中,梯度提升算法是极其重要的一种算法。GBDT算法是梯度提升算法中一种具有代表性的算法。
GBDT算法的基本思路是通过对负梯度的不断拟合,实现学习器的更新,得到最终的强学习器。
当损失函数为平方损失函数时,负梯度正好等于残差,此时可通过对残差的不断拟合实现学习器的更新。
2、GBDT算法过程
GBDT算法本质上是一种回归算法,在此基础上可改造为分类算法。这里讲解GBDT回归算法。
在节点分裂过程中,一般是选择ID3算法、C4.5算法、CART算法中的一种。GBDT算法中,节点的分裂采用的是CART回归算法。
2.1 输入输出
1)输入
训练样本集:
2)输出
最终回归树
2.2 算法过程
2.2.1 模型初始化
初始化的弱学习器为:,其中
这里,初始化弱学习器的选择会对迭代效率产生影响。
2.2.2 进行迭代
对于轮迭代:
1)计算样本残差
本轮样本残差
Tips:
在梯度提升决策树中,损失函数的形态决定着梯度的计算。在GBDT回归算法中,一般选择平方损失函数。即:
此时其负梯度为:
可以看出,此时的负梯度正好等于残差。
2)利用残差生成回归树
利用残差构建新的数据集
利用新数据集生成回归树,在CART回归算法下,得到本轮的回归树
该回归树对应的叶子节点划分出的区域为
对于叶子区域,其拟合值为,其中,表示叶子区域样本的数量。
3)更新强学习器
在不满足停止条件时,继续迭代。
2.2.3 得到最终学习器
在第轮迭代时:当损失函数小于指定值或满足其它设定的停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。
3、算法实例
给定如下数据集:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
age | 18 | 20 | 22 | 25 | 28 | 30 | 35 | 40 | 45 | 50 |
level | 1 | 1 | 3 | 2 | 3 | 5 | 4 | 2 | 6 | 1 |
score | 50 | 66 | 60 | 70 | 80 | 76 | 88 | 56 | 82 | 64 |
记,为预测特征。
3.1 模型初始化
初始化的弱学习器为:
这里,我们设定个模型停止迭代的条件:当残差为0或迭代次数>5时,停止迭代。
3.2 进行迭代
3.2.1 第1轮迭代
1)计算样本残差
本轮样本残差
数据如下:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
age | 18 | 20 | 22 | 25 | 28 | 30 | 35 | 40 | 45 | 50 |
level | 1 | 1 | 3 | 2 | 3 | 5 | 4 | 2 | 6 | 1 |
r1 | -19.2 | -3.2 | -9.2 | 0.8 | 10.8 | 6.8 | 18.8 | -13.2 | 12.8 | -5.2 |
2)利用残差生成回归树
在CART回归算法下,得到本轮的回归树。
将特征age从小到大排序,以每邻近两值的平均值作为切割点,可得9个切割点,切割点左右部分分别计算平均值,以两部分的平均值作为各部分的估计值,分别计算切割点左右的平方误差。类似处理特征level。
选择最小平方误差对应的特征和切割点,作为分裂节点。对分裂后的每个区域,继续照此分裂。设定树的深度为3,当树的深度达到3时停止分裂。
通过以上过程得出本轮回归树,
共有6个叶子区域:
,其拟合值
,其拟合值
,其拟合值
,其拟合值
,其拟合值
,其拟合值
其图示如下:
图中value表示回归树在该节点下的拟合值。
树的具体生成过程可参考:CART算法之回归树-CSDN博客
3)更新强学习器
3.2.2 第2轮迭代
1)计算本轮样本残差
本轮样本残差
数据如下:
序号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
age | 18 | 20 | 22 | 25 | 28 | 30 | 35 | 40 | 45 | 50 |
level | 1 | 1 | 3 | 2 | 3 | 5 | 4 | 2 | 6 | 1 |
r2 | 0 | -3 | -9 | 1 | 11 | 0 | 0 | -4 | 0 | 4 |
2)利用残差生成回归树
通过CART回归算法得出本轮回归树,
共有7个叶子区域:
,其拟合值
,其拟合值
,其拟合值
,其拟合值
,其拟合值
,其拟合值
,其拟合值
其图示如下:
3)更新强学习器
3.2.3 第3轮迭代
1)计算本轮样本残差
本轮样本残差
数据如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
age | 18 | 20 | 22 | 25 | 28 | 30 | 35 | 40 | 45 | 50 |
level | 1 | 1 | 3 | 2 | 3 | 5 | 4 | 2 | 6 | 1 |
r3 | 0 | 0 | 0 | 0 | 0 | 1 | 1 | -3 | 1 | 0 |
2)利用残差生成回归树
通过CART回归算法得出本轮回归树,
共有4个叶子区域:
,其拟合值
,其拟合值
,其拟合值
,其拟合值
其图示如下:
3)更新强学习器
3.2.4 第4轮迭代
1)计算本轮样本残差
本轮样本残差
数据如下:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | |
age | 18 | 20 | 22 | 25 | 28 | 30 | 35 | 40 | 45 | 50 |
level | 1 | 1 | 3 | 2 | 3 | 5 | 4 | 2 | 6 | 1 |
r | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
残差均为0,能够完全拟合残差,分裂停止。
3.3 得到最终学习器
最终学习器,即
4、算法代码实现
本例中,使用sklearn中的GradientBoostingRegressor算法训练回归树。由于该算法中的参数设置原因,最终分类树的结果可能与前述分析不一样。
from sklearn.ensemble import GradientBoostingRegressor
df = pd.DataFrame(
{'age':[18,20,22,25,28,30,35,40,45,50],
'level':[1,1,3,2,3,5,4,2,6,1],
'score':[50,66,60,70,80,76,88,56,82,64]}
)
X = df.iloc[:,0:2]
y = df.iloc[:,2]
gbdt = GradientBoostingRegressor(random_state=0)
gbdt.fit(X,y)
gbdt.predict(X)
array([50.01010981, 65.98314498, 60.00986206, 70.00231756, 79.97949217, 76.01309023, 87.99022476, 56.01830674, 81.99924901, 63.99420268])
5、算法的说明
1、GBDT算法既支持回归也支持分类,均以CART回归算法作为基学习器。在GBDT算法中,需要对残差进行拟合,因此其基学习器采用回归算法。
2、GBDT算法中的输入特征只支持连续特征,不支持类别特征。
3、在GBDT算法中实现过程中, 一般会设置一个学习率learning_rate
,用shrinkage(缩减)的思想,缩小每棵树的贡献,延缓大幅度的拟合容易产生的过拟合。