吃透GBDT(2019-05-26)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了吃透GBDT(2019-05-26)相关的知识,希望对你有一定的参考价值。

参考技术A

GBDT(Gradient Boosting Decision Tree)是我自己工作中常用的模型,在实际工程中的运用也十分广泛。但是,我在现有的资料中,没有找到一个介绍得比较全面的文章。很多博客说了自己的理解,都是浅尝辄止,更有甚者是不加思考的抄袭,其中不乏错误(我会专门指出这些常见的错误);李航的《统计学习方法》给出了比较好的数学解释,但是对于没有基础的初学者,他写的东西比较理论和晦涩,不易看懂(我也是后来才完全明白);国外的一些论文等资料介绍得比较好,但是也缺乏全面的总结,另外这些文章对中文读者也有一定门槛。这里我总结一下我所有的知识,结合前人的各种文章,尝试写一篇GBDT的综述,希望大家轻拍。

要介绍GBDT,就不能不介绍其他相关的算法,比如Adaboost、随机森林等。我会简要说明这些算法,重点从这些算法和GBDT的区别上来说明GBDT。我还会介绍GBDT各种演变、参数的含义和我理解的这类模型的使用场景和相关参数的建议。

一、集成学习

GDBT、Adaboost、随机森林等,都属于集成学习(ensemble learning)的范畴。集成学习的含义是,通过结合多个学习器(或者说预测方法),来产生新的预测方法。

所谓三个臭皮匠顶上一个诸葛亮。一个最简单的例子是,我需要预测一只股票会不会上涨,有10个朋友有不同的意见。结合他们的意见,我的决策可能是:

又比如说,决定要不要给一个人发信用卡,有年龄、收入、学历、消费水平、婚姻状况很多维度的数据,一个好的预测可能在单一维度上需要很多划分,再组合这些维度:比如25<年龄<50且收入大于某个阈值,加上22<年龄<25且学历是在读硕士,加上消费水平>1k且是已婚女性,等等。

其中,组合成最后的预测方法的单位称为个体学习器(比如每个同事的意见、在年龄这个维度上的阈值分割等)。另外,如果集成方法要求个体学习器为“同质的”,则个体学习器也被称为基学习器(base learner)。

集成学习的关键和核心:如何产生“好而不同”的个体学习器。 即上述的维度都有一定的预测性,但是他们之间关注的角度或者说特征属性又不一致:如果你10个炒股的朋友都是你的大学同学,他们和你同样从事程序员工作,平常的对一个事物的看法也比较一致——那么,结合他们的意见,可能也没啥作用。

二、Boosting的含义和Adaboost

Boost,提升。指的是如何将比较弱的个体学习器增强的方案。比如:个体学习器都是在一个维度上用一个阈值来划分样本(一刀切,英文称stump),Boost通过迭代,找到样本的划分阈值(一个维度上可能有多个阈值组合多次),重复T轮后组合这些个体学习器,得到最后的增强的结果。

常用的迭代方法有:

Adaboost是一种十分常见的boost算法。它的核心思想是,通过迭代,给错误的样本更高的权重,以此来不断更新个体学习器,最后加权组合每一步的个体学习器来实现预测。

关于Adaboost的介绍很多,它的常用算法流程我简要叙述如下:

三、Adaboost的另外一种解释:

Adaboost除了按之前的解释方法以外,也可以解释为把损失函数定义为指数函数的一种梯度下降的迭代方法。李航在《统计学习方法》中,命名为:

我把书的那一页直接贴图了,这样读者能看得清楚一点。大家有条件可以直接参阅书籍。

四、GBDT的基本算法

注意,我这里说的算法,是GBDT的一种类型,具体而言,是将最小化平方误差作为拟合目标,用回归树拟合当前残差的方案(后面一章会介绍其他方案)。

在这种算法中,GBDT是回归树,而不是分类树(但是并不意味着GBDT不能用于二分类问题,其他方案的GBDT可以用分类树!这个问题上很多博客都抄来抄去,一直犯错)。具体算法实现如下:

