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. Linux下搭建Android NDK , Linux 驱动开发环境

    Eclispe Luna(4.4):http://www.eclipse.org/downloads/ CDT :http://www.eclipse.org/cdt/downloads.php AD ...

  2. ExtJs之 Ext.JSON

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  3. 转载——有感于三个50岁的美国程序员的生活状态与IT职业杂想

    明天就是国庆节了,今天也不想干活干的太累了!写一篇以前去美国出差的杂想,对比于美国50多岁的程序员和大多数50多岁国内父母的生活状态有感而发. 前几年正好有一个项目的机会出差去了一次美国,地点是美国中 ...

  4. __stdcall 与 __cdecl

    (1) _stdcall调用 _stdcall是Pascal程序的缺省调用方式,参数采用从右到左的压栈方式,被调函数自身在返回前清空堆栈. WIN32 Api都采用_stdcall调用方式,这样的宏定 ...

  5. SQL注入攻击

    SQL注入攻击是黑客对数据库进行攻击的常用手段之一.随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也越来越多.但是由于程序员的水平及经验也参差不齐,相当大一部分程序员在编写代码的时候, ...

  6. Install wxWidgets-3.0.2 on GNU/Linux Debian

    转载自 http://www.binarytides.com/install-wxwidgets-ubuntu/ wxWidgets wxWidgets is an application devel ...

  7. Spring REST for DELETE Request Method Not Supoorted

    http://stackoverflow.com/questions/22055251/sending-data-with-angularjs-http-delete-request I have a ...

  8. CyclicBarrier、CountDownLatch与Semaphore的小记

    CyclicBarrier: 适合的业务场景,比如 1).,现有一大任务,需要得到全年的统计数据的,这个工作量是巨大的,那么可以将其分割为12个月的子任务,各个子任务相互独立,当所有子任务完成了,则就 ...

  9. 544B. Sea and Islands

    题目链接 题意: n*n的里面全是S的方格中,填充L,若填充的L上下左右都没有相邻的L则是一个快,问题是能否形成k个块 n可以去奇数也可以去偶数 只要我们输出满足条件的一个结果就好了 对于从0 - n ...

  10. Delphi对于控件的SuperClassing(封装并扩展Button,使之变成TButton)

    写博客写了这么久,但是一直不知道应该怎么样写函数之间的调用关系和执行顺序,因为不停的跳来跳去的,但是写的时候却只能顺序写调用关系,直到今天发现这种写法很不错: TButton创建窗口是在CreateW ...