zoukankan      html  css  js  c++  java
  • 04-02 AdaBoost算法


    更新、更全的《机器学习》的更新网站,更有python、go、数据结构与算法、爬虫、人工智能教学等着你:https://www.cnblogs.com/nickchen121/p/11686958.html

    AdaBoost算法

    集成学习中弱学习器之间有强依赖关系的,称之为Boosting系列算法,而AdaBoost则是Boosting系列算法中最著名的算法之一。

    AdaBoost算法强大之处在于既可以解决分类问题,又可以解决回归问题。

    一、AdaBoost算法学习目标

    1. AdaBoost算法目标函数优化
    2. 强分类器和强回归器流程
    3. AdaBoost算法优缺点

    二、AdaBoost算法详解

    2.1 Boosting算法回顾

    Boosting算法的流程是:首先训练处一个弱学习器,根据弱学习器的误差率更新训练样本的权重,然后基于调整权重后的训练集训练第二个弱学习器,直到弱学习器达到事先指定的数目T,停止算法。

    对于Boosting算法的流程,可以看到如果我们解决以下4个问题,既可以得到完整的Boosting算法

    1. 弱学习器的误差率
    2. 训练样本的权重(w)更新方法
    3. 更新样本权重的方法
    4. 结合策略

    2.2 AdaBoost算法

    上面讲到了Boosting算法需要解决的4个问题,因为AdaBoost算法隶属于Boosting算法,那么AdaBoost算法也需要解决这4个问题,其实也可以说成只要是Boosting系列的算法,都需要解决这4个问题。

    2.3 AdaBoost算法目标函数优化

    AdaBoost算法可以理解成模型是加法模型、目标函数是指数函数、学习算法是前向分步算法时的学习方法。其中加法模型可以理解成强学习器是由之前所有的弱学习器加权平均得到的;前向分步算法则可以理解成弱学习器训练数据的权重通过前一个弱学习器更新。

    AdaBoost算法的模型是加法模型,即强学习器的模型为

    [f(x) = sum_{k=1}^K alpha_kG_k(x) ]

    其中(K)(K)个弱学习器。

    AdaBoost算法的事前向分步算法,即经过(k-1)次迭代后,第(k-1)轮后强学习器为

    [egin{align} f_{k-1}(x) & = alpha_1G_1(x)+alpha_2G_2(x)+cdots+alpha_{k-1}G_{k-1}(x)\ & = f_{k-2}(x) + alpha_{k-1} G_{k-1}(x) end{align} ]

    经过(k)次迭代后,第(k)轮后强学习器为

    [f_k(x) = sum_{i=1}^k alpha_i G_i(x) = f_{k-1}(x) + alpha_kG_k(x) ]

    得到第(k)轮强学习器后,我们知道AdaBoost的目标函数是指数函数,因此我们的目标是使前向分步算法得到的(alpha_k)(G_k(x))使(f_k(x))在训练数据集上的指数损失最小,即AdaBoost的目标函数为

    [egin{align} (alpha_k,G_k(x)) & = underbrace{arg\,min}_{alpha,G}sum_{i=1}^m e^{-y_if_k(x)}\ & = underbrace{arg\,min}_{alpha,G}sum_{i=1}^m e^{[{-y_i(f_{k-1}(x_i)+alpha{G(x_i)}})]} \ & = underbrace{arg\,min}_{alpha,G}sum_{i=1}^m e^{[{-y_i(f_{k-1}(x_i))}]} e^{[{-y_i(alpha{G(x_i)}})]} end{align} ]

    由于(e^{[{-y_i(f_{k-1}(x_i))}]})的值不依赖(alpha,G),因此他与最小化无关,它仅仅依赖于随着每一轮迭代而变化的(f_{k-1}(x)),因此可以把(e^{[{-y_i(f_{k-1}(x_i))}]})看做(overline{w}_{ki}),即目标函数变为

    [(alpha_k,G_k(x)) = underbrace{arg\,min}_{alpha,G}sum_{i=1}^m overline{w}_{ki} e^{[{-y_i(alpha{G(x_i)}})]} ]

    现在的目标就是最优化AdaBoost的目标函数得到能使目标函数最小化的(alpha_k^*)(G_k^*(x))

    首先,对于任意的(alpha>0)(G_k^*(x))表示第(k)轮能够使得加训练数据分类误差率最小的基本分类器,分类误差率为

    [e_k = {frac{sum_{i=1}^moverline{w}_{ki}I(y_i eq{G_k(x_i)})}{sum_{i=1}^moverline{w}_{ki}}} = sum_{i=1}^moverline{w}_{ki}I(y_i eq{G_k(x_i)}) = sum_{{y_i} eq{G_k(x_i)}}overline{w}_{ki} ]

    (G_k^*(x))

    [G_k^*(x) = underbrace{arg\,min}_{G}sum_{i=1}^m overline{w}_{ki} I(y_i eq{G(x_i))} ]

    (G_k^*(x))即为学习器的(G_k(x)),把(G_k(x))代入目标函数对(alpha)求导并使导数为0,可以把上述的目标函数优化成

    [egin{align} (alpha_k,G_k(x)) & = underbrace{arg\,min}_{alpha,G}sum_{i=1}^m overline{w}_{ki} e^{[{-y_i(alpha{G(x_i)}})]} \ & = underbrace{arg\,min}_{alpha,G}sum_{y_i=G_k(x_i)}overline{w}_{ki}e^{-alpha}+sum_{y_i eq{G_k(x_i)}}overline{w}_{ki}e^{alpha} \ & = underbrace{arg\,min}_{alpha,G} (1-e_k)e^{-alpha} + e_ke^{alpha} end{align} ]

    既得最小的(alpha)

    [alpha_k^* = {frac{1}{2}}log{frac{1-e_k}{e_k}} ]

    最后看样本的权重更新,利用(f_k(x)=f_{k-1}(x)+alpha_kG_k(x))(overline{w}_{ki}=e^{[-y_if_{k-1}(x_i)]})可得

    [egin{align} overline{w}_{k+1,i} & = e^{[-y_if_{k}(x_i)]} \ & = e^{[-y_i(f_{k-1}(x_i))-y_i(alpha_kG_k(x_i))]} \ & = overline{w}_{ki}e^{[-y_ialpha_kG_k(x)]} end{align} ]

    (overline{w}_{k+1,i})即接下来要讲到的AdaBoost算法的训练数据权重的更新公式。

    三、AdaBoost算法流程

    AdaBoost算法既可以解决分类问题,又可以解决回归问题。对于分类问题,此处我们讲述的AdaBoost算法流程主要是针对二分类问题,二分类问题和多分类问题的区别主要在于弱分类器的系数上,本文会介绍AdaBoost SAMME算法如何计算弱分类器的系数;对于回归问题,由于AdaBoost用来解决回归问题的变种有很多,本文只对AdaBoost R2算法做一个介绍。

    3.1 输入

    (m)个样本(n)个特征的训练数据集(T={(x_1,y_1),(x_2,y_2),cdots,(x_m,y_m)})

    针对二分类问题,(y_iin{Y={1,-1}})

    3.2 输出

    最终强学习器(G(x))

    3.3 强分类器流程

    1. 初始化训练数据的权重

    [D_1 = (w_{11},cdots,w_{1i},cdots,w_{1m}),quad{w_{1i}={frac{1}{m}},quad{i=1,2,cdots,m}} ]

    1. 生成弱分类器

    [G_k(x),quad{k=1,2,cdots,K} ]

    1. 计算弱分类器(G_k(x))在训练集上的分类误差率为

    [egin{align} e_k & = sum_{i=1}^m P(G_k(x_i) eq{y_i}) \ & = sum_{i=1}^m w_{k_i} I(G_k(x_i) eq{y_i}) end{align} ]

    1. 计算(G_k(x))的权重系数

    [egin{align} & alpha_k={frac{1}{2}}log{frac{1-e_k}{e_k}}quad ext{二分类问题} \ & alpha_k={frac{1}{2}}log{frac{1-e_k}{e_k}}+log(R-1)quad ext{多分类问题} end{align} ]

    二分类问题的权重系数中,可以看出如果分类误差率(e_k)越大,则对应的弱分类器的权重系数(alpha_k)越小,即误差率小的弱分类器权重系数越大。

    多分类问题使用的是AdaBoost SAMME算法,其中(R)为类别数,如果(R=2),则该多元分类的权重系数将变成二元分类的权重系数。
    5. 更新训练数据的权重

    [egin{align} & D_{k+1} = (w_{k+1,1},cdots,w_{k+1,i},cdots,w_{k+1,m}) \ & w_{k+1,i} = {frac{w_{ki}}{Z_k}}e^{-alpha_ky_iG_k(x_i)},quad{i=1,2,cdots,m}\ end{align} ]

    其中(Z_k)是规范因子

    [Z_k=sum_{i=1}^mw_{ki}e^{-alpha_ky_iG_k(x_i)} ]

    (w_{k+1,i})的计算公式中可以看出,如果第(i)个样本分类错误,则(y_iG_k(x_i)<0),导致样本的权重在第(k+1)个弱分类器中变大,反之,则样本权重在第(k+1)个弱分类器中变小。
    6. 结合策略

    [egin{align} & f(x)=sum_{k=1}^Kalpha_kG_k(X)quad ext{线性模型} \ & G(x)=sign(sum_{k=1}^Kalpha_kG_k(X))quad ext{最终强分类器}G(x) end{align} ]

    3.4 强回归器流程

    1. 初始化训练数据的权重

    [D_1 = (w_{11},cdots,w_{1i},cdots,w_{1m}),quad{w_{1i}={frac{1}{m}},quad{i=1,2,cdots,m}} ]

    1. 生成弱分类器

    [G_k(x),quad{k=1,2,cdots,K} ]

    1. 计算弱回归器(G_k(x))在训练集上的最大误差

    [E_k = max|y_i-G_k(x_i)|,quad{i=1,2,cdots,m} ]

    1. 计算每个样本之间的相对误差

    [e_{ki}={frac{|y_i-G_k(x_i)|}{E_k}} ]

    此处也可以使用均方误差,即(e_{ki}={frac{(y_i-G_k(x_i))^2}{E_k^2}})
    5. 计算第(k)弱回归器的误差率和权重系数

    [egin{align} & e_k = sum_{i=1}^m w_{ki} e_{ki}quad ext{误差率} \ & alpha_k = {frac{e_k}{1-e_k}}quad ext{权重系数} end{align} ]

    1. 更新训练数据的权重

    [w_{k+1,i} = {frac{w_{ki}}{Z_k}alpha_k^{1-e_{ki}}} ]

    其中(Z_k)是规范因子

    [Z_k = sum_{i=1}^m w_{ki}alpha_k^{1-e_{ki}} ]

    1. 结合策略

    [G(x) = G_{k^*}(x) ]

    其中(G_{k^*}(x))是所有(ln{frac{1}{alpha_k}},quad{k=1,2,cdots,K})的中位数对应序号(k^*)对应的弱回归器

    四、AdaBoost算法优缺点

    4.1 优点

    1. 不容易过拟合
    2. 分类精准度高
    3. 由于弱分类器既可以是分类器又可以是回归器,使用灵活

    4.2 缺点

    1. 由于是对训练数据加权,有可能会赋予训练数据中的异常值较高的权重,影响模型的准确度

    五、小结

    AdaBoost算法并没有使用较深的数学知识,而是推导过程涉及较为复杂的逻辑。如果看完一遍还不是很理解,需要自己多多揣摩。

    AdaBoost算法目前是一个比较流行的Boosting算法,他的弱学习器既可以是回归器,又可以是分类器,这也是AdaBoost较为强大的一点。虽然理论上任何学习器都可以作为AdaBoost的弱学习器,但是AdaBoost算法用的较多的弱学习器一般还是决策树和神经网络。

    相信有了第一个集成算法AdaBoost的基础,对于接下来的第二个用的较为广泛的Boosting系列算法你也能很快熟悉他,即梯度提升树(gradient boosting decision tree,GBDT)

  • 相关阅读:
    Python实例 包机制
    Python实例 类和继承
    python实例 文件处理
    python实例 异常处理
    配置 Apache+php多端口多站点(转载)
    C#中Delegate和Event以及它们的区别(转载)
    LINQ to SQL更新数据库操作(转载)
    创业公司如何实施敏捷开发(转)
    利用ps橡皮擦工具快速抠图
    XP win2003系统 微软雅黑字体的使用方法
  • 原文地址:https://www.cnblogs.com/nickchen121/p/11686792.html
Copyright © 2011-2022 走看看