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. 程序员必须知道的git托管平台

    http://www.open-open.com/lib/view/open1420704561390.html

  2. ubuntu安装hive

    1.安装mysql,可参考下面链接 http://www.cnblogs.com/liuchangchun/p/4099003.html 2.安装hive,之前,先在mysql上创建一个hive,数据 ...

  3. ***Jquery下Ajax与PHP数据交换

    一.前台传递字符串变量,后台返回字符串变量(非json格式) Javascript代码: 这里,为了解决Ajax数据传递出现的汉字乱码,在字符串传递之前,使用javascript函数escape()对 ...

  4. [RM HA 2] Hadoop 2.0 ResourceManager HA原理

    继上篇文章验证Cloudera RM HA功能后,现在开始分析Cloudera RM HA的原理. 设计目标 主要目的是为了解决两种问题 计划外的机器挂掉 计划内的如软件和硬件升级等. 架构 流程:两 ...

  5. C语言学习资料(转载)

    ◆经典C源程序100例:http://post.baidu.com/f?kz=8618367 ◆时钟的驻留程序:http://post.baidu.com/f?kz=10822377 ◆数据结构暨若干 ...

  6. android listview 加载图片错乱(错位)

       写道 今天晚上一个朋友介绍我看了一篇文章,也是解决android中listview在加载图片错位的问题,看了之后,感觉写的很好,自己也遇到这个问题,但是又不知道从何下手,看到这篇文章后,我的问题 ...

  7. 【转】terminal 快捷键

    转自:http://www.jb51.net/os/Ubuntu/141723.html 1.gnome-terminal快捷键设置方法: 系统 —> 首选项 ->键盘快捷键 -> ...

  8. vim不保存退出

    对于刚开始使用vi/vim文本编辑器的新手来说,如何在不保存更改而退出vi/vim 文本编辑器呢? 当你使用linux vi/vim 文本编辑器对linux下某个配置文件做编辑操作,当你更改完之后,可 ...

  9. EL表达式取整数或者取固定小数位数的简单实现

    EL表达式取整数或者取固定小数位数的简单实现 例如${8/7} ,${6/7} ,${12/7 } 在页面的显示结果分别为: 1.1428571428571428 0.8571428571428571 ...

  10. iOS 网络处理注意点

    原文链接:http://www.jianshu.com/p/a086c33566be 一. AFN 使用注意点 1. block循环引用 bug 解决 2.请求管理者 1.请求管理者存储到内存 请求管 ...