飞道的博客

ML (Chapter 8): 集成学习

354人阅读  评论(0)

本文为《机器学习》(周志华) 的读书笔记

个体与集成

  • 集成学习 (ensemble learning) 通过 构建并结合多个个体学习器 (individual learner) 来完成学习任务
    • 同质 (homogeneous) 集成: 集成中只包含同种类型的个体学习器 (基分类器,base learner),例如 “决策树集成” 中全是决策树,"神经网络集成"中全是神经网络
    • 异质 (homogeneous) 集成: 集成包含不同类型的个体学习器 (component learner),例如同时包含决策树和神经网络
  • 集成学习通过将多个学习器进行结合,常可获得比单一学习器显著优越的泛化性能 ; 这对 “弱学习器" (weak learner) 尤为明显,因此集成学习的很多理论研究都是针对弱学习器进行的
    • 要获得好的集成,个体学习器应“好而不同”,即个体学习器要有一定准确性,并且要有"多样性" (diversity) ,即学习器间具有差异

弱学习器常指泛化性能略优于随机猜测的学习器,例如在二分类问题上精度略高于 50% 的分类器


关于集成学习性能的简单分析

  • 考虑二分类问题 y ∈ { − 1 , + 1 } y\in \{-1,+1\} y{ 1,+1} 和真实函数 f f f, 假定基分类器的错误率为 ϵ \epsilon ϵ,集成通过简单投票法结合 T T T 个基分类器且基分类器的错误率相互独立,则由 Hoeffding 不等式可知,集成的错误率为
  • 上式显示出,随着集成中个体分类器数目 T T T 的增大,集成的错误率将指数级下降,最终趋向于零. 然而我们必须注意到,上面的分析有一个关键假设 :基学习器的误差相互独立.在现实任务中,个体学习器是为解决同一个问题训练出来的,它们显然不可能相互独立!
  • 事实上,个体学习器的"准确性"和"多样性"本身就存在冲突. 一般的,准确性很高之后,要增加多样性就需牺牲准确性. 事实上,如何产生并结合"好而不同"的个体学习器,恰是集成学习研究的核心

  • 根据个体学习器的生成方式,目前的集成学习方法大致可分为两大类:
    • 个体学习器间存在强依赖关系、必须串行生成的序列化方法Boosting
    • 个体学习器间不存在强依赖关系、可同时生成的并行化方法Bagging,“随机森林” (Random Forest)

Boosting: AdaBoost

  • Boosting 是一族可将弱学习器提升为强学习器的算法. 这族算法的工作机制类似:
    • 先从初始训练集训练出一个基学习器,再根据基学习器的表现对训练样本分布进行调整,使得先前基学习器做错的训练样本在后续受到更多关注,然后基于调整后的样本分布来训练下一个基学习器; 如此重复进行,直至基学习器数目达到事先指定的值 T T T,最终将这 T T T基学习器进行加权结合
    • Boosting 族算法最著名的代表是 AdaBoost,下面介绍 AdaBoost
      • AdaBoost 算法有多种推导方式,比较容易理解的是基于"加性模型"

