zoukankan      html  css  js  c++  java
  • Ensemble Learning 之 Adaboost

    Boosting

    Boosting 是一种提升方法,将一系列弱学习器组合成为强学习器。基于样本权重的 Boosting 的工作流程是这样的,给定初始训练集构建一个基学习器,根据基学习器对训练样本的分布进行调整,使得先前学习器出错的样本收到更多关注,然后调整样本的权值进行下一个基学习器的学习,直至达到指定的迭代次数,然后将这一些列的基学习器加权组合来得到最后的强学习器。各个学习器的加权系数在算法迭代过程中会通过计算得出,除了基于样本权重的 Adaboost 之外,还有基于梯度的 Gradient Boosting ,这里先给出基于样本权重的 Adaboost 算法,然后细致分析 Adaboost 的推导。

    Adaboost

    对于二分类问题,Adaboost 算法是基于权重的 Boosting 算法,对于第 m 次迭代,样本用 i 来表示,其权重的形式需要满足: $sum_iw_{mi} = 1$ , 下面给出 Adaboost 算法:

    输入: 训练集 $D = left {(x_1y_1),(x_2,y_2),…,(x_N,y_N) ight }$ ,其中 $x_i in mathbb{R}^n$ , $y_i in left {+1,-1 ight }$;

    输出:强学习器 $G(x)$.

    1) 初始化权值 :$D_1 = {w_{11},w_{12},…,w_{1N}}$ ,其中 $w_{1i} = frac{1}{N}$ ,$i=1,2,…,N$

    2) for $m = 1,2,…,M$ do :

               3) 使用权值分布 $D_m$ 与相应的基学习器算法得到第 $m$ 个基学习器 $G_m(x)$;

               4) 计算 $G_m(x)$ 的误差: $e_m = P(G_m(x_i) e y_i) = sum_iw_{mi}I(G_m(x_i) e y_i)=sum_iw_{mi}$

               5) $G_m(x)$ 的权重系数:

                        $if:$ $e_m > 0.5$ :$a_m = 0$ 不满足准确性,舍弃此基学习器,依然按此学习器进行权值更新

                        $else:$ $a_m = frac{1}{2} ln frac{1-e_m}{e_m}$ ,可见错误率越高,损失越小。

               6) 更新权值分布,计算下一次迭代的权值 $D_{m+1} = {w_{m+1,1},w_{m+1,2},…,w_{m+1,N}}$ :[ w_{m+1,i} = frac{w_{mi}}{Z_m}exp(-a_m y_i G_m(x_i)) ]

                   这里 $Z_m$ 为规范化因子,$Z_m = sum_i w_{mi}exp(-a_my_iG_m(x_i))$ ,使得 $D_m$ 为一个分布。

               7) 分类器加权累加: $f(x) = sum_m a_mG_m(x)$

    8) end for

    Adaboost 算法最终得到的强学习器为 : $G(x) = sign(f(x)) = sign(sum_m a_mG_m(x))$

    对于 Adaboost 算法的几点说明:

    a)基学习器的参数 $a_m$ 代表了每个基学习器 $G_m(x)$ 在最终分类器 $G(x)$ 中的重要程度, 首先注意到对误差项的限制: $0< e_ m le 0.5$ , 所以可以得到 $a_m ge 0$ ,且 $a_m$ 随着 $e_m$ 的减小而增大,所以误差率越小的基学习器在最终得到的强学习器中所占的比重越大。

    b)将训练样本的权重更新公式写成如下形式:

    [w_{m+1,i} =  left { egin{aligned}
    frac{1}{Z_m} w_{mi}e^{-a_m} , G_m(x_i) = y_i \
    frac{1}{Z_m} w_{mi}e^{a_m}   ,  G_m(x_i) e y_i
    end{aligned} ight.]

    由于 $a_m ge 0$ ,所以很明显可以看出 ,分类错误与分类正确的样本下一次迭代时权值差距将被拉开为 $e^{2a_m}$ 倍,因此,分类错误的点在下一次迭代时将起到更重要的作用。

    c)M 个分类器加权表决时系数为 $a_m$ ,需要注意 $sum_m a_m e 1$,弱学习器加权函数 $f(x)$ 代表了最终学习结果的确信度,类似于线性回归后的 $sigmod$ 映射 。

    d) 至于算法第 $5$ 步中关于误差的判断,因为不满足准确性可能会带来负面效果,所以当误差率超过一半时,则会停止迭代,这样导致 Adaboost 执行不到预设的 M 轮,也就没有 M 个基学习器来做组合。这时可以抛弃当前误差较大的及学习器,按照该基学习器的结果重新调整样本权值,进而进入下一次迭代。下面的图很直观的给出了 Adaboost 的过程:

    111

    以上便是 Adaboost 算法的流程,图来自于 PRML P660,接下来看一下 Adaboost 算法的解释,这里用 Additive Model 迭代优化指数损失的角度来推导一下 Adaboost 算法。

    Additive Model

    Additive Model 这里我们翻译为加法模型,其形式如下:

    [f(x) = sum_m eta_mb(x; gamma_m)]

    这里 $b(x; gamma_m)$ 为基函数, $gamma_m$ 为基函数的参数,$eta_m$ 为基函数的权重系数,给定训练集 $D = left {(x_1y_1),(x_2,y_2),…,(x_N,y_N) ight }$ ,与损失函数 $L(y,f(x))$ ,加法模型的优化函数如下:

    [ argmin_{eta_m, gamma_m} sum^N_{i=1}L left [y_i,sum_m eta_mb(x_i; gamma_m) ight ]]

    如上边所示的加法模型,涉及到 M 个基函数的参数与 M 个权值的求解,是一个比较复杂的问题,如果从前向后每一步只学习一个基函数及其系数,便可以大大减小复杂度,这便是前向分步算法

    [ argmin_{eta_m, gamma_m} sum^N_{i=1}L left [y_i, eta_mb(x_i; gamma_m) ight ] ]

    按照迭代优化的思想,每次只优化一个基函数,给出前向分布算法:

    输入: 训练集 $D = left {(x_1y_1),(x_2,y_2),…,(x_N,y_N) ight }$ ,损失函数 $L(y,f(x))$ ,基函数集合$F =left {(b,gamma_m) ight }$ 其中 $m = 1,2,…,M$.

    输出:加法模型 $f(x)$.

    1) $f_0(x) = 0$

    2) $for$ $m = 1,2,…M$ $do$:

          $eta_m,gamma_m=argmin_{eta,gamma} sum_iL(y_i,f_{m-1}(x_i)+ eta b(x_i; gamma))$

          $f_m(x) = f_{m-1}(x) + eta_m b(a_i; gamma_m)$

    最终得到了想要的加法模型:

    [f(x) = f_M(x) = sum_meta_mb(x,gamma_m)]

    可以看到,前向分步实际为一个贪心算法,每次迭代只优化当前的模型。加法模型的形式与 Adaboost 加权组合 $f(x) = sum_ma_mG_m(x)$ 明显类似,其实当 Loss Function 为指数损失,基函数为基学习器时,两者是等价的,这里给出一个 Loss Function 的图:68509583_15指数损失函数形式是这样的: [L(y,f(x)) = exp(-yf(x))].

    接下来分析一下 Adaboost ,Adaboost 在第 $m$ 轮迭代中:

    [f_m(x) = f_{m-1}(x)+a_mG_m(x)]

    其中 $f_{m-1}(x)$ 为:

    [f_{m-1}(x) = f_{m-2}(x) +a_{m-1}(x)G_{m-1}(x)  = a_1G_1(x) +,…,+a_mG_m(x) ]

    根据 Additive Model ,要使得在当前迭代的损失最小才可得到本轮的参数 $a^*_m$ 与 $G^*_m(x)$:

    [a^*_m,G^*_m(x) = arg min_{a,G} sum_i exp[-y_i(f_{m-1}(x_i) +a_mG_m(x_i))]]

    如果改用 $w_{mi}$ 表示 $exp[-y_if_{m-1}(x_i)]$ (这里 $w_{mi}$ 除了缺少归一化因子外与 Adaboost 完全相同),便可把上式改写为:

    [a^*_m,G^*_m(x) = arg min_{a_m,G_m} sum_i w_{mi} exp[-y_ia_mG_m(x_i)]]

    所以只需求得满足上述条件的等式即可,对于任意的$ a_m > 0$ ,首先来看 $G^*_m(x)$ :

    [G^*_m(x) = argmin_{G_m}sum_i w_{mi}I(y_i e G_m(x_i))]

    这里 $G_m^*(x)$ 即为第 $m$ 轮使得加权训练数据误差率最小的基学习器,接下来极小化 $a_m$ 来得到 $a_m^*$:

    egin{aligned}
    &  sum_i w_{mi}exp[-y_ia_mG_m(x_i)] \
    &= sum_{y_i = G_m(x_i)}w_{mi}e^{-a_m} + sum_{y_i e G_m(x_i)}w_{mi}e^{a_m} \
    &=  sum_{y_i = G_m(x_i)}w_{mi}e^{-a_m}+ sum_{y_i e G_m(x_i)}w_{mi}e^{-a_m} + sum_{y_i e G_m(x_i)}w_{mi}e^{a_m} - sum_{y_i e G_m(x_i)}w_{mi}e^{-a_m}  \
    &=e^{-a_m} sum_iw_{mi} + (e^{a_m} -e^{-a_m})sum_{y_i e G_m(x_i)}w_{mi}
    end{aligned}

    上式对 $a_m$ 求导即可,使得倒数为 0 ,即可得到 $a_m^*$ .

    [a_m^* = frac{1}{2}log frac{1-e_m}{e_m} ]

    其中:

    [e_m = frac{sum_{y_i e G_m(x_i)}w_{mi}}{sum_iw_{mi} } = sum_iw_{mi} I(y_i e G_m(x_i))]
    由 $f_m = f_{m-1} + a_mG_m(x)$ 以及 $w_m =exp[-y_if_{m-1}(x_i)]$ 可以得到 $w_{m+1}$ 的更新公式:

    [w_{m+1,i} = w_{mi} exp[-y_i ,a_mG_m(x)]]

    唯一跟 AdaBoost 不同的是相差一个对因子,以及初始时 $f_0(x) =0$ 使得参数 $w_1 = left { 1,1,…,1 ight }$ ,这其实也是没有进行归一化而已,整个前向分步算法求解 Adaboost 算法的过程正是这样。

  • 相关阅读:
    第十二节:WebApi自动生成在线Api文档的两种方式
    第十一节:WebApi的版本管理的几种方式
    自学Python1.3-centos内python3并与python2共存
    自学Python1.2-环境的搭建:Pycharm及python安装详细教程
    自学Python1.1-简介
    Java通过ftp上传文件
    Java使用Spring初识
    Java中类似C#中Task.wait()的类CountDownLatch
    Java创建多线程和线程安全集合Vector
    未能加载文件或程序集“System.Data.SQLite”或它的某一个依赖项。试图加载格式不正确的程序。
  • 原文地址:https://www.cnblogs.com/ooon/p/5663975.html
Copyright © 2011-2022 走看看