1、GBDT二分类算法简介
GBDT,全称Gradient Boosting Decision Tree,梯度提升决策树。该算法于1999年由Friedman最早提出。
GBDT算法的基本思路是通过对负梯度的不断拟合,实现学习器的更新,得到最终的强学习器。
GBDT算法支持回归算法和分类算法,其分类算法支持二分类和多分类。本文介绍其中的二分类算法。对于二分类算法,得到最终的强学习器后,将其转化为正样本事件发生的概率。
2、关于损失函数
在GBDT二分类算法中,需要选择适当的损失函数以满足负梯度的计算与拟合。一般可选择指数损失函数和经改造的对数损失函数。这里使用经改造的对数损失函数。
以表示预测值,构造损失函数:
,其中
,可见
,对比逻辑回归函数可以发现,
为正样本事件发生的概率。
对损失函数进行变化:
损失函数关于的一阶、二阶导数分别为:
,由于
,故
故当时,损失函数取得极小值。
3、GBDT二分类算法过程
3.1 输入输出
1)输入
训练样本集:,其中
2)输出
最终决策树,并可将其转化为正样本事件发生概率
,以及据此进行样本分类。
3.2 算法过程
3.2.1 模型初始化
初始化的弱学习器为:。
关于的推导过程如下:
代价函数
当时,
取得极小值,即
这里,初始化弱学习器的选择会对迭代效率产生影响。
3.2.2 进行迭代
对于轮迭代:
1)计算负梯度
由前面的推导可以,在时,其负梯度为
记,
负梯度的取值
2)利用负梯度生成回归树
利用负梯度构建新的数据集
利用新数据集生成回归树,在CART回归算法下,得到本轮的回归树,
该回归树对应的叶子节点划分出的区域为。
对于叶子区域,其拟合值记为
,其中
。
根据损失函数的构造,可以看出拟合值无公式解。为得到拟合值,可考虑通过泰勒展开求解近似值,求得
以下为推导取值的过程。
在第t轮迭代时,
将其代入损失函数的泰勒展开式,
在叶子区域将拟合值
代入代价函数
可以看出,上式是关于的一元二次函数,且其二次项的系数为正,存在极小值,其极小值取在对称轴的位置。
此时,
3)更新强学习器
在不满足停止条件时,继续迭代。
2.2.3 得到最终学习器
在第轮迭代时:当损失函数小于指定值或满足其它设定的停止条件(如迭代次数、分类器在训练集或测试集上的性能等)时,迭代停止。
将其sigmoid转换为概率
根据预测的概率,可以对样本进行类别划分。如当时,归类为正样本,否则为负样本。
4、算法实例
给定如下数据集:
序号 | 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 |
y | 0 | 0 | 0 | 1 | 1 | 1 | 1 | 0 | 1 | 0 |
记,
为预测特征。
4.1 模型初始化
初始化的弱学习器为:
这里,我们设定个模型停止迭代的条件:当负梯度为0或迭代次数>5时,停止迭代。
4.2 进行迭代
4.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 | -0.5 | -0.5 | -0.5 | 0.5 | 0.5 | 0.5 | 0.5 | -0.5 | 0.5 | -0.5 |
2)利用负梯度生成回归树
利用负梯度构建新的数据集
在CART回归算法下,得到本轮的回归树。
3)更新强学习器
4.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.5 | -0.5 | -0.5 | 0.2689 | 0.2689 | 0.2689 | 0.2689 | -0.6225 | 0.3775 | -0.5 |
2)利用负梯度生成回归树
利用负梯度构建新的数据集
在CART回归算法下,得到本轮的回归树。
3)更新强学习器
4.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.3775 | -0.3775 | -0.3775 | 0.2194 | 0.2194 | 0.2194 | 0.2194 | -0.4847 | 0.2937 | -0.3633 |
2)利用负梯度生成回归树
利用负梯度构建新的数据集
在CART回归算法下,得到本轮的回归树。
3)更新强学习器
4.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 |
r4 | -0.2937 | -0.2937 | -0.2937 | 0.1842 | 0.1842 | 0.1842 | 0.1842 | -0.3810 | 0.2366 | -0.2719 |
2)利用负梯度生成回归树
利用负梯度构建新的数据集
在CART回归算法下,得到本轮的回归树。
3)更新强学习器
4.2.5 第5轮迭代
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 |
r5 | -0.2366 | -0.2366 | -0.2366 | 0.1581 | 0.1581 | 0.1581 | 0.1581 | -0.3075 | 0.1966 | -0.2122 |
2)利用负梯度生成回归树
利用负梯度构建新的数据集
在CART回归算法下,得到本轮的回归树。
3)更新强学习器
4.3 得到最终学习器
在第5轮迭代时,迭代次数满足停止条件时,迭代停止。
将其sigmoid转换为概率
根据预测的概率,可以对样本进行类别划分。如当时,归类为正样本,否则为负样本。
利用对样本进行预测,预测值为:[-1.40786137, -1.40786137, -1.40786137, 1.83063012, 1.83063012,1.83063012, 1.83063012, -1.07152558, 1.60443296, -1.57152558],
其sigmoid转换值为概率:[0.19657159, 0.19657159, 0.19657159, 0.86183677, 0.86183677, 0.86183677, 0.86183677, 0.25511307, 0.83263704, 0.17199902],
根据概率进行分类:[0,0,0,1,1,1,1,0,1,0]。
5、算法代码实现
本例中,使用sklearn中的GradientBoostingClassifier算法训练分类树。由于该算法中的参数设置原因,最终分类树的结果可能与前述分析不一样。
from sklearn.ensemble import GradientBoostingClassifier
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],
'y':[0,0,0,1,1,1,1,0,1,0]}
)
X = df.iloc[:,0:2]
y = df.iloc[:,2]
gbdt = GradientBoostingClassifier(random_state=0)
gbdt.fit(X,y)
gbdt.predict(X)
array([0, 0, 0, 1, 1, 1, 1, 0, 1, 0])
6、算法说明
1、GBDT算法既支持回归也支持分类,均以CART回归算法作为基学习器。在GBDT二分类算法中,需要对负梯度进行拟合,因此其基学习器采用回归算法。
2、GBDT二分类算法中的输入特征只支持连续特征,不支持类别特征。
3、在GBDT算法中实现过程中, 一般会设置一个学习率learning_rate
,用shrinkage(缩减)的思想,缩小每棵树的贡献,减缓大幅度的拟合容易产生的过拟合风险。