提升方法(boost)

提升方法(boost)

  提升方法(boost)的基本思路就是学习一堆弱学习器(精度低),组合成一个强学习器(精度高),即把弱学习方法"提升"为强学习方法。所以有两个问题贯彻提升方法整个过程,第一个问题是如何学习每个弱学习器,使得各个弱学习器可以优劣互补,例如可以改变弱学习器学习过程中的训练数据的权值分布或概率分布;第二个问题是如何组合成一个强学习器,例如简单的加法模型。

1. 前向分步算法

  先介绍前方分步算法(forward stagewise algorithm),前向分步算法是adaboost与提升树的基础。前向分步算法若按统计学习方法三要素看,属于三要素中的学习要素,但隐含的也限定了模型要素为加法模型(加权加法模型),并未对策略要素中的损失函数做出要求。
  前方分步算法比较简单,其主要思想是通过分步的方法,化简优化问题。直接看其算法流程如下:

1.1. 算法流程

输入:训练数据 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) … ( x N , y N ) } T=\{(x_{1},y_{1}),(x_{2},y_{2}) \dots (x_{N},y_{N})\} T={ (x1,y1),(x2,y2)(xN,yN)};弱学习器集合 { b 1 ( x ; γ ) , b 2 ( x ; γ ) … b M ( x ; γ ) } \{b_{1}(x;\gamma),b_{2}(x;\gamma) \dots b_{M}(x;\gamma)\} { b1(x;γ),b2(x;γ)bM(x;γ)} γ \gamma γ为相应弱学习器的模型参数;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))
输出:强学习器 F ( x ) F(x) F(x)
执行流程:

  1. 初始化 b 0 ( x ) = 0 b_{0}(x)=0 b0(x)=0
  2. 对每个弱学习器 b m ( x ) , m = 1 , 2 … M b_{m}(x),m=1,2 \dots M bm(x)m=1,2M,前m-1个弱学习器已经确定,按 a r g min ⁡ γ , β m ∑ i = 1 N L ( y i , ∑ j = 0 m − 1 β j b j ( x i ) + β m b m ( x i ; γ ) ) arg\min\limits_{\gamma,\beta_{m}} \sum\limits_{i=1}^{N}L(y_{i},\sum\limits_{j=0}^{m-1}\beta_{j}b_{j}(x_{i})+\beta_{m}b_{m}(x_{i};\gamma)) argγ,βmmini=1NL(yi,j=0m1βjbj(xi)+βmbm(xi;γ))学习 b m ( x ) b_{m}(x) bm(x)的模型参数 γ \gamma γ以及系数参数 β m \beta_{m} βm,可以看成 b m ( x ) b_{m}(x) bm(x)学习了前m-1个学习器与实际输出的误差。
  3. 得到加权模型 F ( x ) = ∑ j = 1 M β j b j ( x ) F(x)=\sum\limits_{j=1}^{M}\beta_{j}b_{j}(x) F(x)=j=1Mβjbj(x)

  这样,前向分步算法就把一次求解M个 β \beta β γ \gamma γ的问题( 2 M 2M 2M个变量的一个优化问题),化简为分步求解 M M M个优化问题中的 β \beta β γ \gamma γ(2个变量的优化问题)。


2. adaboost

  adaboost(adaptive boost,适应提升方法)是一种十分有代表性的提升方法,它能适应弱学习器各自的训练误差率。adaboost最初只适用于二分类问题,Schapire与Singer将它扩展到多分类问题。
  还以二分类问题为例,adaboost算法通过降低前一轮弱分类器学习过程中被正确分类的数据的权重,提高前一轮弱分类器学习过程中被误分类的数据权重,使得被误分类的数据在后一轮弱分类器的学习中被重点关注;adaboost通过加权求和的方法组合弱分类器,分类误差低的弱分类器权重高,分类误差高的弱分类器权重低。所以整个过程有两套权重数据的权重以及弱分类器的权重

2.1. 算法流程

