boost集成模型

boost集成模型

简述:

常用集成树模型有随机森林、gbdt、xgb、lgb;bagging随机森林很简单,随机取特征和样本,不容易过拟合,不做介绍。主要介绍一下gbdt和xgb.

cart决策树:

  • 分类树使用基尼系数增益,原理上和id3差不多,本质上还是将概率分布进行了一种转换。
  • 分类二叉树的特性让cart相较于id3而言,不会选择离散值多的特征,但是另外一方面也加大了计算量,id3相当于把数据集分成n份,而cart树要每个特征的每个分割值都要计算所有的数据集,而且特征还可以重复使用。
  • 回归二叉树通过均方误差最小寻找切分特征和切分点

boost 模型:

boost方法的原理几乎都是一样,模型都是加法模型
f M ( x ) = Σ T ( x ; Θ ) f_M(x)=\Sigma T(x;\Theta) fM(x)=ΣT(x;Θ)
学习方法都是迭代:
f ( x ) = f m − 1 ( x ) + T ( x ; Θ ) f(x)=f_{m-1}(x)+T(x;\Theta) f(x)=fm1(x)+T(x;Θ)

为什么需要boost模型?
理论上决策树只要树的深度足够深,就可以很好的拟合当前数据,但是容易过拟合验证,有一个形象的解释,单决策树相当于把样本空间切分的过细,容易过拟合,boost每次迭代一个新的模型都是一个新的样本空间,因此不容易过拟合。

adaboost 模型:

adaboost没有指定分类器类型,因此可以说它只是提供了一个框架,当指定基分类器是决策树的时候, adaboost就是提升树,其迭代方法与boost思想一致,指定了指数损失:exp[-yf(x)],其收敛速度也是指数级的,需要注意的是指数损失一般用于 分类 ,这个是因为分类确实用指数损失计算方便。
adaboost加法模型同boost一致:
f M ( x ) = Σ G m ( x ; Θ ) f_M(x)=\Sigma G_{m}(x;\Theta) fM(x)=ΣGm(x;Θ)
损失函数是指数函数:
L = a r g m i n Σ e [ − y i ( f m − 1 ( x ) + α G ( x ) ) ] L = argmin\Sigma e^{[-y_i(f_{m-1}(x)+\alpha G(x))]} L=argminΣe[yi(fm1(x)+αG(x))]
L = a r g m i n Σ w ˉ e − y i α G ( x ) L = argmin\Sigma\bar{w}e^{-y_i\alpha G(x)} L=argminΣwˉeyiαG(x)
这里 w ˉ = e − y i f m − 1 ( x ) \bar{w}=e^{-y_if_{m-1}(x)} wˉ=eyifm1(x)因为 f m − 1 f_{m-1} fm1是已知的
接下来我们要求的就是让L最小,我们直接对损失函数求一阶导, 然后令导函数为0,求解析解即可得到 α \alpha α的值,计算如下:
L = Σ w ˉ e − y i α G ( x ) L = \Sigma\bar{w}e^{-y_i\alpha G(x)} L=ΣwˉeyiαG(x)
L = Σ y i ! = G ( x ) w ˉ e − α + Σ y i = G ( x ) w ˉ e α L = \Sigma_{y_i!=G(x)}\bar{w}e^{-\alpha} + \Sigma_{y_i=G(x)}\bar{w}e^{\alpha} L=Σyi!=G(x)wˉeα+Σyi=G(x)wˉeα
上面的损失函数转化求导后可得:这里详细的过程参考李航的<统计学习方法>
α ^ = 1 2 l o g 1 − e m e m \hat{\alpha}=\frac{1}{2}log\frac{1-e_m}{e_m} α^=21logem1em其中 e m e_m em标识分类错误率.

我们总结一下即可得到:
w ˉ \bar{w} wˉ就是adaboost中未归一化的样本权重更新值,依赖于上一层模型的错误分类, α \alpha α就是每个模型的权重,依赖于当前模型的错误分类和输入的样本权重。

提升树模型:

提升树模型通常是指定了以cart决策树为基分类器,因此可以说它只是提供了一个框架,其迭代方法与boost思想一致,未指定损失函数(与adaboost比较),一般有均方误差和huber损失(回归), 指数损失(分类)等。
如果损失函数为均方误差, 我们来看看利用boost方法的推导过程。我们用 T T T标识树,则加法模型表示为:
f M ( x ) = T ( x ; θ ) f_M(x) = T(x;\theta) fM(x)=T(x;θ)

