秋招材料整理——集成学习

目录

    • 一、概念
    • 二、boosting和bagging 区别
    • 三、随机森林
    • 四、boosting(串联)
    • 五、GBDT
    • 六、adaboost
    • 七、 GBDT vs. adaboost 区别
    • 八、xgboost
    • 九、GBDT vs. xgboost
    • 十、stacking

一、概念

  • 集成方式主要有3种:boostingbaggingstacking
  • 集成学习:将多个弱学习器结合起来组成一个强学习器
    • 个体学习器一般选择:决策树,神经网络(集成时可以是同类,也可以是不同类)
    • 什么时候集成效果好于单个学习器?
      “好而不同”,每个都不是特别差,且有一定的多样性
      证明:假设错误率相互独立,整体学习器的错误率为(个体学习器的错误率为 ε):

P ( H ( x ) ≠ f ( x ) ) P(H(x)\ne f(x)) P(H(x)̸=f(x))

= ∑ k = 0 ⌊ T / 2 ⌋ ( k T ) ( 1 − ϵ ) k ϵ T − k =\sum_{k=0}^{\lfloor T/2\rfloor}(_k^T)(1-\epsilon)^k\epsilon^{T-k} =k=0T/2(kT)(1ϵ)kϵTk

≤ e x p ( − 1 2 T ( 1 − 2 ϵ ) 2 ) \le exp(-\frac{1}{2}T(1-2\epsilon)^2) exp(21T(12ϵ)2)

学习器数目 T 逐渐增大,整个学习器的错误率将指数级下降,甚至最终趋向于零

二、boosting和bagging 区别

以随机森林和adaboost为例:

  • 个体学习器间依赖关系上:
    Bagging,随机森林:个体之间不存在强依赖关系,各个预测函数可并行生成。
    Boosting:个体学习器间存在强依赖,必须串行生成。后一个模型参数需要前一轮的结果.
  • 样本选择上:
    Bagging:训练集是随机有放回选取的,各轮训练集之间是独立的.
    Boosting:训练集不变,只是样例的权重发生变化.权值是根据上一轮的分类结果进行调整.
  • 样例权重:
    Bagging:均匀取样,每个样例权重相等
    Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大.
  • 预测函数:
    Bagging:所有预测函数的权重相等.
    Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重

三、随机森林

(代表集成学习技术水平的方法)(并联,投票)

  • 样本产生:随机有放回抽样(第一个随机)
  • 属性选择:基学习器是决策树,训练决策树时引入随机属性选择(第二个随机)(选划分属性时,先从属性集中随机选择一个包含k(推荐 l o g 2 d log_2d log2d)个属性的子集,然后再从子集中选使Gini值最小的分割点作为最优属性用于划分)
  • 效率常优于Bagging,不易过拟合;噪音比较大时会过拟合

四、boosting(串联)

  • 根据初始训练数据训练出第一个基学习器;
    根据基学习器的表现调整样本,更多关注之前学习器做错的样本,训练下一个基学习器;
    重复T 次,将 T 个学习器加权结合。
  • 优点:表达能力强,不需要做复杂的特征工程和特征变换
  • 缺点:串联,不好并行化,计算复杂度高,同时不太适合高维

五、GBDT

  • GB中单个学习器为决策树(回归树:虽然它常用于预测,而不是分类)
  • GBDT有两种,一种是残差学习,一种是负梯度代替残差,为啥用负梯度近似残差?
    GBDT每次迭代是对之前模型损失函数的梯度下降方向(即伪残差)进行学习,计算出使下一步损失函数取值最小的伪残差,从而得出下一步模型,残差只是在loss用最小二乘时的一个特例,对 ( x − y ) 2 (x-y)^2 (xy)2求梯度刚好就是 2 ( x − y ) 2(x-y) 2(xy),换成其他loss就不对了,所以,残差学习只是一个特例,负梯度才是通用的

