GBDT算法讲解

GBDT(Gradient Boosting Decision Tree)是一种以决策树(cart 树)作为基学习器的机器学习方法。它是具体实现gradient boosting框架算法中的一种,会学习多棵决策树。GBDT的基学习器是CART树,所以GBDT每一棵树的生成过程都是CART树的生成过程,例如:如何选择最优的分裂节点。正如GBDT的名字一样,它采用梯度下降的方法来优化损失函数,所以每一次迭代,下一棵树学习的是损失函数的负梯度在当前模型的值。注意这里并不是上一棵树的负梯度,而是损失函数的负梯度在当前整个加分模型。最后GBDT会累加所有树的结果。

这里需要指出的是,GBDT无论用于回归还是分类,它的基学习器都是回归树。因为每一次迭代拟合的都是损失函数的负梯度在上一棵树的值,这就代表拟合的y值是一个连续值。所以都用回归树而不是分类树。

因为,GBDT是建立在gradient boosting框架的基础之上。所以,下面先截取一段关于gradient  boosting算法框架的通用定义(维基百科 ):

输入: 训练集  一个可微的损失函数  迭代次数 M.

gradient boosting算法: 

  1. 用常数初始化模型:

  2. 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算法的伪码:

  1. 用常数初始化模型:

  2. For m = 1 to M:

            a)计算伪残差: 

                  

           b)用上一棵树的 伪残差拟合一棵新的树, i.e. train it using the training set . 得到第m棵树的叶结点区域为R_{mj}, j=1,2,3,......,J

           c)利用一维线性优化估计叶结点区域的值\gamma _{mj}:

               

           d)更新模型:

                F_m(x)=F_{m-1}(x)+\sum_{j=1}^{J}\gamma _{mj}I(x\in R_{mj}) 

     3.  Output F_M(x)=\sum_{m=1}^{M}\sum_{j=1}^{J}\gamma _{mj}I(x\in R_{mj})

这里的\gamma _{mj}将决策树的系数\gamma_m和决策树每个结点区域的值融合到了一起,所以这里也可以看出每一个结点区域的系数有可能不同。因为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

 

你可能感兴趣的:(机器学习)