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. Integral类型的跨平台使用

    fundamental integral types or extended integral types 我们先通过下图,来了解可以跨平台使用的整数类型: 之所以我们需要以上各种明确指定宽度的int ...

  2. node中的模块

    模块 编写稍大一点的程序时一般都会将代码模块化.在NodeJS中,一般将代码合理拆分到不同的JS文件中,每一个文件就是一个模块,而文件路径就是模块名. 在编写每个模块时,都有require.expor ...

  3. Java IO(三)

    File File类的常见方法: 1.创建. boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文 ...

  4. ARM 汇编指令

    ARM汇编程序特点: l         所有运算处理都是发生通用寄存器(一般是R0~R14)的之中.所有存储器空间(如C语言变量的本质就是一个存储器空间上的几个BYTE).的值的处理,都是要传送到通 ...

  5. shell脚本替换文件中字符

    1.将当前目录下包含jack串的文件中,jack字符串替换为tom sed -i "s/jack/tom/g" `grep "jack" -rl ./` 2.将 ...

  6. 常用搜索引擎的算分,你get了嘛?

    搜索引擎发展至今,已公布了多种算法.作为SEOER的你,还不懂,就out啦.懂了不会用,也是然并卵的一种行为.了解算法知识并不懂得如何把算法实践于SEO工作的你,还是处于学生思维,是时候该升级了.且听 ...

  7. C#文件输入输出流

    从输入流中读取数据(行读取字符串) using System; using System.Collections.Generic; using System.Linq; using System.Te ...

  8. 内存分析_.Net垃圾回收介绍

    垃圾回收 1.       .Net垃圾回收中涉及的名称 1.1.什么是代? 垃圾回收器为了提升性能使用了代的机制,共分为三代(Gen0.Gen1.Gen2).GC工作机制基于以下假设, 1)  对象 ...

  9. Win软件私家珍藏-常用软件工具使用总结

    原文:Win软件私家珍藏-常用软件工具使用总结 Windowns常用软件 看图 FastStoneImageViewer 免费软件,好用到爆!没广告!功能齐全!不光能看图,还能修图! Picasa3 ...

  10. CodeForces484A——Bits(贪心算法)

    Bits Let's denote as the number of bits set ('1' bits) in the binary representation of the non-negat ...