六、adaboost

  • =指数损失( e − f ( x ) H ( x ) e^{-f(x)H(x)} ef(x)H(x))+boosting(加法模型)+的前向分步算法
    (指数损失达到最小时分类错误率也将最小化)
  • 预测模型是基学习器的加权平均值: H ( x ) = ∑ t = 1 T α t h t ( x ) H(x)=\sum_{t=1}^T\alpha_th_t(x) H(x)=t=1Tαtht(x)
  • 每一次迭代的弱学习器怎么学?
    改变训练数据的权值(概率分布):提高被错误分类的样本权值,降低正确的 D m = D m − 1 1 − e m e m D_m=D_{m-1}\frac{1-e_m}{e_m} Dm=Dm1em1em( e m e_m em被误分类样本的权值之和)
    选取让误差率最低的阈值来设计基本分类器
  • 弱分类器权值怎么确定?
    加大分类误差率小的弱分类器权值,减小大的 α m = 1 2 l o g 1 − e m e m \alpha_m=\frac{1}{2}log\frac{1-e_m}{e_m} αm=21logem1em(底数是 e , e m e,e_m e,em为误差率)
  • 优点:不会很容易出现过拟合现象

七、 GBDT vs. adaboost 区别

  • 名字不同是因为损失函数不同,也就是定位模型不足的方法不同
    GBDT是通过梯度定位的,而adaboost是通过提高被错误分类的样本权值来定位的
  • AdaBoost对异常点(outlier)比较敏感,而GBDT通过引入bagging思想、加入正则项等方法能够有效地抵御训练数据中的噪音,具有更好的健壮性。

八、xgboost

参考:推导

1、 (最小化)目标函数=损失函数(可自定义,只需满足二次可微)+ 正则化项(与叶子节点的数量和值有关)

  • 目标函数: I j I_j Ij为所有被划分到叶子节点j的训练样本的集合
    o b j ( t ) ≈ ∑ i = 1 n [ g i w q ( x i ) + 1 2 h i w q ( x i ) 2 ] + γ T + 1 2 λ ∑ j = 1 T w j 2 obj^{(t)}\approx \sum_{i=1}^n[g_iw_{q(x_i)}+\frac{1}{2}h_iw_{q(x_i)}^2]+\gamma T+\frac{1}{2}\lambda\sum_{j=1}^Tw_j^2 obj(t)i=1n[giwq(xi)+21hiwq(xi)2]+γT+21λj=1Twj2

= ∑ j = 1 T [ ( ∑ i ∈ I j g i ) w j + 1 2 ( ∑ i ∈ I j h i + λ ) w j 2 ] + γ T =\sum_{j=1}^T[(\sum_{i\in I_j}g_i)w_j+\frac{1}{2}(\sum_{i\in I_j}h_i+\lambda)w_j^2]+\gamma T =j=1T[(iIjgi)wj+21(iIjhi+λ)wj2]+γT

= ∑ j = 1 T [ G j w j + 1 2 ( H j + λ ) w j 2 ] + γ T =\sum_{j=1}^T[G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2]+\gamma T =j=1T[Gjwj+21(Hj+λ)wj2]+γT

  • 损失函数:除了一阶导还用二阶导,对每一次的损失函数做二阶泰勒展开,展开之后删去常数项,会发现目标函数与损失函数的形式无关,所以可以自定义,只需满足二次可微
    g i g_i gi是损失函数一阶导, h i h_i hi是二阶, f t ( x i ) f_t(x_i) ft(xi)第t棵树第i个叶子节点的值)
    ∑ i = 1 n [ g i f t ( x i ) + 1 2 h i f t 2 ( x i ) ] + Ω ( f t ) \sum_{i=1}^n[g_if_t(x_i)+\frac{1}{2}h_if_t^2(x_i)]+\Omega(f_t) i=1n[gift(xi)+21hift2(xi)]+Ω(ft)
  • 正则化作用:
    • 训练数据可能有误,未必涵盖了所有种类的样本
    • 控制模型复杂度,对参数施加一定的控制,防止参数走向极端,防止过拟合
    • γ \gamma γ:人为加入的阈值,使xgboost在优化目标函数的同时做了预剪枝
      λ \lambda λ:L2的系数,相当于对leaf score做了平滑,防止过拟合
      Ω ( f ) = γ T + 1 2 λ ∑ j = 1 T w j 2 \Omega(f)=\gamma T+\frac{1}{2}\lambda \sum_{j=1}^Tw_j^2 Ω(f)=γT+21λj=1Twj2

