本文尽量以简洁语言说明GBDT。
1.什么是GBDT
GBDT属于集成算法的一种,基分类器是回归树(分类问题也是回归树,最后再用sigmoid或者softmax函数计算类别),是一种boosting算法,即逐步拟合逼近真实值,是一个串行的算法,可以减少bias(误差)却不能减少variance(偏差),因为每次基本都是全样本参与训练,不能消除偶然性的影响,但每次都逐步逼近真实值,可以减少误差。
GBDT包括三种基本用法,一是回归,二是二分类,三是多分类。技术细节有点差异,但是整体思路都是一样的。
2.GBDT要知道的基础知识
- 基分类器是cart回归树,你要知道树怎么划分节点,怎么停止分裂,这个不知道的自己去百度吧。
- 损失函数有很多,回归问题常用均方差,绝对值,huber和分位数也常用,但是基本的问题就用均方差解决了,因为求导特别方便;分类问题常用对数形式的损失函数,这里注意用的是(-1,1)形式的对数损失函数,可以证明和(0,1)形式的是等价的(https://www.cnblogs.com/ScorpioLu/p/8296994.html)。
- 目标函数值初始化,每次说到目标函数和损失函数都害怕大家误解,这里的目标函数指函数最终预测值。初代的目标函数,根据目标函数的不同会有不同的初始化方案,比如均方差损失是均值,绝对值损失是中位数,对数损失是正负样本概率值比的一半。
- 正则化,人家别的算法都在损失函数上加一个L2正则,这个树咋办啊,这个树有自己的办法,比如设置一个学习率,设置一个树的结构(最大的深度,最大的叶子节点数),也可以随机抽样本训练树,也可以随机抽指标参与训练,也可以用CART的剪枝策略。
- 回归和分类有什么区别,回归树叶子节点得分就是均值,然后每棵树每个样本都有一个得分,得分累加就是最后的预测值。分类就不一样了,叶子节点的得分是用牛顿法计算出来的用偏差计算的一个数值,听听这个麻烦,你肯定不能它直接当预测结果,用sigmoid或者softmax算一下概率就出来分类了。
- 为什么残差可以作为拟合的目标值,因为采用梯度下降算法,梯度就是求导,平方损失函数,残差就是梯度。
3.GBDT算法流程
3.1 回归问题
回归问题,其实相对比较好理解,抛开网上的流程,简单说,以平方误差为。
(1)初始化,就是所有样本值都初始化为均值,算出来第一轮残差值(残差-当前值的平方可以作为损失函数)。
(2)误差和特征值带进去构建树,划分标准为平方误差减少最多的那个特征值,然后划分到叶子节点,用均值作为这一轮的预测值,然后更新目标值和残差值,加上学习率。
(3)重复第2步,直至满足终止条件,可能是达到最大树的个数,可能是最终的目标值变化幅度不大了。
(4)更新累积目标值作为最终的预测结果。
GBDT算法原理
你看他那个学习率ρ还要学习更新实际不用更新,自己选一个经验值好了,我看0.01就不错。
3.2 二分类问题
(1)初始化
二分类问题,损失函数形式是对数形式,
二分类的损失函数
。
然后初始值是:
二分类初始值
(2)接下来和回归问题一样,拿残差(这里说残差不太合适,因为实际计算用的是上一轮的预测值,思想可以归到残差)去拟合一颗CART树,CART树划分的标准是均方损失最小。我们要知道叶子节点得分怎么计算,第一步是用梯度当估计值,然后根据牛顿法,算出来一个叶子节点得分值,这个公式不用推导记住咋用就行了,然后采用和回归一样的加法原理,继续计算残差继续拟合。
(3)计算概率,二分类,用sigmoid函数计算最后的预测类别。
二分类流程
3.3 多分类问题
多分类问题其实跟二分类差不多吧,只不过一轮拟合k颗树,k等于要分出来的类别。举个例子,我们要预测某个电影角色是好人或者坏人或者中立,y值有0,1,2三种,那么构造目标的值的时候,可以做一个onehot编码。假设一个人是好人,那么第一颗树的目标值是[1,0,0]带入计算的值是1,以此类推。
多分类问题用log损失作为损失函数,用MSE作为树的分裂准则。
(1)设置目标函数,这个多分类没有初始化方案,直接构建三棵树,构建完以后算那个类别。
(2)继续以残差为目标函数拟合树,拟合方案跟回归树一样,然后算函数得分值。
(3)计算三棵树的得分值,用softmax函数计算最后的分类。
多分类问题流程
这个算法流程和sklearn实现有出入的,但是这个应该,是最标准的计算方案,具体实现大家可以自己思考,反正我们知道上边的计算方法就行了。
而且悄悄说一句,最后不都是调包嘛。
网友评论