zoukankan      html  css  js  c++  java
  • 李航-统计学习方法-笔记-8:提升方法

    提升方法

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

    本章
    (1)介绍boosting方法的思路和代表性的boosting算法AdaBoost
    (2)通过训练误差分析探讨AdaBoost为什么能提高学习精度
    (3)从前向分布加法模型的角度解释AdaBoost
    (4)最后叙述boosting方法更具体的实例——boosting tree(提升树)

    boosting基本思路:boosting基于这样一种思想:对于一个复杂任务来说,将多个专家的判断进行适当的综合所得出的判断,要比其中任何一个专家单独的判断好。实际上就是“三个臭皮匠,顶个诸葛亮”的道理。

    强可学习:在概率近似正确(probably approximately correct,PAC)学习的框架中,一个概念,如果存在一个多项式的学习算法能够学习它,并且正确率很高,那么称这个概念是强可学习的。

    弱可学习:一个概念,如果存在一个多项式的学习算法能够学习它,学习的正确率仅比随机猜测略好,那么称为弱可学习的。

    强可学习和弱可学习:Schapire证明了强可学习与弱可学习是等价的,也就是说,在PAC学习的框架下,一个概念是强可学习的充要条件是这个概念是弱可学习的。

    从弱学习到强学习:可将“弱学习”提升为“强学习”,弱学习算法通常比强学习算法容易得多。具体如何实施提升,便称为开发提升方法时要解决的问题。有很多提升算法被提出,最具代表性的就是AdaBoost。

    提升方法就是从弱学习算法出发,反复学习,得到一系列弱分类器(又称为基分类器),然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据的概率分布(训练数据的权重分布),针对不同的训练数据分布,调用弱学习算法学习一系列弱分类器。这里就有两个问题。
    (1)在每一轮如何改变训练数据的权值或概率分布
    (2)如何将弱分类器组合成一个强分类器

    AdaBoost

    对于前面提到的两个问题,AdaBoost的做法是
    (1)提高那些被前一轮弱分类器错误分类样本的权重,降低那些被正确分类样本的权重。这样一来,那些没有得到正确分类的数据,由于权值的加大而受到后一轮的弱分类器的更大关注。
    (2)加权多数表决,加大分类器误差小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差大的弱分类器的权值,使其在表决中起较小的作用。

    算法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 {-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} o {+1, -1})

    (b) 计算(G_m(x))在训练集上的分类误差率

    [e_m = sum_{i=1}^{N} P(G_m(x_i) eq y_i) = sum_{G_m(x_i) eq y_i }w_{mi} ]

    (w_{mi})表示第(m)轮中第(i)个实例的权值,(sum_{i=1}^N w_{mi} = 1)。这表明,(G_m(x))在加权的训练集上的分类误差率是被(G_m(x))误分类样本的权重之和。

    (c) 计算(G_m(x))的系数(alpha_m = frac{1}{2} log frac{1- e_m}{e_m}),对数为自然对数。(alpha_m)表示(G_m(x))在最终分类器中的重要性。(e_m leqslant 0.5)(alpha_m geqslant 0),而且(alpha_m)随着(e_m)的减小而增大,分类误差越小的基分类器在最终分类器中的作用越大。

    (d) 更新训练集的权值分布,为下一轮做准备

    [D_{m+1} = (w_{m+1, 1}, ..., w_{m+1, i}, ..., w_{m+1, N}) ]

    [w_{m+1, i} = left{egin{matrix} frac{w_{mi}}{Z_m}e^{-alpha_m}, & G_m(x_i) = y_i\ frac{w_{mi}}{Z_m}e^{alpha_m}, & G_m(x_i) eq y_i end{matrix} ight. ag{8.4}]

    [Z_m = sum_{i=1}^N w_{mi} exp(-alpha_m y_i G_m(x_i)) ag{8.5} ]

    其中(Z_m)为规范化因子。
    误分类样本权值变大,正确分类样本权值缩小,两相比较放大了(frac{1-e_m}{e_m})倍。

    (3)构建基分类器的线性组合

    [f(x) = sum_{m=1}^M alpha_m G_m(x) ag{8.6} ]

    最终分类器为

    [G(x) = sign(f(x)) ag{8.7} ]

    注意(alpha_m)之和不为1。

    AdaBoost算法的训练误差分析

    AdaBoost最基本的性质是它能在学习过程中不断减少训练误差。

    定理8.1(AdaBoost的训练误差界):AdaBoost算法最终分类器的训练误差界为

    [frac{1}{N} sum_{i=1}^{N} I(G(x_i) eq y_i) leqslant frac{1}{N} sum_i exp(-y_i f(x_i)) = prod_m Z_m ]

    证明:当(G(x_i) eq y_i)时,(y_i f(x_i) < 0),所以(exp(-y_i f(x_i)) geqslant 1),推导出前半部分。

    后半部分推导用到式((8.4))的变形:

    [w_{mi} exp(-alpha_m y_i G_m(x_i)) = Z_m w_{m+1,i} ]

    推导如下:

    [egin{split} & frac{1}{N} sum_i exp(-y_i f(x_i)) \ &= frac{1}{N} sum_i exp(-sum_{m=1}^M alpha_m y_i G_m(x_i)) \ &= sum_i w_{1i} prod_{m=1}^M exp(-alpha_m y_i G_m(x_i)) \ &= Z_1 sum_i w_{2i} prod_{m=2}^M exp(-alpha_m y_i G_m(x_i)) \ &= Z_1 Z_2 sum_i w_{3i} prod_{m=3}^M exp(-alpha_m y_i G_m(x_i)) \ &= ... \ &= Z_1 Z_2 ... Z_{M-1} sum_i w_{Mi} exp(-alpha_m y_i G_m(x_i)) \ &= prod_{m=1}^M Z_m end{split}]

    这一定理说明,可以在每一轮选取恰当的(G_m)使得(Z_m)最小,从而使训练误差下降最快。

    定理8.2(二分类问题AdaBoost的训练误差界)

    [prod_{m=1}^M Z_m = prod_{m=1}^{M} [2 sqrt{e_m(1-e_m)}] = prod_{m=1}^M sqrt{1-4gamma_m^2} leqslant exp(-2sum_{m=1}^M gamma_m^2) ]

    这里(gamma_m = frac{1}{2} - e_m)
    证明:由(Z_m)的定义式((8.5))以及式((8.1))

    [egin{split} Z_m &= sum_{i=1}^N w_{mi} exp(-alpha_m y_i G_m(x_i) \ &= sum_{y_i = G_m(x_i)} w_{mi} e^{-alpha_m} + sum_{y_i eq G_m(x_i)} w_{mi} e^{alpha_m} \ &= (1-e_m)e^{-alpha_m} + e_m e^{alpha_m} \ &= 2 sqrt{e_m (1 - e_m)} = sqrt{1 - 4gamma_m^2 } end{split} ag{8.11}]

    至于不等式$exp(-2sum_{m=1}^M gamma_m^2) geqslantprod_{m=1}^M sqrt{1-4gamma_m^2} $

    可由((e^{-2x^2})^2)(x=0)的泰勒展开得到((e^{-2x^2})^2 geqslant 1 - 4x^2)进而推出。

    推论8.1:如果存在(gamma > 0),对所有(m)(gamma_m geqslant gamma),则

    [frac{1}{N} sum_{i=1}^N I(G(x_i) eq y_i) leqslant exp(-2Mgamma^2) ]

    这表明在此条件下AdaBoost的训练误差是以指数速率下降的,这一性质当然很有吸引力。

    与一些早期的提升方法不同,AdaBoost具有适应性,即它能适应弱分类器各自的训练误差率。这也是它名称的由来,Ada是Adaptive的简写。

    AdaBoost算法的解释

    前向分步算法
    考虑加法模型

    [f(x) = sum_{m=1}^M eta_m b(x; gamma_m) ]

    其中(b(x; gamma_m))为基函数,(gamma_m)为基函数的参数,(eta_m)为基函数的系数。

    在给定训练集和损失函数(L(y, f(x)))的条件下,学习加法模型(f(x))成为经验风险极小化即损失函数极小化问题:

    [min_{eta_m, gamma_m} sum_{i=1}^N L(y_i, sum_{m=1}^M eta_m b(x_i; gamma_m)) ag{8.14} ]

    通常这是一个复杂的优化问题。前向分步算法求解这一优化问题的想法是:从前向后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数式((8.14)),那么就可以简化优化的复杂度。每步优化如下损失:

    [min_{eta, gamma} sum_{i=1}^N L(y_i, eta b(x_i; gamma)) ]

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

    由前向分步算法可以推导出AdaBoost,用定理叙述这一关系。

    定理8.3:AdaBoost算法是前向分步加法算法的特例。这时,模型是由基本分类器组成的加法模型,损失函数是指数函数。

    证明:AdaBoost最终分类器为(f(x) = sum_{i=1}^M alpha_m G_m(x)),由基分类器(G_m(x))及其系数(alpha_m)组成,(m=1, 2, ..., M)。前向分步算法逐一学习基函数,这一过程与AdaBoost算法逐一学习基分类器一致。

    下面证明前向分步算法的损失函数是指数损失函数

    [L(y, f(x)) = exp[-yf(x)] ]

    在第(m)轮迭代得到

    [f_m(x) = f_{m-1}(x) + alpha_m G_m(x) ]

    目标是使前向分步算法得到的(alpha_m)(G_m(x))使(f_m(x))在训练数据集(T)上的指数损失最小,即

    [(alpha_m, G_m(x)) = arg min_{alpha, G} sum_{i=1}^N exp [ -y_i(f_{m-1}(x_i) + alpha G(x_i))] ag{8.20} ]

    可表示为

    [(alpha_m, G_m(x)) = arg min_{alpha, G} sum_{i=1}^N ar{w}_{mi} exp [ -y_i alpha G(x_i)] ag{8.21} ]

    其中(ar{w}_{mi} = exp [-y_i f_{m-1}(x_i)])。因为(ar{w}_{mi})既不依赖(alpha)也不依赖(G),所以与最小化无关。但(ar{w}_{mi})依赖于(f_{m-1}(x)),随着每一轮迭代而发生改变。

    对任意(alpha > 0),使((8.21))最小的(G(x))由下式得到:

    [G_m^*(x) = arg min_{G} sum_{i=1}^N ar{w}_{mi} I(y_i eq G(x_i)) ]

    此分类器(G_m^*(x))即为AdaBoost算法的基本分类器(G_m(x)),因为它是使第(m)轮加权训练数据分类误差率最小的基本分类器。

    之后,求(alpha_m^*),参照式((8.11)),式((8.21))

    [egin{split} &sum_{i=1}^N ar{w}_{mi} exp [ -y_i alpha G(x_i)] \ &= sum_{y_i = G_m(x_i)} ar{w}_{mi} e^{-alpha} + sum_{y_i eq G_m(x_i)} ar{w}_{mi} e^{alpha} \ &= (e^{alpha} - e^{-alpha}) sum_{i=1}^N ar{w}_{mi} I(y_i eq G(x_i)) + e^{-alpha} sum_{i=1}^N ar{w}_{mi} end{split} ag{8.22}]

    将已求得的(G_m^*(x))代入式((8.22)),对(alpha)求导并使导数为0,即得到使式((8.21))最小的(alpha)

    [alpha_m^* = frac{1}{2} log frac{1-e_m}{e_m} ]

    其中(e_m)是分类误差率

    [e_m = frac{sum_{i=1}^N ar{w}_{mi} I(y_i eq G_m(x_i))}{sum_{i=1}^N ar{w}_{mi}} = sum_{i=1}^N w_{mi} I(y_i eq G_m(x_i)) ]

    这里的(alpha_m^*)与AdaBoost算法第2(c)步的(alpha_m)完全一致。

    最后来看每一轮样本权值的更新,由

    [f_m(x) = f_{m-1}(x) + alpha_m G_m(x) ]

    以及$$ar{w}{mi} = exp[-y_i f{m-1}(x_i)]$$
    可到

    [ar{w}_{m+1, i} = ar{w}_{m,i} exp [-y_i alpha_m G_m(x)] ]

    这与AdaBoost算法第2(d)步的样本权值更新,只差规范化因子,因而等价。

    提升树

    提升树简述

    提升树被认为是统计学习中性能最好的方法之一。

    提升方法实际采用加法模型(即基函数的线性组合)与前向分步算法。以决策树为基函数的提升方法称为提升树(boosting tree)。

    提升树模型可以表示为决策树的加法模型:

    [f_M(x) = sum_{m=1}^{M} T(x; heta_m) ]

    其中,(T(x; heta_m))表示决策树,( heta_m)为决策树的参数,(M)为树的个数。

    (m)步的模型是(f_m(x) = f_{m-1}(x) + T(x; heta_m))

    其中,(f_{m-1}(x))为当前模型,通过经验风险极小化确定下一棵决策树的参数( heta_m)

    [hat{ heta}_m = arg min_{ heta_m} sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i ; heta_m)) ]

    由于树的线性组合可以很好地拟合训练数据,即使数据中的输入与输出之间的关系很复杂。所以提升树是一个高功能的学习算法。

    提升树的学习算法:下面讨论对不同问题的提升树学习算法,其主要区别在于使用的损失函数不同。包括用指数损失的分类问题,用平方损失的回归问题,以及用一般损失的一般决策问题。

    对于二分类问题,只需将AdaBoost的基分类器限制为二分类树即可。

    回归问题的提升树,将输入空间(mathcal{X})划分为(J)个互不相交的区域(R_1, R_2, ..., R_J),并且在每个区域上确定输出的常量(c_j),那么树可以表示为

    [T(x_i; heta) = sum_{j=1}^J c_j I(x in R_j) ]

    其中,参数( heta= {(R_1, c_1), (R_2, c_2), ..., (R_J, c_J),})表示树的区域划分和各区域上的常数。(J)是回归树的复杂度即叶结点个数。

    使用以下前向分步算法

    [egin{split} f_0(x) &= 0 \ f_m(x) &= f_{m-1}(x) + T(x; heta_m), m=1,2,...,M \ f_M(x) &= sum_{i=1}^M T(x; heta_m)end{split}]

    在前向分步算法的第(m)步,给定当前模型(f_{m-1}(x)),需求解

    [hat{ heta}_m = arg min_{ heta_m} sum_{i=1}^N L(y_i, f_{m-1}(x_i) + T(x_i ; heta_m)) ]

    得到(hat{ heta}_m),即第(m)棵树的参数。

    当采用平方损失时

    [egin{split} &L(y, f_{m-1}(x) + T(x; heta_m)) \ &= [y - f_{m-1}(x) - T(x; heta_m)]^2 \ &= [r - T(x; heta_m)]^2 end{split}]

    这里,(r= y - f_{m-1}(x)),是当前模型拟合数据的残差。所以,对回归问题的提升树算法来说,只需简单地拟合当前模型的残差。

    梯度提升
    提升树利用加法模型与前向分步算法实现学习的优化过程。当损失函数是平方损失和指数损失时,每一步优化是简单的。

    但对一般损失函数而言,往往每一步优化并不容易。针对这一问题,Freidman提出了梯度提升(gradient boosting)算法。这是利用最速下降法的近似方法,其关键是利用损失函数的负梯度在当前模型的值

    [-[frac{partial L(y, f(x_i))}{partial f(x_i)}]_{f(x) = f_{m-1}(x)} ]

    作为回归问题提升树算法中残差的近似值,拟合一个回归树。

  • 相关阅读:
    隐私保护政策
    童真儿童简笔画
    方块十字消
    iOS 判断一断代码的执行时间(从网上看的,自己实现一下)
    iOS BLOCK回调:(妖妖随笔)
    typedef struct
    #define和预处理指令
    UIActivityIndicatorView
    Expected a type 的错误
    iOS 本地化字符串—(妖妖随笔)
  • 原文地址:https://www.cnblogs.com/liaohuiqiang/p/10980080.html
Copyright © 2011-2022 走看看