五、从另一个角度看GBDT,以及GBDT的其他变种

和Adaboost的两种解释类似,GBDT也有对应的数学解释。GBDT可以看做:

利用损失函数的负梯度来作为当前树的拟合目标。损失函数为平方函数时,损失函数的负梯度恰好就是上面说的残差。

它和Adaboost的区别是:

但是,一般的GBDT,损失函数是不限于平方函数的。

损失函数是平方函数时,问题是对Outlier敏感。

常用的损失函数有:

总结:

很多博客引用了以下的图:

但是这个图有一些错误,或者说可能让人混淆的地方:

六、GBDT的变形和参数建议

GBDT的一个重要的参数就是每个DT(Decision Tree)的深度。类似于Adaboost,如果每次迭代时树都完全长成,那么其实就成为了一个基本的决策树,会导致过拟合,也失去了Boost算法的意义。在一些文章中,很多人推荐把树的深度设为4到8之间,并且认为6是个不错的数值。我觉得,这个也要看变量的个数、样本数、每次迭代的步长(后文会介绍)有关。这实际上是一个经验活,而且和每次的训练场景之间相关。

GBDT在实际运用时,常常有两种变体:

“Shrinkage”: 事实上这是一种正则化(regularization)方法,为了进一步过拟合,在每次对残差估计进行迭代时,不直接加上当前步所拟合的残差,而是乘以一个系数。

即:fm = fm-1 + λ * 当前回归数残差

λ为1时,即为不加Shrinkage的一般GBDT。

有文章指出,10 < λ * 迭代次数(或者说数的数目)< 100,是一个比较合适的学习速率。但是一般这个速率常常被设成了0.1,或者0.05。

“Bagging”: 每次迭代单步的树时,随机选一些样本的残差做拟合,而不是把所有样本的残差做拟合(常用的样本残差选取率为0.5-0.6)。这和随机森林的思想有类似之处,下一章详细介绍一下。

七、GBDT和Random Forest的区别简要

我们再简要说明一下另外一类集成学习的方法,Bagging

Bagging,装袋。但是这名字其实是由Bootstrap Aggregating(加速聚合)而来。指的是用并行的方案生成各个各个学习器的方案。

具体而言,Random Forest通过随机抽样、随机选取特征来产生一棵树,最后通过每棵树的结果做线性结合来产生最终的预测结果。由于每棵树的生成过程不依赖于其他树(和GBDT明显区别,GBDT每棵树的产生需要依赖上一层树的结果),所以树的生成是并行的(这也是其成为Bagging的原因)。在RF中,每棵树都是几乎完全长成(但是仅仅预测了部分样本),树的深度会很大。

Boosting方法,每棵树是不能完全长成的,只需要一部分特征就去完成残差的一个迭代降低。个人认为,这特别适合解决这类问题:部分样本就用部分特征就能描述,而另外的样本可能需要其他的特征来描述,比如股票的样本有很多类型的股票,我们有的朋友对一种类型比较擅长,另外的朋友对别的类型比较擅长。我们目前的主要工作,恰好满足这个条件。

八、多说几句感想

能成事,解决实际的问题,需要吃透每一个点,了解每一种工具、每一个算法的由来、含义,特别是工作中的算法,如果只是略知一二,是不能很好地解决问题的。

学习时,真正把一个问题吃透,才有兴趣往下走。如果只是半桶水,似懂非懂,再往下会遇到很多麻烦,因为后面的知识往往依赖于前面的知识,后面的理解学习过程也会很慢。如果一个人前面没有完全吃透,后面学习花的时间会更多。在一个时间内没有达到预期的效果,没有正向反馈,就会对齐失去兴趣。

所以,只有把每个问题吃透,不漏疑点,才能保持兴趣。

什么算吃透?

任何一个公式的由来,含义。公式从来不用记住,只是靠脑子里的理解就能写出来。

但是吃透一个问题,谈何容易!有三点:

根据我的观察(包括学生和老师),高中能做到所有知识点都能融汇贯通的一般都能去985大学,大学里更是只有极少数人能做到这一点。包括所谓的教授,30-50%都是一知半解(他可能只对自己科研的方向比较熟悉,但我认为这不是合格的教授)。

