GBDT(Gradient Boosting Decision Tree)是一种以决策树(cart 树)作为基学习器的机器学习方法。它是具体实现gradient boosting框架算法中的一种,会学习多棵决策树。GBDT的基学习器是CART树,所以GBDT每一棵树的生成过程都是CART树的生成过程,例如:如何选择最优的分裂节点。正如GBDT的名字一样,它采用梯度下降的方法来优化损失函数,所以每一次迭代,下一棵树学习的是损失函数的负梯度在当前模型的值。注意这里并不是上一棵树的负梯度,而是损失函数的负梯度在当前整个加分模型。最后GBDT会累加所有树的结果。
这里需要指出的是,GBDT无论用于回归还是分类,它的基学习器都是回归树。因为每一次迭代拟合的都是损失函数的负梯度在上一棵树的值,这就代表拟合的y值是一个连续值。所以都用回归树而不是分类树。
因为,GBDT是建立在gradient boosting框架的基础之上。所以,下面先截取一段关于gradient boosting算法框架的通用定义(维基百科 ):
输入: 训练集 一个可微的损失函数 迭代次数 M.
gradient boosting算法:
- 用常数初始化模型:
- For m = 1 to M:
a)计算伪残差:
b)用当前学习器的伪残差拟合一个基学习器(e.g. tree) , i.e. train it using the training set . 也就是用拟残差代替原来的y值。
c)利用一维线性优化计算每一个基学习器的权值 ,可以理解为步长 :
d)更新模型:
3.输出最终的模型
GBDT在这个框架之上采用用决策树(cart 树)作为基学习器。Friedman在这基础之上还做了改动,对每棵树的权值做了改善。GBDT并不是一棵树使用一个权值,而是在每棵树不同的叶子结点区域计算不同的权重,这样做可以提高基学习的适应性。个人觉得是因为这样可以给表现好的叶子结点区域更高的权重,表现不好的叶子结点区域相对低的权重。
下面是GBDT算法的伪码:
- 用常数初始化模型:
- For m = 1 to M:
a)计算伪残差:
b)用上一棵树的 伪残差拟合一棵新的树, i.e. train it using the training set . 得到第m棵树的叶结点区域为
c)利用一维线性优化估计叶结点区域的值:
d)更新模型:
3. Output
这里的将决策树的系数
和决策树每个结点区域的值融合到了一起,所以这里也可以看出每一个结点区域的系数有可能不同。因为GBDT用的是回归树,所以每个结点区域返回的值是所有结点的平均值,也就是一个固定值。所以可以将系数和值融合到一起。根据维基百科,gradient boosting的损失函数为可微的就可以,所以个人觉得gradient boosting是可以自定义损失函数。那么基于gradient boosting实现的GBDT的损失函数就可以为一般的损失函数,也可以自定义。
如果写的有什么问题,欢迎大家在下面讨论?
参考连接:https://en.wikipedia.org/wiki/Gradient_boosting
https://blog.csdn.net/qq_22238533/article/details/79185969
https://blog.csdn.net/qq_22238533/article/details/79192579
https://www.jianshu.com/p/0e5ccc88d2cb
http://nbviewer.jupyter.org/github/liudragonfly/GBDT/blob/master/GBDT.ipynb