gbdt原理理解和分类实例
写在开头:
实在惭愧,博客上次还写了对xgboost的原理理解,结果后面经过某个事情发现自己
对gdbt的实际训练,或者说boosting的实际过程没有那么的理解,
这次重新回头去看了一遍,有了更多的理解,重新写一下自己的理解
这次引用的别人的内容都会注在博客的最后,因为看了以后确实加深了我的理解
其次是才明白一件事,慢就是快,越是浮躁的时候,越得打好基础
1.什么叫Gradient Boosting
这部分其实之前在学习的时候看的李航老师的《统计学习方法》中的8.4节,并认真推导了他书中回归的例子,是以mse作为损失函数的,但并不知道在分类中,原来其实也是以回归的形式来做的。
首先,先解释一下boosting(提升)。提升方法的核心就是“三个臭皮匠,赛过一个诸葛亮”的思路,从弱学习算法出发,反复学习,得到一系列的弱分类器(基分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布)。这句话一开始不太容易理解,以分类问题来解释就是:调用弱学习算法得到一个弱分类器,这个弱分类器得到了各个训练数据属于某个类别的概率,(同原本样本的先验概率有一定差距,不然怎么是弱分类器),即改变了训练数据的概率分布,再调用弱学习算法得到一个弱分类器,如此反复,得到一系列弱分类器
所以,对于提升方法来说,需要解决两个问题:一是每一轮学习中,如何改变训练数据的权值或者概率分布;二是如何将弱分类器组合成一个强分类器。
当然了解boosting的人会知道Adaboost,这篇博客中有关于adaboost详细的推导(https://www.cnblogs.com/linyuanzhou/p/5019166.html
多说一句adaboost,我实际手写推导学习过,里面让预测结果偏差大的树的权重在下一轮训练中变大的数学方法还是很巧妙了,模型会逐步自己关注那些被错误分类的点,adaptive也代表着adaboost名字里面前半部分ada,但是这样也会导致模型对离群样本点过于关注,有噪音时模型效果很差)
2.GB训练过程1
了解了所谓的boosting后,我们得到上面的两个问题,对于第一个问题,在GBDT中,其实就是通过拟合损失函数的负梯度值在当前模型的值,这里需要注意的,在以前的机器学习算法中,我们都是通过直接拟合真实值,而在GBDT里,我们拟合的目标不再是真实值,而是一个梯度值,当然这个梯度值和真实值有关系,后面部分会说明。
对于第二个问题,GBDT中的基分类器当然是决策树。但是决策树有很多比如C4.5、ID3、CART等等。那么用的是哪种树?在GBDT里,用的是CART(分类与回归树),同时Sklearn里面实现GBDT时用的基分类器也是CART。
简单介绍一下CART。一般的CART是这样的:用于分类任务时,树的分裂准则采用基尼指数,用于回归任务时,用MSE(均方误差)。
注意:当然在回归任务中,分裂准则也不再局限于用MSE,也可以用MAE,还可以用Friedman_mse(改进型的mse)。
上面提到,CART可以用于回归和分类,那么到底用回归还是分类呢?上面我们已经提到了,GBDT拟合的目标是一个梯度值,这个值当然是一个连续值或者说实值,所以在GBDT里,通通都是回归树。
有了基分类器后,如何将这些基分类器组合起来?boosting方法一般是使用加法模型。
即:
image.png
其实利用GB训练强学习器的思路,总结下来就是下面这个过程:
image.png image.png对于算法的第4步,在这里先简单提一下,其目的就是为了求一个最优的基分类器。对于不同的基分类器有不同的寻找,比如,对于决策树,寻找一个最优的树的过程其实依靠的就是启发式的分裂准则。
对于算法的第5步,是一个Line search 的过程,具体可以参考Friedman的文章。在GBDT里,通常将这个过程作为Shrinkage,也就是把ρm做为学习率ρm做为学习率,后面实践部分可以看到效果。
对于算法的第6步,求得新的基分类器后,利用加法模型,更新出下一个模型Fm(x)
大家可以发现,对于算法的第1步我没有提到,这是因为,这个需要在讲完第3步才能够说明。算法的第1步是一个初始化的过程。为什么需要初始化?很简单,因为每次在计算负梯度值时需要用到前一个模型Fm−1(xi)预测的值。对于我们训练的第一个模型m=1而言需要有F0(xi)的存在。
那么F0(x)初始化为多少?这个取决于loss function的选择,下面给出一般的做法:
当loss function选择MSE时,F0(x)=y¯,y¯为样本真实值的平均值
当loss function选择MAE时,F0(x)=mediany,也就说用真实值的中位数作为初始值。
当loss function选择logisit loss时
image.png这里需要注意的是,这里就是利用对数几率来初始化,分子∑yi就是正样本的个数,分母就是负样本的个数。
3. GB训练过程2
对于步骤4: 其想表达的是以{y~i,xi}N为训练数据,拟合一颗回归树,最终得到叶子节点的区域
对于步骤5:
在步骤4我们得到叶子节点对应的区域,那么叶子节点的取值为多少?也就是这颗树到底输出多少? 在Friedman的论文中有这部分的推导。这里简单总结一下: 叶子节点的取值和所选择的loss function有关。对于不同的Loss function,叶子节点的值也不一样。
image.png最后一个步其实就是把前面已经训练的m−1颗树预测的结果加上刚训练好的第m颗树的预测结果。
具体的回归的例子 李航的书里面也有
<u>https://blog.csdn.net/qq_22238533/article/details/79185969</u>
上面这个博客里面也有很细的推导不做多讲,主要讲讲分类的实例
分类实例
image.png参数配置:
1. 以logloss为损失函数
2. 以MSE为分裂准则
3. 树的深度为1
4. 学习率为0.1
参考资料:
1.https://blog.csdn.net/qq_22238533/article/details/79192579
2.https://blog.csdn.net/qq_22238533/article/details/79185969
3.https://www.taodocs.com/p-39621555.html
4.https://blog.csdn.net/google19890102/article/details/79496256
gbdt多分类讲解
https://blog.csdn.net/qq_22238533/article/details/79199605
多分类的实际就是多训练了几棵树
是1对n的形式来实现, 通过softmax来形成概率