GBDT作为近年很热门的模型,其性能非常突出,用途也是涵盖了从特征选择到分类、回归,被广大从业者和爱好者所使用。
网上关于gbdt的原理和数学推导已经有很多,我就谈谈我个人的浅见,如有错误还望指正。同时还附上我自己实现的简单的python代码,功能比较简单,并且性能也不高,只作为自己对模型的理解,欢迎拍砖。
从大的框架来说,主要可以分解成两个部分:构建树和梯度提升。GBDT中的树一般都是CART,即分类回归树,这是GBDT强大的第一个原因。分类回归树能同时处理分类和回归问题,根据不同的问题类型,采用不同的属性分裂准则。在实现的时候,个人觉得,如何高效地分裂属性是需要好好考虑的。参考xgboost的实现方式,其对列进行了采样,不仅提升了性能,也防止了过拟合。第二个强大的原因就是梯度提升,在前一颗树的残差基础上进行拟合,不得不感叹是一个非常好的思路。让我想到了孔子的“吾日三省吾身”,也就是每次训练完之后,就看看自己和圣人的差距有多少,然后在下一次训练的时候尽量去弥补这个差距。当然了,前提是圣人不会再提升了,否则自己永远也赶不上了。在具体实现的时候,如何体现“梯度提升”,如何对函数求导也是一个难点。好在在friedman的论文中,已经提供了一个比较简便的方法,推导也在论文中给出,因此我的代码就参考了论文中算法6的步骤,即对类似softmax的输出求残差,实现起来比较容易。
我实现的GBDT模型很简单,都没有加入正则化,而且分类的性能好像也不高,跑起来又费时费力,所以欢迎提出改进建议和意见。