输入:训练数据 T = { ( x 1 , y 1 ) , ( x 2 , y 2 ) … ( x N , y N ) } T=\{(x_{1},y_{1}),(x_{2},y_{2}) \dots (x_{N},y_{N})\} T={ (x1,y1),(x2,y2)(xN,yN)};弱分类器集合 { b 1 ( x ; γ ) , b 2 ( x ; γ ) … b M ( x ; γ ) } \{b_{1}(x;\gamma),b_{2}(x;\gamma) \dots b_{M}(x;\gamma)\} { b1(x;γ),b2(x;γ)bM(x;γ)} b m ( x ) b_{m}(x) bm(x)输出就是弱分类器的分类结果, γ \gamma γ为相应弱分类器的模型参数;损失函数 L ( y , f ( x ) ) L(y,f(x)) L(y,f(x))
输出:强分类器 F ( x ) F(x) F(x)
执行流程:

  1. 初始化数据权重 D = { ω 1 , ω 2 … ω N } = { 1 N , 1 N … 1 N } 1 ∗ N D=\{\omega_{1},\omega_{2}\dots \omega_{N}\}=\{\frac{1}{N},\frac{1}{N}\dots \frac{1}{N}\}_{1\ast N} D={ ω1,ω2ωN}={ N1,N1N1}1N
  2. 对每个弱分类器 b m ( x ) , m = 1 , 2 … M b_{m}(x),m=1,2 \dots M bm(x)m=1,2M,前m-1个弱分类器已经确定,使用带权值的数据训练基本分类器 b m ( x ) b_{m}(x) bm(x),计算其误差 e m = ∑ i = 1 N ω m i ( I ( y i    ≠ b m ( x i ; γ ) ) ) e_{m}=\sum\limits_{i=1}^{N} \omega_{mi}(I(y_{i}~~\ne b_{m}(x_{i};\gamma))) em=i=1Nωmi(I(yi  ̸=bm(xi;γ))) 其中 ω m i \omega_{mi} ωmi表示第 m m m个弱分类器对第 i i i条数据的权重, I ( ⋅ ) I(·) I()为指示函数;
  3. 计算 b m ( x ) b_{m}(x) bm(x)的弱分类器权重 α m \alpha_{m} αm如下,对数以2为底, α m = 1 2 log ⁡ 1 − e m e m \alpha_{m}=\frac{1}{2}\log{\frac{1-e_{m}}{e_{m}}} αm=21logem1em
  4. 更新数据权重参数如下 (1) ω m + 1 , i = ω m i Z m exp ⁡ ( − α m y i b m ( x i ) ) \omega_{m+1,i}=\frac{\omega_{mi}}{Z_{m}}\exp{(-\alpha_{m}y_{i}b_{m}(x_{i}))}\tag{1} ωm+1,i=Zmωmiexp(αmyibm(xi))(1) (2) Z m = ∑ i = 1 N ω m i exp ⁡ ( − α m y i b m ( x i ) ) Z_{m}=\sum\limits_{i=1}^{N}\omega_{mi}\exp{(-\alpha_{m}y_{i}b_{m}(x_{i}))}\tag{2} Zm=i=1Nωmiexp(αmyibm(xi))(2)
  5. m ≠ M m \neq M m̸=M,令 m = m + 1 m=m+1 m=m+1,递归回到步骤2;
  6. 最终得到强分类器 f ( x ) = ∑ i = 1 M α i b i ( x ) f(x)=\sum\limits_{i=1}^{M}\alpha_{i}b_{i}(x) f(x)=i=1Mαibi(x) F ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ i = 1 M α i b i ( x ) ) F(x)=sign(f(x))=sign(\sum\limits_{i=1}^{M}\alpha_{i}b_{i}(x)) F(x)=sign(f(x))=sign(i=1Mαibi(x))

  从步骤2的角度看,adaboost用的是0-1损失函数,但是从前向分步算法看,adaboost用的指数损失函数,后面会详细说明。
  在详细说一下步骤2中,"使用带权值的数据"的含义,最初看到这里一直不太清楚其含义,《统计学习方法》中给的adaboost的例子甚至可能会误导你,让你觉得步骤2的学习依据是 e m = a r g min ⁡ γ ∑ i = 1 N ω m i ( I ( y i ≠ b m ( x i ; γ ) ) ) e_{m}=arg\min\limits_{\gamma}\sum\limits_{i=1}^{N} \omega_{mi}(I(y_{i}\neq b_{m}(x_{i};\gamma))) em=argγmini=1Nωmi(I(yi̸=bm(xi;γ)))。其实当你详细看sklearn中的分类方法时,分类器的学习往往是包含权重的,在sklearn中样本权重sample_weight一般在类方法fit中传入,笔者看了一下CART分类树方法如何使用带权重的数据,这一过程在类criterion中实现,大体就是,如果sample_weight=None,则每条记录带的权重 w = 1 w=1 w=1,如果sample_weight ≠ \neq ̸=None,则每条记录的权重 w w w就是传入的权重,在计算基尼指数时,概率的极大似然估计其实是用的 w w w,即 w 的 和 w 的 和 \frac{w的和}{w的和} ww。下面给出了sklearn中,继承了criterion类的ClassificationCriterion类的init()类方法中关于权值的使用,sample_weight即是传入的样本权值列表。

        for p in range(start, end):
            i = samples[p]

            # w is originally set to be 1.0, meaning that if no sample weights
            # are given, the default weight of each sample is 1.0
            if sample_weight != NULL:
                w = sample_weight[i]

            # Count weighted class frequency for each target
            for k in range(self.n_outputs):
                c = <SIZE_t> y[i * y_stride + k]
                sum_total[k * self.sum_stride + c] += w

            self.weighted_n_node_samples += w

  在看一下 e m e_{m} em α m \alpha_{m} αm,不难看出 e m ∈ [ 0 , 1 ] e_{m} \in [0,1] em[0,1] α m ∈ [ − ∞ , ∞ ] \alpha_{m} \in [-\infty,\infty] αm[,] e m e_{m} em增大, α m \alpha_{m} αm会随之变小。当误差 e m e_{m} em较大,说明 b m ( x ) b_{m}(x) bm(x)不够好, α m \alpha_{m} αm

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值