集成学习(AdaBoost、随机森林)算法推导

集成学习

1.个体与集成

​ 有一句文化术语,“三个臭皮匠顶个诸葛亮”。本篇文章的主题集成学习就是这句话的践行者,什么是集成学习呢?集成学习就是将多个个体学习器组合成一个组合学习器的方法,这样的组合通常能够取得优于个体学习器的泛化性能,特别是个体学习器是弱学习器时效果显著,因此,集成学习理论研究通常针对于弱学习器。多个学习器既可以采用同一种模型算法,又可以采用不同的模型算法;前者的集成是"同质的",被称为“基学习算法”;后者的集成是"异质的",被称为“组合学习算法”。‘

​ 但是,简单地将多个个体学习器组合并不能达到预期的效果,如下图所示。采用投票法,少数服从多数,表(a)中个体学习器正确率是2/3,集成学习器正确率是100%,集成提升性能;表(b)个体学习器正确率是2/3,集成学习器正确率同样是2/3,集成不起作用;表©个体学习器正确率是1/3,集成学习器正确率是0,集成起负作用。从下图中,可以看出要得到好的集成效果,个体学习器最好是“好而不同”,一方面要求正确性,另一方面要求多样性,即学习器间具有差异性。

集成学习(AdaBoost、随机森林)算法推导

