Boosting算法

\quad\quad boosting算法是目前工业界广泛使用的基于树的集成算法之一,该算法有诸多的优势,包括对过拟合的处理,对缺失数据的处理,对大多数损失函数的支持等等。不过该算法有诸多的变体,有些也比较容易混淆,故本文选取若干主要的boosting算法,尽可能的说明各种boosting算法的来龙去脉。
\quad\quad 本文将从最原始的boosting tree算法讲起,然后扩展到GBDT,最后再介绍xgboost,catboost,lightgbm三种在工业界最受欢迎的算法。

一.boosting tree

\quad\quad 提到boosting算法就不得不先说bagging算法,而最典型的bagging算法就是随机森林。随机森林是强学习器的集成,每棵树的深度都会比较深,因此单棵树的偏差比较小,从而使得方差很大,因此随机森林采用bootstrap的方法对样本和特征进行抽样,构建多棵树,然后将多棵树的结果整合起来,比如如果是回归问题就是多棵树的结果的平均,如果是分类问题就是出现最多的类别。树越多,方差就会减少的越多,但是整个随机森林的方差减少了,偏差就会增大,虽然不会造成过拟合问题,但是预测值和真实期望之间存在较大偏差的问题。而boosting算法正好和bagging算法相反。boosting算法的思想就希望集成弱学习器,通过降低模型偏差的来拟合数据,每个弱学习器只拟合一部分,方差会小很多,然后将弱学习器没有拟合到的部分交给下一个弱学习器继续拟合,不断减少模型偏差,不过带来的后果就是整个模型的方差将会增大,由此可见boosting算法是会过拟合的,需要采用一定的策略来防止过拟合。通常弱学习器是深度较浅的决策树,故而称为boosting tree算法。
\quad\quad 接下来详细介绍boosting tree算法过程。假设当前已训练好的模型为 f k − 1 f_{k-1} fk1,待训练模型为 g k g_k gk,那么当前的目标就是:
m i n g k C o s t ( g k ) = m i n g k ∑ i = 1 N L ( f k − 1 ( x i ) + g k ( x i ) , y i ) (1.1) min_{g_k}Cost(g_k) = min_{g_k}\sum_{i=1}^NL(f_{k-1}(x_i)+g_k(x_i),y_i) \tag{1.1} mingkCost(gk)=mingki=1NL(fk1(xi)+gk(xi),yi)(1.1)
如果模型训练到第k步完成,那么最终的模型就是 f ( x ) = f k − 1 ( x ) + g k ( x ) f(x)=f_{k-1}(x)+g_k(x) f(x)=fk1(x)+gk(x)
训练过程如下:
\quad\quad 首先,初始化模型 f 0 f_0 f0,然后训练一棵决策树 g 1 g_1 g1,使得
∑ i = 0 N L ( f 0 ( x i ) + g 1 ( x i ) , y i ) \sum_{i=0}^NL(f_{0}(x_i)+g_1(x_i),y_i) i=0NL(f0(xi)+g1(xi),yi)最小化,训练一棵树,首先是需要确定好最优的split特征,以及最优的分割点,我以训练单层的二叉决策树为例来说明,假设落入左子节点的样本集为 S l S_{l} Sl,落入右子节点的样本集为 S r S_{r} Sr,那么左子节点因为是叶节点,所以需要一个得分(比如在回归树中,叶子结点得分就是落入该叶子节点的样本的因变量Y的平均),该得分的计算方式如下:
γ 1 , l = a r g m i n γ ∑ i ∈ S l L ( f 0 ( x i ) + γ , y i ) \gamma_{1,l} = argmin_{\gamma}\sum_{i \in S_l}L(f_0(x_i)+\gamma,y_i) γ1,l=argminγiSlL(f0(xi)+γ,yi)
注意这里的 γ 1 , l \gamma_{1,l} γ1,l 为一个值,而不是未知函数,即 g 1 ( x ) = γ 1 , l g_1(x)=\gamma_{1,l} g1(x)=γ1,l ,当 x ∈ S l x \in S_l xSl ,同理计算右叶子结点得分 γ 1 , r \gamma_{1,r} γ1,r,那么当前的分割方式的增益为
g a i n − v = ∑ i = 1 N L ( f 0 ( x i ) , y i ) − ∑ i ∈ S l L ( f 0 ( x i ) + γ 1 , l , y i ) − ∑ i ∈ S r L ( f 0 ( x i ) + γ 1 , r , y i ) gain-v =\sum_{i =1}^NL(f_0(x_i),y_i)-\sum_{i \in S_l}L(f_0(x_i)+\gamma_{1,l},y_i)-\sum_{i \in S_r}L(f_0(x_i)+\gamma_{1,r},y_i) gainv=i=1NL(f0(xi),yi)iSlL(f0(xi)+γ1,l,yi)iSrL(f0(xi)+γ1,r,yi)
然后选取最优的 g a i n − v gain-v gainv对应的分割方式作为二叉树的生成方法。然后令 f 1 ( x ) = f 0 ( x ) + g 1 ( x ) f_1(x)=f_0(x)+g_1(x) f1(x)=f0(x)+g1(x),依此进行剩余树的生成。
\quad\quad boosting tree的一个缺陷就是,并不适用于全部的损失函数,拿回归树来举例,在进行最优分割点计算的时候,采用的算法称为pre-sorting,假设当前待处理的特征为feature,首先针对所有样本的feature值进行从小到大的排序,记录两个列表,列表A存储排序后的feature值,另一个列表B记录排序后的样本的index值(也就是需要知道是哪个样本排在了哪个位置),然后计算列表A相邻两个元素的平均数,这个就是分割点。然后按从小到大的顺序遍历分割点,计算每一个分割点的分割增益,取分割增益最大的分割点为这个特征的最优的分割点。在对分割点进行遍历的时候,需要分别计算左子节点,右子节点的得分,针对MSE来说,就是计算结点内的样本因变量的平均,对于MAE来说,我们需要计算的是中位数。当损失函数是MSE时,我们是可以复用上一个分割点的信息的。具体做法如下:只需在子节点中记录当前的样本的因变量的和,以及样本个数,这样就可以计算叶子结点的得分,即平均值,在遍历下一个分割点的时候,本质上将一个样本从右子节点移动到左子节点,只需要使用 O ( 1 ) O(1) O(1)的时间复杂度就可以完成两个子节点中样本的因变量的和的更新。但是反观MAE,这点就不行,因为将一个样本从右子节点移动到左子节点之后,仍然需要再进行一次结点内的排序,然后才能找到中位值,时间复杂度是远大于 O ( 1 ) O(1) O(1)的,无法找到快速的最优分割点计算方法的。为了解决boosting tree这个缺陷,才诞生了GBDT算法。

