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) \right \}$ ,其中 $x_i \in \mathbb{R}^n$ , $y_i \in \left \{+1,-1 \right \}$;

输出:强学习器 $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) \ne y_i) = \sum_iw_{mi}I(G_m(x_i) \ne 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 \{ \begin{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) \ne y_i
\end{aligned} \right.\]

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

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

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

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

Additive Model

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

\[f(x) = \sum_m \beta_mb(x; \gamma_m)\]

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

\[ arg\min_{\beta_m, \gamma_m} \sum^N_{i=1}L \left [y_i,\sum_m \beta_mb(x_i; \gamma_m) \right ]\]

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

\[ arg\min_{\beta_m, \gamma_m} \sum^N_{i=1}L \left [y_i, \beta_mb(x_i; \gamma_m) \right ] \]

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

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

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

1) $f_0(x) = 0$

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

$\beta_m,\gamma_m=arg\min_{\beta,\gamma} \sum_iL(y_i,f_{m-1}(x_i)+ \beta b(x_i; \gamma))$

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

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

\[f(x) = f_M(x) = \sum_m\beta_mb(x,\gamma_m)\]

可以看到,前向分步实际为一个贪心算法,每次迭代只优化当前的模型。加法模型的形式与 Adaboost 加权组合 $f(x) = \sum_ma_mG_m(x)$ 明显类似,其实当 Loss Function 为指数损失,基函数为基学习器时,两者是等价的,这里给出一个 Loss Function 的图:指数损失函数形式是这样的: \[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) = arg\min_{G_m}\sum_i w_{mi}I(y_i \ne G_m(x_i))\]

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

\begin{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 \ne G_m(x_i)}w_{mi}e^{a_m} \\
&=  \sum_{y_i = G_m(x_i)}w_{mi}e^{-a_m}+ \sum_{y_i \ne G_m(x_i)}w_{mi}e^{-a_m} + \sum_{y_i \ne G_m(x_i)}w_{mi}e^{a_m} - \sum_{y_i \ne G_m(x_i)}w_{mi}e^{-a_m}  \\
&=e^{-a_m} \sum_iw_{mi} + (e^{a_m} -e^{-a_m})\sum_{y_i \ne 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 \ne G_m(x_i)}w_{mi}}{\sum_iw_{mi} } = \sum_iw_{mi} I(y_i \ne 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\right \}$ ,这其实也是没有进行归一化而已,整个前向分步算法求解 Adaboost 算法的过程正是这样。

Ensemble Learning 之 Adaboost的更多相关文章

  1. 4. 集成学习(Ensemble Learning)Adaboost

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  2. 7. 集成学习(Ensemble Learning)Stacking

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  3. 6. 集成学习(Ensemble Learning)算法比较

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  4. 5. 集成学习(Ensemble Learning)GBDT

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  5. 3. 集成学习(Ensemble Learning)随机森林(Random Forest)

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  6. 2. 集成学习(Ensemble Learning)Bagging

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  7. 1. 集成学习(Ensemble Learning)原理

    1. 集成学习(Ensemble Learning)原理 2. 集成学习(Ensemble Learning)Bagging 3. 集成学习(Ensemble Learning)随机森林(Random ...

  8. 7. ensemble learning & AdaBoost

    1. ensemble learning 集成学习 集成学习是通过构建并结合多个学习器来完成学习任务,如下图: 集成学习通过将多个学习学习器进行结合,常可以获得比单一学习器更优秀的泛化性能 从理论上来 ...

  9. 6. Ensemble learning & AdaBoost

    1. ensemble learning 集成学习 集成学习是通过构建并结合多个学习器来完成学习任务,如下图: 集成学习通过将多个学习学习器进行结合,常可以获得比单一学习器更优秀的泛化性能 从理论上来 ...

随机推荐

  1. 快速排序 Quick Sort

    自己写的代码,记录一下.分别记录了两种partition的方法. public class QuickSort { public static void quickSort(int[] nums, i ...

  2. CamShift算法

    拟采用的方法,CamShift算法,即"Continuously Apative Mean-Shift"算法,是一种运动跟踪算法.它主要通过视频图像中运动物体的颜色信息来达到跟踪的 ...

  3. webmatrix

    http://www.microsoft.com/web/webmatrix/ WebMatrix is a free, lightweight, cloud-connected web develo ...

  4. shape和selector的结合使用

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...

  5. python FTP上传和下载文件

    1. 连接FTP server import ftplib ftp = ftplib.FTP(ftpserver, user, passwd) 等同于 import ftplib ftp = ftpl ...

  6. ffmpeg转码时对编码率和固定码率的处理

    http://www.rosoo.net/a/201107/14663.html 一般fps在代码里这样表示 Fps = den/num 如果den = 15,num=1,则fps = 15. 如果帧 ...

  7. Centos环境下部署游戏服务器-常用命令

         图1     在Linux的世界,如果你不玩命令,那你见了同行都不好意思和人家打招呼.同时服务器正常状况下放在远端,一般都是开ssh登录服务器,相信远程桌面的人很少见吧.这篇文章说说Linu ...

  8. lines---hdu5124(离散化+数组模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5124 就是有n条在x轴的线段,给你线段的左右端点,每条线段都会覆盖点,求出最多被覆盖多少次: #inc ...

  9. JVM垃圾回收机制总结(4) :新一代的垃圾回收算法

    垃圾回收的瓶颈 传统分代垃圾回收方式,已经在一定程度上把垃圾回收给应用带来的负担降到了最小,把应用的吞吐量推到了一个极限.但是他无法解决的一个问题,就是Full GC所带来的应用暂停.在一些对实时性要 ...

  10. 下载安装和OpenCV匹配的Android开发环境

    ok blog Android与OpenCV——重新下载安装和OpenCV匹配的Android开发环境 !!OpenCV4Android开发之旅(一)----OpenCV2.4简介及 app通过Jav ...