可以简单地分析下集成错误率,考虑二分类问题y={1,0}y=\{1,0\},真实函数为f(x)f(x);采用简单投票法集成T个基学习器hi(x)h_i(x),得到基学习算法H(x)H(x);每个基学习器错误率均为ε\varepsilon,即P{hi(x)̸=f(x)}=εP\{h_i(x) \not= f(x)\}=\varepsilon,而且基学习器错误率相互独立。推导基学习算法错误率如下:
P{H(x)̸=f(x)}={P(i=1Thi(x)T2)if  f(x)=1P(i=1Thi(x)>T2)if  f(x)=0 P\{H(x) \not = f(x)\} = \begin{cases} P(\sum_{i=1}^Th_i(x) \le \frac{T}{2})&\text{if } \space f(x)=1\\ P(\sum_{i=1}^Th_i(x)\gt \frac{T}{2})&\text{if } \space f(x)=0 \end{cases}
又假设x1,x2,...,xnx_1,x_2,...,x_n独立同分布,均满足伯努利0-1分布,正确概率为p,并记S(x)=i=1nxiS(x)=\sum_{i=1}^nx_i,且ε>0\varepsilon \gt 0,有霍夫丁不等式如下:
P{S(x)n(p+ε)}exp{2ε2n} P\{S(x) \ge n(p+\varepsilon)\} \le exp\{-2\varepsilon^2n\}

P{S(x)n(pε)}exp{2ε2n} P\{S(x) \le n(p-\varepsilon)\} \le exp\{-2\varepsilon^2n\}

p=ε,ε=εp=\varepsilon,\varepsilon=\varepsilon`代入霍夫丁不等式得,令T(ε+ε)=T/2T(\varepsilon + \varepsilon`)=T/2,即ε=12ε\varepsilon`=\frac{1}{2}-\varepsilon,于是有
P(i=1Thi(x)T2)exp{2(12ε)2T}=exp{T2(12ε)2} P(\sum_{i=1}^Th_i(x) \le \frac{T}{2}) \le exp\{-2(\frac{1}{2}-\varepsilon)^2T\}=exp\{-\frac{T}{2}(1-2\varepsilon)^2\}
同理,令T(εε)=T/2T(\varepsilon-\varepsilon`)=T/2,即ε=ε12\varepsilon`=\varepsilon-\frac{1}{2},于是有
P(i=1Thi(x)>T2)exp{2(ε12)2T}=exp{T2(12ε)2} P(\sum_{i=1}^Th_i(x) \gt \frac{T}{2}) \le exp\{-2(\varepsilon-\frac{1}{2})^2T\}=exp\{-\frac{T}{2}(1-2\varepsilon)^2\}

P{H(x)̸=f(x)}exp{T2(12ε)2} P\{H(x)\not = f(x)\} \le exp\{-\frac{T}{2}(1-2\varepsilon)^2\}
​ 由上式可以看出,随着个体学习器T数目增加,集成学习器错误趋于零,从一定程度上为集成学习性能优化提供了解释。在上述分析中,我们假设个体学习器错误率是相互独立的,然而在实际运用中,个体学习器是基于同一数据集训练得出的,不可能满足相互独立的假设。事实上,如何使得个体学习器"好而不同",正是集成学习所需要解决的核心问题。

​ 根据个体学习器的生成方式,集成学习算法大致可以分为两类,一类是串行生成的序列化算法,一类是并行算法。前者个体学习器之间存在强依赖,比如boosting算法;后者个体学习器之间不存在强依赖,比如随机森林算法。

2.Boosting算法

​ Boosting算法属于串行生成的序列化算法,其基本思想是:先在初始训练集上训练出一个基学习器,然后根据前一个基学习器的分类结果调整训练样本分布,使分类错误的样本得到更多的关注,而后再训练另一个基学习器,重复上述过程,直至训练出T个基学习器,最终将这T个基学习器加权结合得到基学习算法。

2.1 AdaBoost算法

​ AdaBoost算法是Boosting算法的典型代表,如前面所说,Boosting算法是根据上一个基学习器分类结果来调整样本分布来训练下一个基学习器,AdaBoost算法采用的是以均一化权重来调整训练样本分布。假设训练集D包含n个样本数据,并在每一次训练基学习器hm(x)h_m(x)时为每个样本xix_i设置权重ωm,i\omega_{m,i},其中m取1到T,i取1到n;初始状态时,设置权重ω1,i=1n,i=1,2,3...,n\omega_{1,i}=\frac{1}{n}, i=1,2,3...,n,后续不断更新样本权重。假设第i次训练样本分布记为DiD_i,在训练样本分布D1D_1上训练出基学习器hi(x)h_i(x)

hi(x)h_i(x)在训练样本分布DiD_i上错误率为
ei=j=1nωi,jI(h1(xj)̸=yj) e_i=\sum_{j=1}^n\omega_{i,j} I(h_1(x_j) \not = y_j)
h1(x)h_1(x)在加权结合时权重为
αi=12ln(1eiei) \alpha_i=\frac{1}{2}\ln(\frac{1-e_i}{e_i})
于是更新后的权重为
ωi+1,j=ωi,jexp{yjHi(xj)}j=1nωi,jexp{yjHi(xj)} \omega_{i+1,j}=\frac{\omega_{i,j}exp\{-y_jH_i(x_j)\}}{\sum_{j=1}^n\omega_{i,j}exp\{-y_jH_i(x_j)\}}
其中Hi(x)=j=1iαihi(x)H_i(x) = \sum_{j=1}^i \alpha_ih_i(x),由此可迭代求出T个基学习器,于是最终得到的基学习算法为
H(x)=i=1Tαihi(x) H(x)=\sum_{i=1}^T \alpha_ih_i(x)
决策函数为sign{H(x)}sign\{H(x)\}

2.2 AdaBoost算法推导

​ (1)我们可以确定AdaBoost算法流程是合理的,每一次训练得到基学习器hi(x)h_i(x),对应基学习器权重为αi\alpha_i,导出的决策函数为sign{H(x)}=sign{i=1mαihi(x)}sign\{H(x)\}=sign\{\sum_{i=1}^m \alpha_ih_i(x)\}

​ (2)AdaBoost算法解决的是二分类问题,算法应该使用0-1损失函数,但是0-1损失函数不具有连续可微的性质,我们可以使用指数损失函数来代替0-1损失函数,因为它们互为一致性替代函数。证明如下:

  • 指数损失函数为lexp(H(x)D)=ExD[ef(x)H(x)]l_{exp}(H(x)|D)=E_{x \in D}[e^{-f(x)H(x)}],对H(x)求偏导可导
    lexp(H(x)D)H(x)=eH(x)P(f(x)=1x)+eH(x)P(f(x)=1x) \frac{\partial l_{exp}(H(x)|D)}{\partial H(x)}=-e^{-H(x)}P(f(x)=1|x)+e^{H(x)}P(f(x)=-1|x)

​ 令偏导数为0得
H(x)=12lnP(f(x)=1x)P(f(x)=1x) H(x)=\frac{1}{2}\ln \frac{P(f(x)=1|x)}{P(f(x)=-1|x)}
​ 因此,有
sign{H(x)}={1,P(f(x)=1x)>P(f(x)=1x)1,P(f(x)=1x)<P(f(x)=1x) sign\{H(x)\}= \begin{cases} 1 &, & P(f(x)=1|x) \gt P(f(x)=-1|x)\\ -1 &, & P(f(x)=1|x) \lt P(f(x)=-1|x) \end{cases}
​ 即,
sign{H(x)}=argmaxy{1,1}P(f(x)=yx) sign\{H(x)\}={\arg \max}_{y \in \{-1,1\}} P(f(x)=y|x)
​ 上式与贝叶斯分类器决策函数一致,而贝叶斯决策函数表示的是使错误率最小化,即0-1损失函数最小化,故指数损失函数与0-1损失函数互为一致性替代函数。

​ (3)从H(x)表达式由基学习器权重αi\alpha_i和基学习器hi(x)h_i(x)构成,其中基学习器hi(x)h_i(x)是在训练样本分布DiD_i上训练出来的。现在我们来推导基学习器权重αi\alpha_i公式,显然,每一对αihi(x)\alpha_ih_i(x)都应该逼近真实值f(x)f(x),于是我们可以通过最小化指数损失函数来求解。指数损失函数为
lexp(αihi(x)Di)=ExDi[exp{f(x)αihi(x)}]=ExDi[eαiI(f(x)=hi(x))+eαiI(f(x)̸=hi(x))]=eαiPxDi(f(x)=hi(x))+eαiPxDi(f(x)̸=hi(x))=eαi(1ei)+eαiei \begin{aligned} l_{exp}(\alpha_ih_i(x)|D_i) &= E_{x \in D_i} [exp\{-f(x)\alpha_ih_i(x)\}]\\ & = E_{x \in D_i} [e^{-\alpha_i}I(f(x)=h_i(x)) + e^{\alpha_i}I(f(x)\not =h_i(x))]\\ & = e^{-\alpha_i}P_{x \in D_i}(f(x)=h_i(x)) + e^{\alpha_i}P_{x \in D_i}(f(x)\not = h_i(x))\\ & = e^{-\alpha_i}(1-e_i) + e^{\alpha_i}e_i \end{aligned}
​ 其中I()I(\cdot)表示阶跃函数,eie_i表示基学习器hi(x)h_i(x)错误率,且f(x),hi(x){1,1}f(x),h_i(x)\in \{-1,1\},其求αi\alpha_i偏导数可得
lexp(αihi(x)Di)αi=eαi(1ei)+eαiei \frac{\partial l_{exp}(\alpha_ih_i(x)|D_i)}{\partial \alpha_i} =-e^{-\alpha_i}(1-e_i) + e^{\alpha_i}e_i
​ 令偏导数为0得
αi=12ln1eiei \alpha_i = \frac{1}{2}\ln\frac{1-e_i}{e_i}
​ (4)H(x)公式两部分都已经得到,但还没完;以上两部分只能求出对某一样本分布的,还需要调整样本分布即样本权重ωm,i\omega_{m,i},现在我们来推导ω\omega更新公式。已知前i-1个基学习器加权得到Hi1H_{i-1},第i个基学习器hih_i待训练,那么对于第i个基学习器hih_i来说,最好的情况是hih_i能够使得整个数据集Di1D_{i-1}所有样本数据都能够正确分类,所以我们希望最小化Hi1+hiH_{i-1}+h_i在数据集Di1D_{i-1}上指数损失函数,其指数损失函数为
lexp(Hi1+hiDi1)=ExDi1[exp{f(x)(Hi1+hi)}]=ExDi1[ef(x)Hi1ef(x)hi] \begin{aligned} l_{exp}(H_{i-1}+h_i|D_{i-1}) & = E_{x \in D_{i-1}}[exp\{-f(x)(H_{i-1}+h_i)\}]\\ & = E_{x \in D_{i-1}}[e^{-f(x)H_{i-1}} \cdot e^{-f(x)h_i}] \end{aligned}
​ 由泰勒展开式可得
ef(x)hi=1+[f(x)hi]+f2(x)hi22+O([f(x)hi]3) e^{-f(x)h_i} = 1 + [-f(x)h_i] + \frac{f^2(x)h_i^2}{2} + O([-f(x)h_i]^3)

​ 又因为f(x),hi(x){1,1}f(x),h_i(x)\in \{-1,1\},所以
ef(x)hi=1f(x)hi+12=32f(x)hi e^{-f(x)h_i} = 1 - f(x)h_i + \frac{1}{2} = \frac{3}{2} - f(x)h_i
​ 将上式代入指数损失函数可得
lexp(Hi1+hiDi1)=ExDi1[ef(x)Hi1(32f(x)hi)] l_{exp}(H_{i-1}+h_i|D_{i-1}) = E_{x \in D_{i-1}}[e^{-f(x)H_{i-1}} \cdot (\frac{3}{2} - f(x)h_i)]
​ 于是
minhilexp(Hi1+hiDi1)=minhiExDi1[ef(x)Hi1(32f(x)hi)] \min_{h_i} l_{exp}(H_{i-1}+h_i|D_{i-1}) = \min_{h_i} E_{x \in D_{i-1}}[e^{-f(x)H_{i-1}} \cdot (\frac{3}{2} - f(x)h_i)]
​ 又因为Hi1,f(x)H_{i-1},f(x)均为已知常量,所以可以直接舍去,即
minhilexp(Hi1+hiDi1)=minhiExDi1[ef(x)Hi1f(x)hi]=maxhiExDi1[ef(x)Hi1f(x)hi] \begin{aligned} \min_{h_i} l_{exp}(H_{i-1}+h_i|D_{i-1}) & = \min_{h_i} E_{x \in D_{i-1}}[-e^{-f(x)H_{i-1}} \cdot f(x)h_i]\\ & = \max_{h_i} E_{x \in D_{i-1}}[e^{-f(x)H_{i-1}} \cdot f(x)h_i] \end{aligned}
​ 由上式可看出来需要最大化期望,而ω\omega表示样本权重,可看作样本出现概率。在训练集Di1D_{i-1}中第j个样本出现概率为ωi1,j\omega_{i-1,j},即
minhilexp(Hi1+hiDi1)=maxhiExDi1[ef(x)Hi1f(x)hi]=maxhij=1nef(xj)Hi1f(xj)hiωi1,j=maxhij=1nωi1,jef(xj)Hi1zif(xj)hi \begin{aligned} \min_{h_i} l_{exp}(H_{i-1}+h_i|D_{i-1}) & = \max_{h_i} E_{x \in D_{i-1}}[e^{-f(x)H_{i-1}} \cdot f(x)h_i]\\ & = \max_{h_i} \sum_{j=1}^n e^{-f(x_j)H_{i-1}} \cdot f(x_j)h_i \cdot \omega_{i-1,j}\\ & = \max_{h_i} \sum_{j=1}^n \frac{\omega_{i-1,j} \cdot e^{-f(x_j)H_{i-1}}}{z_i} \cdot f(x_j)h_i\\ \end{aligned}
​ 其中zi=j=1nωi1,jef(xj)Hi1z_i = \sum_{j=1}^n \omega_{i-1,j} \cdot e^{-f(x_j)H_{i-1}}是一个常数,不影响求最值。又ωi1,jef(xj)Hi1zi[0,1]\frac{\omega_{i-1,j} \cdot e^{-f(x_j)H_{i-1}}}{z_i} \in [0,1]并且j=1nωi1,jef(xj)Hi1zi=1\sum_{j=1}^n \frac{\omega_{i-1,j} \cdot e^{-f(x_j)H_{i-1}}}{z_i} = 1,满足概率定义,所以可以将这部分看作概率,令样本分布DiD_i中第j个样本出现概率为ωi1,jef(xj)Hi1zi\frac{\omega_{i-1,j} \cdot e^{-f(x_j)H_{i-1}}}{z_i},故
minhilexp(Hi1+hiD)=maxhij=1nωi1,jef(xj)Hi1zif(xj)hi=maxhiExDi[f(x)hi] \begin{aligned} \min_{h_i} l_{exp}(H_{i-1}+h_i|D) & = \max_{h_i} \sum_{j=1}^n \omega_{i-1,j} \cdot \frac{e^{-f(x_j)H_{i-1}}}{z_i} \cdot f(x_j)h_i\\ & = \max_{h_i} E_{x \in D_i} [f(x)h_i] \end{aligned}
​ 又因为f(x),hi{1,1}f(x),h_i \in \{-1,1\}
f(x)hi=12I(f(x)=hi) f(x)h_i = 1-2I(f(x)=h_i)
​ 于是
minhilexp(Hi1+hiD)=maxhiExDi[f(x)hi]=maxhiExDi[12I(f(x)=hi)]=minhiExDi[I(f(x)=hi)] \begin{aligned} \min_{h_i} l_{exp}(H_{i-1}+h_i|D) & = \max_{h_i} E_{x \in D_i} [f(x)h_i]\\ & = \max_{h_i} E_{x \in D_i} [1-2I(f(x)=h_i)]\\ & = \min_{h_i} E_{x \in D_i} [I(f(x)=h_i)] \end{aligned}
​ 综上所述,理想的基学习器hih_i是在样本分布DiD_i上最小化0-1损失函数得到的,于是我们可以得到样本权重更新公式
ωi,j=ωi1,jef(xj)Hi1zi \omega_{i,j} = \omega_{i-1,j} \cdot \frac{e^{-f(x_j)H_{i-1}}}{z_i}

3.Bagging和随机森林

3.1 Bagging

​ Bagging算法是并行集成学习算法的典型代表,其基本思想是:多次对样本数据集采样,得到相互重叠的T个训练数据集,在T个数据集上分别训练出基学习器,然后采用简单投票法将T个基学习器组合起来,得到最终组合学习器。采样的方法采用自助采样法(见《模型评估与选择》),每次采样得到的样本数据约占初始数据集的63.2%,其余部分可用来估计学习器的泛化误差。

3.2 随机森林

随机森林算法便是在基学习器决策树基础上使用Bagging算法进行集成的范例。我们知道决策树算法每一次会在所有d个属性中选取最优划分属性,而同前文所述,好的集成学习器理想的情况下最好是基学习器之间"好而不同"。通过采样得到的多个数据集互有重叠,这样,每一个数据集对应决策树算法选择最优划分属性有比较大的可能会是一样的,无法得到比较好的效果。于是随机森林算法在Bagging的基础上引入一定随机性,每次先随机选取k个子属性集,然后从中选取一个最优划分属性,其中k表示随机性,推荐值为k=log2dk=log_2d

​ 由于引入随机性属性扰动,随机森林单个基学习器效果上有所减弱,但随着基学习器数目的增加,总体集成效果优于Bagging算法。

集成学习(AdaBoost、随机森林)算法推导

4.组合策略

​ 集成学习有三种组合策略:

  • 平均法:H(x)=1Ti=1Thi(x)H(x)=\frac{1}{T}\sum_{i=1}^Th_i(x),代表算法就是AdaBoost
  • 投票法:少数服从多数,代表算法随机森林
  • 学习法:使用两级学习器,初级学习器在原始数据集上训练,得到的输出作为新的样本数据,交由次级学习器训练,代表算法Stacking

参考文献

  • 《机器学习》 - 周志华
  • 《统计学习方法》 - 李航