参考文档

GBDT 总结文档

 

在做阿里的o2o优惠券预测的时候学习了GBDT。听闻GBDT的威力,自然要学习学习。

接下来从以下几个方面记录下我对于GBDT的理解。

GBDT的用途,优势

GBDT的结构和算法流程

GBDT如何训练

Sklearn 的GBDT使用,参数意义

 

GBDT的用途,优势

GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,
该算法由多棵决策树组成,所有树的结论累加起来做最终答案。它在被提出之初就和SVM一起被认为是泛化能力较强的算法。
GBDT可以用于分类,也可以用于回归,并且还可以用户特征的筛选。
GBDT的思想使其具有天然优势可以发现多种有区分性的特征以及特征组合。业界中,Facebook使用其来自动发现有效的特征、特征组合,来作为LR模型中的特征,以提高 CTR预估(Click-Through Rate Prediction)的准确性
 
GBDT的概念:
 
GBDT 的全称是 Gradient Boosting Decision Tree,梯度提升决策树。Boosting方法是使用一组弱学习器提升为一个强学习器的方法。要求这些弱学习器是各不相同的,也就是对于同一样本要求有不同的预测结果(如果相同就没有组合的必要了,毕竟是要长短互补的)。还要求这些学习器的准确率要比随机猜好一些。
DT也就是Decision Tree,决策树。决策树分为回归树和分类树两大类。GBDT使用的是分类树。
 
GBDT的结构和算法流程:
 
GBDT,
GBDT由多棵树组成,每棵树是回归树。
GBDT的多棵树组合方式与Adaboost的方式不一样。GBDT的每棵树都是学习上一棵树的残差,也就是在上一棵树学习的结果上继续学习。
这样做的好处就是如果上一棵树完全正确分类,在下一颗树上就不需要学习了,对于误差比较大的才需要继续学习。
 
举个例子,参考自一篇博客(参考文献 4),该博客举出的例子较直观地展现出多棵决策树线性求和过程以及残差的意义。
??训练一个提升树模型来预测年龄:
??训练集是4个人,A,B,C,D年龄分别是14,16,24,26。样本中有购物金额、上网时长、经常到百度知道提问等特征。提升树的过程如下:


技术分享图片

 

图中是直接选取了平均值作为预测值,然后通过真实值减去预测值计算残差 。第二棵树学习上一棵树的残差。

 

在实际使用过程中GBDT算法还有一些问题,即如何划分树,如何确定预测的函数,如何计算残差,如何训练。

(1)如何划分树,也就是我们使用哪一个属性的哪一个值来作为划分条件进行划分。

对于每个特征,尝试这个特征的可能的值进行划分,(如果是连续值的话,可以参考西瓜书,对于连续值的处理)

选择的标准是最小化平方误差,但是也不都是这一个代价函数。

选择第J个变量xi 和他的取值S,作为切分变量和切分点。并且定义两个区域:

技术分享图片

 

然后寻找最优的切分变量J和最优切分点S。具体的,求解:

 技术分享图片

 

(2)如何确定训练的函数

每一棵树都是一个回归树,用一个线性函数去拟合目标值,不一定是用平均值。

每迭代一轮就是多一个树,来对上次的残差进行训练。

(3)如何计算残差

使用梯度的绝对值拟合残差,还要乘以一个学习率

 

(4)如何训练

每轮迭代的时候,首先要使用上一轮训练完的残差来训练出本轮的决策树

要训练出来的这个决策树,加上之后,使得整体的代价函数的值最小。

 

关于GBDT的损失函数,正则化部分看明白了再继续写



参考资料:

shttps://www.jianshu.com/p/005a4e6ac775

《统计学习原理》 





以上是关于吃透GBDT(2019-05-26)的主要内容,如果未能解决你的问题,请参考以下文章

GBDT 总结文档

GBDT几问

GBDT几问

GBDT 算法

机器学习 | GBDT

机器学习 | GBDT