迭代算法:
f m ( x ) = f m − 1 ( x ) + T ( x ; θ ) f_m(x) = f_{m-1}(x) + T(x;\theta) fm(x)=fm1(x)+T(x;θ)

损失函数:
Σ L ( y i , f m − 1 ( x i ) + T ( x i ; θ ) ) \Sigma L(y_i,f_{m-1}(x_i) + T(x_i;\theta)) ΣL(yi,fm1(xi)+T(xi;θ))

采用均方误差时:
L ( y , f ( x ) ) = ( y − f ( x ) ) 2 L(y, f(x))=(y-f(x))^2 L(y,f(x))=(yf(x))2
L ( y , f ( x ) ) = ( y − f m − 1 ( x ) − T ( x ; θ ) ) 2 L(y, f(x))=(y-f_{m-1}(x)-T(x;\theta))^2 L(y,f(x))=(yfm1(x)T(x;θ))2
L ( y , f ( x ) ) = ( r − T ( x ; θ ) ) 2 L(y, f(x))=(r-T(x;\theta))^2 L(y,f(x))=(rT(x;θ))2
其中 r = y − f m − 1 ( x ) r=y-f_{m-1}(x) r=yfm1(x),就是残差了。
通过adaboost的指数损失和提升树的均方误差我们知道这些迭代求解是比较简单的。指数损失直接解析解可以求出,均方误差都不用求导,但是并不是所有的损失函数都这么方便。但是通过均方误差我们也很容易发现一个规律,那就是 r r r和梯度的关系,该关系可以通过上述的损失函数求一阶导得到 L ˙ = f m − 1 − y = − r \dot{L}=f_{m-1}-y=-r L˙=fm1y=r,解释下来就是集成树只要负责拟合之前模型的梯度即可,那么在优化损失函数没那么方便的时候自然可以使用泰勒公式简化运算,找到近似解。

gbdt:梯度提升树

梯度提升树同提升树是一样的,只需要将上面的
r改成
r = − [ d L ( y , f m − 1 ( x ) ) d ( f m − 1 ( x ) ) ] r = - [ \frac{dL(y, f_{m-1}(x))}{d(f_{m-1}(x))} ] r=[d(fm1(x))dL(y,fm1(x))]
通常将上述函数用一阶泰勒展开式近似替换以方便计算。

xgb:

xgb也是提升树,与gbdt最重要的不同的是,

  • xgb对损失函数的梯度求解是用二阶泰勒展开式近似替换以方便计算,显然更接近真实负梯度,推导过程省略.
  • 在gbdt可以随机采样的基础上,xgb加入了列抽样,即特征抽样,复刻了随机森林的做法
  • xgb没有规定基分类器,传统gbdt指定以cart回归树为基分类器,这一点有点像adaboost,但是一般在使用xgb的时候还是用cart分类树。
  • xgb在gbdt基础上在损失函数中加入了正则化,可以进行预剪枝,进一步防止过拟合,而gbdt则主要是通过
  • 1、学习速率,
  • 2、随机采样(跟随机森林一样)
  • 3、cart树的后剪枝
  • xgb在工程上实现了并行化,注意这里并不是在迭代的过程中并行,而是在树分裂计算的时候并行,cart回归树在计算的时候通常是需要线性搜索所有的分裂节点,计算收益, 这个过程其实可以多线程并行,另外也可以通过直方图算法在降低内存使用的同事近似获取最优分裂点。
  • 与gbdt一样,都可以设置学习速率

总结一下:xgb相较于gbdt在工程效率和算法鲁棒性都有了提高。

lightgbm:

  • lightgbm相对于xgb基本上是树分裂过程速度优化,使用goss方法.
  • lightgbm可以通过传参的形式告知模型哪些是类别特征,lightgbm,xgb跟随机森林还有gbdt一样,对于类别特征需要自己one—hot编码,但是如果类别过多会导致切分增益很小,解决方案可以使用nn训练一个embedding向量出来,或者统计每个类别对应label的均值等。

一些细节:

1、回归树为什么用二叉树?每次分裂,非二叉树的计算量是二叉树的指数倍,遍历难度会比较大,不如二叉树来的简单,直接增加树的深度即可。

2、gbdt在解决回归问题上不是一个好的选择?前提是使用均方误差作为损失函数的话,gbdt会对异常值"过于"敏感,其实这是均方误差通病,回归问题可以改为huber损失或绝对损失,如果没有做异常值、离群值处理, 那么确实不是一个好的选择。

3、以上属于个人理解总结,如有错误或遗漏烦请指正,未完待续,持续更新

你可能感兴趣的:(机器学习)