2、模型:一堆CART树
y i ^ = ∑ k = 1 K f k ( x i ) , f k ∈ F \hat{y_i}=\sum_{k=1}^Kf_k(x_i),f_k\in \mathcal{F} yi^=k=1Kfk(xi),fkF

(为什么用CART树而不是普通的决策树:CART树的叶子节点对应的值是一个实际的分数,而非一个确定的类别,有利于实现高效的优化算法)
3、如何找树的结构:挨层判断切分点。对每个确定切分点,衡量切分好坏的标准如下:
G a i n = 1 2 [ G L 2 H L + λ + G R 2 H R + λ − ( G L + G R ) 2 H L + H R + λ ] − γ Gain=\frac{1}{2}[\frac{G_L^2}{H_L+\lambda}+\frac{G_R^2}{H_R+\lambda}-\frac{(G_L+G_R)^2}{H_L+H_R+\lambda}]- \gamma Gain=21[HL+λGL2+HR+λGR2HL+HR+λ(GL+GR)2]γ

这个 G a i n Gain Gain实际上就是单节点的 o b j ∗ obj^* obj减去切分后的两个节点的树 o b j ∗ obj^* obj,如果 G a i n > 0 Gain>0 Gain>0且越大,表示切分后 o b j ∗ obj^* obj越小于单节点的 o b j ∗ obj^* obj,越值得切分;左半部分< γ \gamma γ, G a i n < 0 Gain<0 Gain<0,obj变大。 γ \gamma γ越大,对切分后 o b j obj obj下降幅度要求越严, γ \gamma γ限制了树的复杂度
4、求参:分步优化目标函数,在第t步时,添加一棵最优的CART树(最优:在现有的t-1棵树的基础上,使目标函数最小的那棵CART树)
5、各个叶子节点的最佳值以及此时目标函数的值
w j ∗ = − G j H j + λ w_j^*=-\frac{G_j}{H_j+\lambda} wj=Hj+λGj

o b j ∗ = − 1 2 ∑ j = 1 T G j 2 H j + λ + γ T obj^*=-\frac{1}{2}\sum_{j=1}^T\frac{G_j^2}{H_j+\lambda}+\gamma T obj=21j=1THj+λGj2+γT

6、结果:将每棵树的预测值加到一起作为最终的预测值
7、停止

  • 当引入的分裂带来的增益小于一个阀值的时候,我们可以剪掉这个分裂,像预剪枝、
  • 当树达到最大深度时
  • 当样本权重和小于设定阈值时则停止建树,大意就是一个叶子节点样本太少了
  • 树的最大数量

九、GBDT vs. xgboost

  • GBDT 中通过对损失函数求一阶导计算出伪残差来进行学习,xgboost 不仅使用到了一阶导,还使用了二阶导
  • xgboost在目标函数中显示的加上了正则化项,从Bias-variance角度来讲,正则项降低了模型的variance,使学习出来的模型更加简单,防止过拟合
  • Xgboost 是 GB的高效实现,它的基学习器除了可以是CART(gbtree)也可以是线性分类器(gblinear)(通过特征的线性组合分类)
  • CART 回归树中寻找最佳分割点是根据Gini系数,越小越好,xgboost 寻找分割点的标准是最大化Gain
  • Xgboost利用了特征的稀疏性,划分结点时,不统计该特征为缺失的样本,只遍历非缺失的样本,也可以为缺失值或者指定值指定分支的默认方向
  • Xgboost计算速度快,因为可以并行化

十、stacking

参考

先用初始训练数据学习出若干个基学习器,再将这几个学习器的预测结果作为新的训练集,来学习一个新的学习器。

你可能感兴趣的:(秋招)