默认为二分类问题: y i ∈ { − 1 , + 1 } y_i\in \{-1, + 1 \} yi{ 1,+1} f f f 是真实函数; ϵ t \epsilon_t ϵt 为错误率; h i h_i hi 为基分类器; H ( x ) H(\boldsymbol x) H(x) 为分类结果; sign \textrm{sign} sign 为符号函数: sign ( x ) = { 1       x > 0 − 1       x < 0 \textrm{sign}(x)=\left\{

1           x > 0 1           x < 0
\right. sign(x)={ 1     x>01     x<0 (这里忽略了 x = 0 x=0 x=0 的情况)

加性模型 (additive model)

  • 加性模型基学习器的线性组合
  • 加性模型不采用梯度下降的思想,而是 H ( x ) = ∑ t = 1 T − 1 α t h t ( x ) + α T h T ( x ) H(x) =\sum_{t=1}^{T−1}α_t h_t(\boldsymbol x)+α_Th_T(\boldsymbol x) H(x)=t=1T1αtht(x)+αThT(x) 每次更新求解一个理论上最优的 h T h_T hT(见式 8.18) α T α_T αT(见式 8.11)

指数损失函数 (exponential loss function)

  • 首先我们定义指数损失函数作为分类任务的损失函数,我们的目标就是最小化指数损失函数
  • 感性理解:由式 (8.4) 知
    又由式 (8.11) 可知
    ln ⁡ \ln ln 函数的单调性可知,该分类器的权重只与分类器的错误率负相关(即错误率越大,权重越低),下面解释指数损失函数的意义:
    • (1) 先考虑指数损失函数 e − f ( x ) H ( x ) e^{−f(\boldsymbol x)H(\boldsymbol x)} ef(x)H(x) 的含义: f f f 为真实函数,只能取 + 1 +1 +1 − 1 −1 1,而 H ( x ) H(x) H(x) 是一个实数;当 H ( x ) H(x) H(x) 的符号与 f ( x ) f(x) f(x) 一致时, f ( x ) H ( x ) > 0 f(x)H(x) > 0 f(x)H(x)>0,因此 e − f ( x ) H ( x ) = e − ∣ H ( x ) ∣ e^{−f(\boldsymbol x)H(\boldsymbol x)}=e^{-|H(x)|} ef(x)H(x)=eH(x),且 ∣ H ( x ) ∣ |H(x)| H(x) 越大指数损失函数越小(这很合理:此时 ∣ H ( x ) ∣ |H(x)| H(x) 越大意味着分类器本身对预测结果的信心越大,损失应该越小;若 ∣ H ( x ) ∣ |H(x)| H(x) 在零附近,虽然预测正确,但表示分类器本身对预测结果信心很小,损失应该较大;当 H ( x ) H(x) H(x) 的符号与 f ( x ) f(x) f(x) 不一致时, f ( x ) H ( x ) < 0 f(x)H(x) < 0 f(x)H(x)<0,因此 e − f ( x ) H ( x ) = e ∣ H ( x ) ∣ > 1 e^{−f(\boldsymbol x)H(\boldsymbol x)}=e^{|H(x)|}> 1 ef(x)H(x)=eH(x)>1,且 ∣ H ( x ) ∣ |H(x)| H(x) 越大指数损失函数越大(这很合理:此时 ∣ H ( x ) ∣ |H(x)| H(x) 越大意味着分类器本身对预测结果的信心越大,但预测结果是错的,因此损失应该越大)
    • (2) 符号 E x ∼ D [ ⋅ ] \mathbb E_{x\sim\mathcal D}[·] ExD[] 的含义: D \mathcal D D 为概率分布,可简单理解为在数据集 D D D 中进行一次随机抽样,每个样本被取到的概率;因此 E x ∼ D [ ⋅ ] \mathbb E_{x\sim\mathcal D}[·] ExD[] 表示在概率分布 D \mathcal D D 上的期望,可简单理解为对数据集 D D D 以概率 D \mathcal D D 进行加权后的期望。即

系统分析指数损失函数

  • H ( x ) H(x) H(x) 能令指数损失函数最小化,则考虑式 (8.5) 对 H ( x ) H(x) H(x) 的偏导
    • 解析:
  • 令式 (8.6) 为零可解得
    因此,有
  • 这意味着 sign ( H ( x ) ) \textrm{sign} (H(x)) sign(H(x)) 达到了贝叶斯最优错误率 (厉害!). 换言之,若指数损失函数最小化,则分类错误率也将最小化; 这说明指数损失函数是分类任务原本 0/1 损失函数的一致的 (consistent) 替代损失函数. .由于这个替代函数有更好的数学性质,例如它是连续可微函数,因此我们用它替代 0/1 损失函数作为优化目标

分类器权重更新公式

  • 在 AdaBoost 算法中,第一个基分类器 h 1 h_1 h1 是通过直接将基学习算法用于初始数据分布而得; 此后迭代地生成 h t h_t ht α t α_t αt当基分类器 h t h_t ht 基于分布 D t \mathcal D_t Dt 产生后,该基分类器的权重 α t α_t αt 应使得 α t h t α_th_t αtht 最小化指数损失函数
    其中 ϵ t = P x ∼ D t ( h t ( x ) ≠ f ( x ) ) \epsilon_t = P_{x\sim\mathcal D_t} (h_t(\boldsymbol x)\neq f(\boldsymbol x)) ϵt=PxDt(ht(x)=f(x)) h t x ) h_tx) htx) 分类的错误率
  • 考虑指数损失函数的导数
    令上式为零可得到分类器权重更新公式

调整训练样本分布

  • AdaBoost 算法在获得 H t − 1 H_{t- 1} Ht1 之后样本分布将进行调整,使下一轮的基学习器 h t h_t ht 能纠正且 H t − 1 H_{t-1} Ht1 的一些错误. 理想的 h t h_t ht 能纠正 H t − 1 H_{t-1} Ht1 的全部错误,即最小化
    • 因为理想的 h t h_t ht 可以纠正 H t − 1 H_{t−1} Ht1 的全部错误,所以这里指定其权重系数为 1 1 1。如果权重系数 α t α_t αt 是个常数的话,对后续结果也没有影响
  • 注意到 f 2 ( x ) = h t 2 ( x ) = 1 f^2(\boldsymbol x) = h_t^2(\boldsymbol x) = 1 f2(x)=ht2(x)=1,上式可使用 e − f ( x ) h t ( x ) e^{- f(\boldsymbol x)h_t(\boldsymbol x)} ef(x)ht(x) 的泰勒展式近似为 ( e x e^x ex 的二阶泰勒展开为 1 + x + x 2 2 + o ( x 2 ) 1 + x + \frac{x^2}{2} + o(x^2) 1+x+2x2+o(x2)):
  • 于是,理想的基学习器
    注意到 E x ∼ D [ e − f ( x ) H t − 1 ( x ) ] \mathbb E_{x\sim\mathcal D}[e^{-f(x)H_{t-1}(x)}] ExD[ef(x)Ht1(x)] 是一个常数.
  • D t \mathcal D_t Dt 表示一个分布

  • f ( x ) , h ( x ) ∈ { − 1 , + 1 } f(x), h(x) \in \{-1, +1\} f(x),h(x){ 1,+1}, 有
    则理想的基学习器
  • 由此可见,理想的 h t h_t ht 将在分布 D t \mathcal D_t Dt 下最小化分类误差. 因此,弱分类器将基于分布 D t \mathcal D_t Dt 来训练,且针对 D t \mathcal D_t Dt分类误差应小于 0.5. 这在一定程度上类似 “残差逼
  • 考虑到 D t \mathcal D_t Dt D t + 1 \mathcal D_{t+1} Dt+1 的关系,有

注意,上式中两个期望只差为常数,因此在实现时只要把它们同意看作一个规范化因子即可

AdaBoost 算法

标准 AdaBoost 只适用于二分类任务

Discussion

  • Boosting 算法要求基学习器能对特定的数据分布进行学习,这可通过“重赋权法"(re-weighting)实施,即在训练过程的每一轮中,根据样本分布为每个训练样本重新赋予一个权重
    • 对无法接受带权样本的基学习算法,则可通过"重采样法"(re-sampling)来处理,即在每一轮学习中,根据样本分布对训练集重新进行采样,再用重采样而得的样本集对基学习器进行训练
  • 需注意的是,Boosting 算法在训练的每一轮都要检查当前生成的基学习器是否满比随机猜测好,一旦条件不满足,则当前基学习器即被抛弃,且学习过程停止
    • 在此种情形下,初始设置的学习轮数 T T T 也许还远未达到,可能导致最终集成中只包含很少的基学习器而性能不佳
    • 若采用“重采样法”,则可获得“重启动”机会以避免训练过程过早停止, 即在抛弃不满足条件的当前基学习器之后,可根据当前分布重新对训练样本进行采样,再基于新的采样结果重新训练出基学习器,从而使得学习过程可以持续到预设的 T T T 轮完成

  • 从偏差-方差分解的角度看,Boosting 主要关注降低偏差,因此 Boosting 能基于泛化性能相当弱的学习器构建出很强的集成

Bagging 与 随机森林

  • 欲得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立;虽然 “独立” 在现实任务中无法做到,但可以设法使基学习器尽可能具有较大的差异
    • 给定一个训练数据集,一种可能的做法是对训练样本进行采样,产生出若干个不同的子集,再从每个数据子集中训练出一个基学习器
    • 然而,为获得好的集成,我们同时还希望个体学习器不能太差.如果采样出的每个子集都完全不同,则每个基学习器只用到了一小部分训练数据,甚至不足以进行有效学习,这显然无法确保产生出比较好的基学习器
    • 为解决这个问题,我们可考虑使用相互有交叠的采样子集

Bagging

Bootstrap AGGregatING

  • 它直接基于 Chapter2 介绍过的自助采样法 (bootstrap sampling).
    • 给定包含 m m m 个样本的数据集,我们先随机取出一个样本放入采样集中,再把该样本放回初始数据集,使得下次采样时该样本仍有可能被选中,这样,经过 m m m 次随机采样操作,我们得到含 m m m 个样本的采样集,初始训练集中有的样本在采样集里多次出现有的则从未出现. 由式 (2.1) 可知,初始训练集中约有 63.2 % 63.2\% 63.2% 的样本出现在采样集中.
    • 照这样,我们可采样出 T T T 个含 m m m 个训练样本的采样集,然后基于每个采样集训练出一个基学习器,再将这些基学习器进行结合.
    • 在对预测输出进行结合时,Bagging 通常对分类任务使用简单投票法,对回归任务使用简单平均法 (即每个基学习器使用相同权重的投票, 平均).若分类预测时出现两个类收到同样票数的情形,则最简单的做法是随机选择一个,也可进一步考察学习器投票的置信度来确定最终胜者

D b s \mathcal D_{bs} Dbs 是自助采样产生的样本分布


  • 假定基学习器的计算复杂度为 O ( m ) O(m) O(m), 则 Bagging 的复杂度大致为 T ( O ( m ) + O ( s ) ) T (O(m) + O(s)) T(O(m)+O(s)), 考虑到采样与投票/平均过程的复杂度 O ( s ) O(s) O(s) 很小,而 T T T 通常是一个不太大的常数,因此,训练一个 Bagging 集成与直接使用基学习算为处理多分类或回归任法训练一个学习器的复杂度同阶,这说明 Bagging 是一个很高效的集成学习算务
  • 另外,与标准 AdaBoost 只适用于二分类任务不同,Bagging 能不经修改地用于多分类、回归等任务
  • 值得一提的是,自助采样过程还给 Bagging 带来了另一个优点:由于每个 基学习器只使用了初始训练集中约 63.2% 的样本,剩下约 36.8% 的样本可用作验证集来对泛化性能进行"包外估计" (out-of-bag estimate). 为此需记录每个基学习器所使用的训练样本.
    • 不妨令 D t D_t Dt 表示 h t h_t ht 实际使用的训练样本集,令 H o o b ( x ) H^{oob}(x) Hoob(x) 表示对样本 x x x 的包外预测,即仅考虑那些未使用 x x x 训练的基学习器在 x x x 上的预测: (即用“投票法”选择包外估计的结果)
    • 则 Bagging 泛化误差的包外估计
  • 事实上,包外样本还有许多其他用途
    • 例如当基学习器是决策树时,可使用包外样本来辅助剪枝,或用于估计决策树中各结点的后验概率以辅助对零训练样本结点的处理
    • 当基学习器是神经网络时,可使用包外样本来辅助早期停止以减小过拟合风险
  • 从偏差-方差分解的角度看,Bagging 主要关注降低方差,因此它在不剪枝决策树、神经网络等易受样本扰动的学习器上效用更为明显 (关于样本扰动, 参见 8.5.3节)

随机森林 (Random Forest, RF)

  • RF以决策树为基学习器构建 Bagging 集成的基础上,进 一步在决策树的训练过程中引入了随机属性选择,这就使得最终集成的泛化性能可通过个体学习器之间差异度的增加而进一步提升 (样本扰动 + 属性扰动)
    • 具体来说,传统决策树在选择划分属性时是在当前结点的属性集合(假定有 d d d 个属性)中选择一个最优属性;而在 RF 中,对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含 k k k 个属性的子集,然后再从这个子集中选择一个最优属性用于划分
    • 这里的参数 k k k 控制了随机性的引入程度.若令 k = d k= d k=d, 则基决策树的构建与传统决策树相同,若令 k = 1 k =1 k=1, 则是随机选择一个属性用于划分, 一般情况下,推荐值 k = log ⁡ 2 d k = \log_2 d k=log2d

  • 值得一提的是,随机森林的训练效率常优于 Bagging, 因为在个体决策树的构建过程中,Bagging 使用的是 “确定型 ” 决策树,在选择划分属性时要对结点的所有属性进行考察,而随机森林使用的 “随机型” 决策树则只需考察一个属性子集

结合策略

  • 学习器结合可能会从三个方面带来好处:
    • 首先,从统 的方面来看,由于学习任务的假设空间往往很大,可能有多个假设在训练集上达到同等性能,此时若使用单学习器可能因误选而导致泛化性能不佳,结合多个学习器则会减小这一风险
    • 第二,从计算的方面来看,学习算法往往会陷入局部极小,有的局部极小点所对应的泛化性能可能很槽糕,而通过多次运行之后进行结合,可降低陷入糟糕局部极小点的风险
    • 第三,从表示的方面来看,某些学习任务的真实假设可能不在当前学习算法所考虑的假设空间中,此时若使用单学习器则肯定无效,而通过结合多个学习器,由于相应的假设空间有所扩大, 有可能学得更好的近似

假定集成包含 T T T 个基学习器 { h 1 , . . . , h T } \{h_1,...,h_T\} { h1,...,hT},其中 h i h_i hi 在示例 x x x 上的输出为 h i ( x ) h_i(x) hi(x)

平均法 (averaging)

  • 适用于数值型输出 h i ( x ) ∈ R h_i(x)\in\R hi(x)R

  • 简单平均法 (simple averaging)
  • 加权平均法 (weighted averaging)
    通常要求 w i ≥ 0 w_i\geq0 wi0 ∑ i = 1 T w i = 1 \sum_{i=1}^Tw_i=1 i=1Twi=1
    • 对给定的基学习器,不同的集成学习方法可视为通过不同的方式来确定加权平均法中的基学习器权重
  • 加权平均法的权重一般是从训练数据中学习而得 (例如估计出个体学习器的误差,然后令权重大小与误差大小成反比.),现实任务中的训练样本通常不充分或存在噪声,这将使得学出的权重不完全可靠.尤其是对规模比较大的集成来说,要学习的权重比较多,较容易导致过拟合. 因此,实验和应用均显示出,加权平均法未必一定优于简单平均法.
    • 一般而言,在个体学习器性能相差较大时宜使用加权平均法,而在个体学习器性能相近时宜使用简单平均法

投票法 (voting)

  • 适用于分类任务
    • 为便于讨论,我们将 h i h_i hi 在样本 x x x 上的预测输出表示为一个 N N N 维向量 ( h i 1 ( x ) ; . . . ; h i N ( x ) ) (h_i^1(x);...;h_i^N(x)) (hi1(x);...;hiN(x)), 其中 h i j ( x ) h_i^j(x) hij(x) h i h_i hi 在类别标记 c j c_j cj 上的输出

  • 绝对多数投票法 (majority voting)
    即若某标记得票过半数,则预测为该标记;否则拒绝预测

若学习任务要求必须提供预测结果,则绝对多数投票法将退化为相对多数投票法.因此,在不允许拒绝预测的任务中,绝对多数、相对多数投票法统称为“多数投票法".

  • 相对多数投票法 (plurality voting)
    即预测为得票最多的标记,若同时有多个标记获最高票,则从中随机选取一个
  • 加权投票法 (weighted voting)
    通常要求 w i ≥ 0 w_i\geq0 wi0 ∑ i = 1 T w i = 1 \sum_{i=1}^Tw_i=1 i=1Twi=1

  • Note: 不同类型个体学习器可能产生不同类型的 h i j ( x ) h_i^j(x) hij(x) 值,常见的有:
    • 硬投票 (hard voting) h i j ( x ) ∈ { 0 , 1 } h_i^j(x)\in\{0,1\} hij(x){ 0,1}
    • 软投票 (soft voting): h i j ( x ) ∈ [ 0 , 1 ] h_i^j(x)\in[0,1] hij(x)[0,1], 相当于对后验概率 P ( c j ∣ x ) P(c_j|x) P(cjx) 的一个估计
  • 不同类型的 h i j ( x ) h_i^j(x) hij(x) 值不能混用. 同时,若基学习器的类型不同则其类概率值不能直接进行比较;在此种情形下,通常可将类概率输出转化为类标记输出,然后再投票
  • 有趣的是,虽然分类器估计出的类概率值一般都不太准确,但基于类概率进行结合却往往比直接基于类标记进行结合性能更好

学习法: Stacking

  • 训练数据很多时,一种更为强大的结合策略是使用 “学习法” ,即通过另一个学习器来进行结合. 这里我们把个体学习器称为初级学习器,用于结合的学习器称为次级学习器元学习器(meta-learner).
    • Stacking 是学习法的典型代表

Stacking 算法

  • Stacking 先从初始数据集训练出初级学习器,然后"生成"一个新数据集用于训练次级学习器. 在这个新数据集中,初级学习器的输出被当作样例输入特征,而初始样本的标记仍被当作样例标记

生成次级学习器的训练数据

  • 在训练阶段次级训练集是利用初级学习器产生的,若直接用初级学习器的训练集来产生次级训练集,则过拟合风险会比较大;因此,一般是通过使用交叉验证留一法这样的方式,用训练初级学习器未使用的样本来产生次级学习器的训练样本
    • k k k 折交叉验证为例,首先划分出初始训练集 D D D ( m m m 个训练数据) 与初始测试集 T T T ( n n n 个测试数据)
    • 初始训练集 D D D 被随机划分为 k k k 个大小相似的集合 D 1 , . . . , D k D_1, ... , D_k D1,...,Dk. 令 D j D_j Dj D ‾ j = D \ D j \overline D_j= D\backslash D_j Dj=D\Dj 分别表示第 j j j 折的测试集和训练集. 给定 T T T 个初级学习算法,初级学习器 h t ( j ) h_t^{(j)} ht(j) 通过在 D ‾ j \overline D_j Dj 上使用第 t t t 个学习算法而得.对 D j D_j Dj 中每个样本 x i x_i xi,令 z i t = h t ( i ) ( x i ) z_{it}=h_t^{(i)}(x_i) zit=ht(i)(xi),则由 x i x_i xi 所产生的次级训练样例的示例部分为 z i = ( z i 1 ; . . . ; z i T ) z_i=(z_{i1};...;z_{iT}) zi=(zi1;...;ziT),标记部分为 y i y_i yi. 也就是说,由第 j j j 折的测试集生成了次级学习器的一部分训练样本 (共 m / k m/k m/k 个,也就是下图中一个橙色的小块);同时用训练好的 T T T 个初级学习器对初始测试集进行预测,生成一个次级测试集 (共 n n n 个,也就是下图中一个绿色的块)
    • 于是,在整个交叉验证过程结束后,从这 T T T 个初级学习器产生的次级训练集 D ′ = { ( z i , y i ) } i = 1 m D'= \{ (z_i, y_i)\}_{i=1}^m D={ (zi,yi)}i=1m, 然后 D ′ D' D 将用于训练次级学习器;同时可以得到 k k k 个次级测试集,对它们取平均之后就得到了最后的次级测试集

多样性

  • to be continued…

转载:https://blog.csdn.net/weixin_42437114/article/details/116379808
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场