二. GBDT(Gradient Boosted Decission Tree)

\quad\quad GBDT算法就是为了解决boosting tree算法适用性较窄的缺陷而产生的算法。目前网上关于GBDT的介绍也有不少,不过多数的介绍都是从回归问题中拟合残差这个角度来写,本部分尝试从另一个角度来介绍,当然这个角度也并非是自己的原创,只不过是查阅了boosting的相关论文和原著,再结合自己的理解汇总而成。
\quad\quad 其实有监督学习的主要目的是要通过自变量 X X X来构建一个模型 f f f,对因变量 Y Y Y进行拟合,从而使得拟合值 Y ^ \hat{Y} Y^和真实值 Y Y Y尽可能的接近。 如果用式子来表达的话,也就是:
m i n f C o s t ( f ) = m i n f ∑ i = 1 N L ( y i , f ( x i ) ) (2.1) min_f Cost(f)=min_f\sum_{i=1}^N L(y_i,f(x_i)) \tag{2.1} minfCost(f)=minfi=1NL(yi,f(xi))(2.1)
其中 L ( . ) L(.) L(.)是损失函数, f f f就是待拟合的函数(或者模型),即 f ( x i ) = y i ^ f(x_i)=\hat{y_i} f(xi)=yi^ C o s t ( . ) Cost(.) Cost(.)函数其实就是样本损失函数的和。
\quad\quad 我们在训练模型的时候,都是使用有限多的样本作为训练集,假设样本数为 N N N,其实单从拟合的角度来讲,我们只需要求解出 N N N个样本所对应的因变量的拟合值 ( y 1 ^ , . . . , y N ^ ) (\hat{y_1},...,\hat{y_N}) (y1^,...,yN^)即可,也就是说并不需要求解一个显性的完整的 f f f,只需要它在 N N N个样本处的取值即可。那这问题就简单的多了,我们只需要令 f ( x i ) = y i f(x_i)=y_i

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值