zoukankan      html  css  js  c++  java
  • 学习笔记——提升方法

    提升(boosting)方法是一种常用的统计学习方法,应用广泛且有效。在分类问题中,它通过改变训练样本的权重,学习多个分类器,并将这些分类器进行线性组合,提高分类性能。

    提升方法AdaBoost算法


    • 为什么叫”提升“方法

      在概率近似正确(PAC)学习框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,称这个概念是强可学习的,若正确率仅比随机猜想略好,称这个概念是弱可学习的。有趣的是有人证明了强可学习与弱可学习是等价的,那么,如果发现了弱学习算法(比较容易找到),就有可能将它提升为强学习算法。最具代表性的是AdaBoost算法。

    大多数的提升方法都是改变训练数据的概率分布(训练数据的权值分布),针对不同的训练数据分布调用弱学习算法学习一系列弱分类器。这样,关键就在于如何改变训练数据的权值,以及如何组合这些弱分类器。AdaBoost的做法是提高那些前一轮弱分类器错误分类样本的权值。

    AdaBoost算法

    • 输入:训练数据集(T = {(x_1,y_1), (x_2, y_2), ..., (x_N,y_N) }),其中(x_i in mathcal{X} subseteq R^n)(y_i in mathcal{Y} = {-1, +1});弱学习算法。
    • 输出:最终分类器(G(x))
    1. 初始化训练数据的权值分布$$D_1 = (w_{11}, ...,w_{1i},...,w_{1N}), w_{1i} = frac{1}{N}, i = 1,2,...,N$$

    2. (m = 1,2,...,M)

      a. 使用具有权值分布(D_m)的训练数据集学习,得到基本分类器$$G_m(x): mathcal{X} ightarrow {-1, +1}$$
      b. 计算(G_m(x))在训练数据集上的分类误差率$$e_m = P(G_m(x_i) eq y_i)=sum_{i =1}^{N} w_{mi} I(G_m(x_i) eq y_i)$$
      c. 计算(G_x(x))的系数$$alpha_m = frac{1}{2} log frac{1 - e_m}{e_m}$$
      d. 更新训练数据集的权值分布$$D_{m+1} = (w_{m+1,1}, ... ,w_{m+1,i}, ..., w_{m+1,N})$$ $$w_{m+1,i} = frac{w_{mi}}{Z_m} exp(-alpha_m y_i G_m(x_i)), i = 1,2,...,N$$,这里,(Z_m)是规范因子$$Z_m = sum_{i = 1}^N w_{wi} exp (-alpha_m y_i G_m(x_i))$$它使(D_m)成为一个概率分布。(简单点就是正确的除以(alpha),错误的乘以alpha,规范因子不要也问题不大吧)

    3. 构建基本分类器的线性组合$$f(x) = sum_{m = 1}^M alpha_m G_m (x)$$得到最终的分类器$$G(x) = sign(f(x)) = sign(sum_{m = 1}^M alpha_m G_m(x))$$

    AdaBoost的训练误差分析


    • AdaBoost算法最终分类器的训练误差界为:$$frac{1}{N} sum_{i = 1}^N I(G(x_i) eq y_i) leq frac{1}{N} sum_i exp (-y_i f(x_i)) = prod_m Z_m$$

      在每一轮选取适当的(G_m)使得(Z_m)最小,从而使训练误差下降最快。

    • 二分类问题AdaBoost的训练误差界:$$prod_{m = 1}^M Z_m = prod_{m = 1} ^M [2sqrt{e_m(1-e_m)} ] = prod {m=1}^M sqrt{(1 - 4gamma_m^2)} leq exp (-2sum{m=1}^M gamma_m^2)$$这里,(gamma_m = frac{1}{2} - e_m.)

    • 如果存在(gamma > 0),对所有(m)(gamma_m geq gamma),则$$frac{1}{N} sum_{i = 1}^N I(G(x_i) eq y_i) leq exp (-2Mgamma^2)$$
      这表明在此条件下,AdaBoost的训练误差是以指数速率下降的。

    AdaBoost算法的解释


    可认为AdaBoost算法是模型为加法模型,损失函数为指数函数,学习算法为前向分步算法时的二分类学习方法。可以由前向分步算法推导出AdaBoost。

    加法模型$$f(x) = sum_{m = 1}^M eta_m b(x; gamma_m)$$,其中,(b(x; gamma_m))为基函数,(gamma_m)为基函数的参数,(eta_m)为基函数的系数。

    每一步中极小化损失函数$$(eta_m, gamma_m) = arg min_{eta_m, gamma_m} sum_{i = 1}^N L(y_i, f_{m-1}(x_i) + eta b(x_i; gamma))$$

    提升树


    提升树是以分类树或回归树为基本分类器的提升方法。提升树被认为是统计学习中性能最好的方法之一。

    • 提升树模型

      [f_M(x) = sum_{m - 1}^M T(x; Theta_m)$$其中,$T(x; Theta_m)$表示决策树;$Theta_m$为决策树的参数;$M$为树的个数。 ]

      与AdaBoost类似,对于二分类问题,提升树算法只需将AdaBoost中的基本分类器限制为二类分类树即可。对于回归问题,采用以下前向分步算法:$$f_0(x) = 0$$ $$f_m(x) = f_{m-1}(x) + T(x; Theta_m), m = 1,2,...,M$$ $$f_M(x) = sum_{m=1}^M T(x; Theta_m)$$ 在前向分步算法的第(m)步,给定当前模型(f_{m-1}(x)),需求解$$hat{Theta}m = arg min{Theta_m} sum_{i =1}^N L(y_i, f_{m-1}(x_i) + T(x_i; Theta_m))$$得到第(m)棵树的参数。

    当采用平方误差损失函数时,损失函数化简为:$$[r - T(x; Theta_m)]^2$$,其中$$r = y - f_{m-1}(x)$$是当前模型拟合数据的残差。

    • 回归问题的提升树算法
    1. 初始化(f_0(x) = 0)

    2. (m = 1, 2, ...,M)

      1. 计算残差(r_{mi} = y_i - f_{m-1}(x_i), i = 1, 2, ..., N)
      2. 拟合残差(r_{mi})学习一个回归树,得到(T(x; Theta_m))
      3. 更新(f_m(x) = f_{m-1}(x) + T(x; Theta_m))
    3. 得到回归问题提升树$$f_M(x) = sum_{m -1}^M T(x; Theta_m)$$

    • 梯度提升
      当损失函数是平方损失和指数损失函数时,每一步优化是很简单的。但对一般损失函数而言,不容易。梯度提升(gradient boosting)算法,利用损失函数的负梯度在当前模型的值$$-[frac{partial L(y, f(x_i))}{partial f(x_i)}]{f(x) = f{m -1}(x)}$$作为回归问题提升树算法中的残差的近似值,拟合一个回归树。


    (注:本文为读书笔记与总结,侧重算法原理,来源为[《统计学习方法》](http://book.douban.com/subject/10590856/)一书第八章)
    作者:[rubbninja](http://www.cnblogs.com/rubbninja/) 出处:[http://www.cnblogs.com/rubbninja/](http://www.cnblogs.com/rubbninja/) 关于作者:目前主要研究领域为机器学习与无线定位技术,欢迎讨论与指正!
  • 相关阅读:
    损失函数及经验风险和结构风险
    ML面试题网站及ML模型网站
    数据归一化
    逻辑回归
    什么是凸函数及如何判断一个函数是否是凸函数
    Feature Selection Can Reduce Overfitting And RF Show Feature Importance
    Python Machine Learning-Chapter4
    skywalking与pinpoint全链路追踪方案对比
    全)Java从单体到微服务打造房产销售平台 2018年慕课网 高清视频+源码
    CentOS7 通过YUM安装MySQL5.7
  • 原文地址:https://www.cnblogs.com/rubbninja/p/5180921.html
Copyright © 2011-2022 走看看