zoukankan      html  css  js  c++  java
  • 4. 集成学习(Ensemble Learning)Adaboost

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

    2. 集成学习(Ensemble Learning)Bagging

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

    4. 集成学习(Ensemble Learning)Adaboost

    5. 集成学习(Ensemble Learning)GBDT

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

    7. 集成学习(Ensemble Learning)Stacking

    1. 前言

    前面我们已经详细的介绍了什么是集成学习,集成学习的种类有哪些,并且也介绍了集成学习里面相对比较简单的Bagging。今天我们开始涉及到集成学习里面比较难理解的Boosting中的Adaboost。

    2. Boosting原理

    Boosting算法的工作机制:

    1. 首先从训练集用初始权重训练出一个弱学习器1.
    2. 根据学习器1的学习误差率来更新训练样本的权重,使得之前弱学习器1学习误差率高的训练样本点的权重变高,使得这些误差率高的点在后面的弱学习器2中得到更多的重视。
    3. 然后基于调整权重后的训练集来训练弱学习器2。
    4. 如此重复进行,直到弱学习器数达到事先指定的数目(T)
    5. 最终将这(T)个弱学习器通过集合策略进行整合,得到最终的强学习器。

    image

    这里有几个相关概念:

    1. 学习误差率(e)
    2. 学习器权重(alpha)
    3. 更新下一次训练样本的权重(D)
    4. 最后如何结合所有的弱学习器

    我们通过详细介绍Adaboost的分类算法,一步一步的讲解上面提到的几个过程

    3. Adaboost

    我们的训练样本是

    [T={(x_1,y_1),(x_2,y_2), ...(x_m,y_m)} ]

    训练集的第(k)个弱学习器的输出权重为:

    [D(k) = (w_{k1}, w_{k2}, ...w_{km}) ;;; w_{1i}=frac{1}{m};;; i =1,2...m ]

    • 首先我们看下第(k)个弱学习器的错误率(e_k),因为我们是二分类问题,所以我们的的错误率是所有误分类的样本的权重和如下,其中求和的是误分类的样本的集合。

    [e_k = sumlimits_{i=1}^mw_{ki} ]

    • 得到了(e_k),我们就能去计算弱学习器在最后结合的时候的权重系数(alpha_k),根据下面的公式,我们发现,当(e_k)越大,则(alpha_k)越小。这也符合大家的直观感受。

    [alpha_k = frac{1}{2}logfrac{1-e_k}{e_k} ]

    • 更新下一个弱学习器的权重(D(k+1) = (w_{(k+1)1}, w_{(k+1)2}, ...w_{(k+1)m}))

    [w_{k+1,i} = frac{w_{ki}}{Z_K}exp(-alpha_ky_iG_k(x_i)) ]

    [Z_k = sumlimits_{i=1}^{m}w_{ki}exp(-alpha_ky_iG_k(x_i)) ]

    上面公式中(G_k())是第(k)个弱学习器,从(w_{(k+1)i})计算公式可以看出,如果第(i)个样本分类错误,则(y_iG_k(x_i)<0),导致样本的权重在第(k+1)个弱分类器中增大,如果分类正确,则权重在第(k+1)个弱分类器中减少.具体为什么采用样本权重更新公式,我们在讲Adaboost的损失函数优化时再讲。

    • 还剩下一个如何组合所有弱学习器的问题

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

    4. Adaboost分类损失函数

    首先我们定义一个Adaboost的损失函数为:

    [arg;minsumlimits_{i=1}^{m}exp(-y_if_{k}(x)) ]

    其中

    [f_{k-1}(x) = sumlimits_{i=1}^{k-1}alpha_iG_{i}(x) ]

    [f_{k}(x) = f_{k-1}(x) + alpha_kG_k(x) ]

    (f_k(x))带入损失函数得到

    [arg;minsumlimits_{i=1}^{m}exp[(-y_i) (f_{k-1}(x) + alpha_k G_k(x))] ]

    我们令(w_{ki} = exp(-y_if_{k-1}(x))), 它的值不依赖于(alpha, G),因此与最小化无关,仅仅依赖于(f_{k-1}(x)),随着每一轮迭代而改变。

    将这个式子带入损失函数,损失函数转化为

    [arg;minsumlimits_{i=1}^{m}w_{ki}exp[-y_ialpha G(x)] ]

    又因为我们可以计算

    [G_k(x) = arg;minsum_{i=1}^mw_{ki} ]

    (G_k(x))带入损失函数,并对(alpha)求导,使其等于0,则就得到了

    [alpha_k = frac{1}{2}logfrac{1-e_k}{e_k} ]

    最后看样本权重的更新。利用(f_{k}(x) = f_{k-1}(x) + alpha_kG_k(x))(w_{ki} = exp(-y_if_{k-1}(x))),即可得:

    [w_{k+1,i} = w_{ki}exp[-y_ialpha_kG_k(x)] ]

    5. Adaboost算法的正则化

    为了防止Adaboost过拟合,我们通常也会加入正则化项,这个正则化项我们通常称为步长(learning rate)。定义为( u),对于前面的弱学习器的迭代

    [f_{k}(x) = f_{k-1}(x) + alpha_kG_k(x) ]

    如果我们加上了正则化项,则有

    [f_{k}(x) = f_{k-1}(x) + ualpha_kG_k(x) ]

    ( u)的取值范围为(0 < u leq 1)。对于同样的训练集学习效果,较小的( u)意味着我们需要更多的弱学习器的迭代次数。通常我们用步长和迭代最大次数一起来决定算法的拟合效果。

    6. 总结

    到这里Adaboost就写完了,前面有一个没有提到,就是弱学习器的类型。理论上任何学习器都可以用于Adaboost.但一般来说,使用最广泛的Adaboost弱学习器是决策树和神经网络。对于决策树,Adaboost分类用了CART分类树,而Adaboost回归用了CART回归树。

    这里对Adaboost算法的优缺点做一个总结。
    Adaboost的主要优点有:

    1. Adaboost作为分类器时,分类精度很高
    2. 在Adaboost的框架下,可以使用各种回归分类模型来构建弱学习器,非常灵活。
    3. 作为简单的二元分类器时,构造简单,结果可理解。
    4. 不容易发生过拟合

    Adaboost的主要缺点有:

    1. 对异常样本敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
  • 相关阅读:
    如何创建一个WebService
    javascript调用WebService Hello World
    音频处理介绍(Linux手机)
    Android开机画面大整容
    android 源代码结构
    移植 android, touch screen 不能正常工作的问题
    为 Linux 应用程序编写 DLL
    6410 声卡wm9713 驱动分析
    android bootload源码网址
    fprintf 控制台代码,可以控制光标等,控制台显示时间源码
  • 原文地址:https://www.cnblogs.com/huangyc/p/9969958.html
Copyright © 2011-2022 走看看