【机器学习】集成学习方法:Bagging(随机森林)+Boosting(AdaBoost)

产生背景:一般的机器学习算法都是“单打独斗”,影响其性能(尤其是泛化性)的因素有很多,比如训练集中样本过少、样本分布不均匀等;除此以外,不同的机器学习方法也针对了不同类型的数据,但由于真实数据是未知的,它不一定也遵从训练集的数据分布,因此单兵作战的战斗力十分有限。

集成学习:集成学习是一种训练思路,而并非是具体的方法或者算法,思想是是将这些“单兵作战”的英雄组成团队,实现“3 个臭皮匠顶个诸葛亮”的效果。现实生活中,大家都知道“人多力量大”,而集成学习的核心思路就是“人多力量大”,它并没有创造出新的算法,而是把已有的算法进行结合,从而得到更好的效果。

集成学习会挑选一些简单的基础模型进行组装,组装这些基础模型的思路主要有 2 种方法:

  • bagging(bootstrap aggregating的缩写,也称作“套袋法”),它是并行集成学习方法
  • boosting,它是串行集成学习方法

集成学习根据分类依据的不同可以有不同的分类方式,比如并行串行、同构异构、带着这些概念来学习可以有一个更深入的理解,不需要死记硬背

Bagging

Bagging的核心思路就是民主:即所有模型一视同仁,使用投票方式得到最终结构或,每个基础模型手里都只有一票。

具体过程是:

  1. 从原始样本集中抽取训练集。

    每轮从原始样本集中使用 Bootstraping 的方法抽取n个训练样本(在训练集中,有些样本可能被多次抽取到,而有些样本可能一次都没有被抽中),共进行k轮抽取,得到k个训练集

  2. k个训练集上各自训练得到k个模型

    这k个模型并没有指定具体的分类或回归算法,可以根据具体问题采用不同的分类或回归方法,而根据采用的算法是否相同,由将继承学习分为两类:

    1. 异构(异质)集成:k个模型所采用的算法并不都相同
    2. 同构(同质)集成:k个模型所采用的算法都相同
  3. 对测试样本

    若是分类问题,则k个模型采用投票的方式得到分类结果

    若是回归问题,计算k个模型输出的均值作为最后的结果

到这里我们需要注意两个问题:

  • 什么是Bootstraping方法?

    自助采样法,和CART、随机森林的发明者是同一个人

    Bootstrap是一种在统计中通过样本估计总体的方法,又称自展法、自举法、自助法、靴带法 , 是统计学习中一种重采样(Resampling)技术,用来估计标准误差、置信区间和偏差,是现代统计学较为流行的一种统计方法,在小样本时效果很好

    在这里只需要知道Bagging中训练k个模型所使用的k个数据集是在总数据集上进行有放回抽样产生的即可

    参考【机器学习】Bootstrap详解

    训练k个模型的训练集采用有放回抽样(bootstrap)的原因就是这种抽样方法产生的样本子集能很好的反映总体的分布特性

  • 在得到结果是,各个模型的重要性是一样的,这一点与下文中介绍的boosting有所区别。

在 bagging 的方法中,最广为熟知的就是随机森林了:bagging + 决策树 = 随机森林

随机森林是一种由决策树构成的 同构 集成算法,属于Bagging(Bootstrap AGgregation 的简称) 方法。

随机森林是由很多决策树构成的,不同决策树之间没有关联,当我们进行分类任务时,新的输入样本进入,就让森林中的每一棵决策树分别进行判断和分类,每个决策树会得到一个自己的分类结果,决策树的分类结果中哪一个分类最多(即投票),那么随机森林就会把这个结果当做最终的结果。

之前的内容中我们已经知道了如何构建一棵决策树,在此基础上扩展一下就得到了构建随机森林的方法:

  1. 对于一个总体训练集 T = { x 1 , x 2 , ⋯   , x N } T=\{x_1,x_2,\cdots,x_N\} T={x1,x2,,xN},有放回的随机选择 n n n个样本, n < N nn<N,得到一个子训练集 T n T_n Tn,其中样本的特征个数为 d d d

  2. 建立决策树。对于每个节点,随机选出 k < d kk<d个特征作为候选属性,在 k k k个候选属性中选择最佳分裂属性进行分裂,递归得到一棵决策树,注意整个决策树形成过程中没有进行剪枝

    通常取 k = log ⁡ 2 d k=\log_2d k=log2d

    这里也可以使用所有的特征进行选择,随机的原因其实没有一个明确的说法,大概的思想就是这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能

  3. 重复1和2,建立大量决策树,组成随机森林

众多决策树构建好随机森林后,针对新来的测试样本,每棵决策树都会有一个投票结果,最终投票结果最多的类别,就是最终的模型预测结果。

综上,在构建随机森林时,需要做到两个方面:数据的随机性选取,以及待选特征的随机选取,来消除过拟合问题。这也是随机森林中随机二字的含义

最后简单说一下随机森林的优缺点:

  • 优点:

    1. 可以判断特征的重要程度、不用降维、很容易查看模型的输入特征的相对重要性(这些都来自于决策树的优点)

    2. 有足够多的树,最后投票产生结果,不容易过拟合

      (但是在某些噪音较大的分类或回归问题上会过拟合)

    3. 对于不平衡的数据集来说,它可以平衡误差

  • 缺点:

    1. 使用大量的树会使算法变得很慢,并且无法做到实时预测
    2. 随机森林是一种预测性建模工具,而不是一种描述性工具。也就是说,它并不能反映数据之间的关系

Boosting

不同于Bagging对模型的一视同仁,Boosting的核心思想是挑选精英,对基础模型不是一致对待的,而是经过不停的考验和筛选来挑选出“精英”,然后给精英更多的投票权,表现不好的基础模型则给较少的投票权,然后综合所有人的投票得到最终结果。

除此以外,Boosting的学习器之间存在强依赖关系,必须使用串行的方法去学习,而Bagging学习器之间不存在强依赖关系,因此可用并行的方式去学习。简单的说:

  • 对Bagging这样的并行集成学习方法,模型之间是相互独立的
  • 对Boosting这样的串行集成学习方法,模型之间具有相关性,如果第一个分类器分错了,第二个分类器要纠正第一个分类器的错误,Boosting实际上是个迭代学习的过程

Boosting的工作机制为:

  1. 从初始训练集 D D D中训练出一个基学习器 h h h
  2. D D D中的样本输入到基学习器 h h h中,此时会产生一些分类错误的样本,其余的是分类正确的样本
  3. 增大被误分样本的权重,减小被正确分类样本的权重,得到调整后的训练集 D ′ D' D
  4. D = D ′ D=D' D=D,重复123来训练下一个基学习器,使得先前基学习器做错的样本在后续的训练过程中受到更多关注
  5. 基学习器的数量达到自设的阈值时停止,然后将这些基学习器进行加权结合,错误率小的基学习器权重大,错误率大的基学习器权重小,这样做决策时,错误率小的基本学习器影响更大

【机器学习】集成学习方法:Bagging(随机森林)+Boosting(AdaBoost)_第1张图片

Boosting中的代表算法有两个:AdaBoost和XGBoost,主要来看AdaBoost

以下内容参考 AdaBoost算法超详细讲解

先对问题做一个定义:

  • 一组训练集共包含 N N N个训练样本 D = { x 1 , x 2 , ⋯   , x N } D=\{x_1,x_2,\cdots,x_N\} D={x1,x2,,xN},这些样本对应的输出类别分别是 { y 1 , y 2 , ⋯   , y N } \{y_1,y_2,\cdots,y_N\} {y1,y2,,yN}

  • 超参数 M M M表示基学习器的数量阈值,也就是我们最多迭代 M M M次,

    在迭代第 k k k次时会训练 k k k个基学习器 G i ( x ) , i = 1 , 2 , ⋯   , k G_i(x),i=1,2,\cdots,k Gi(x),i=1,2,,k输出结果为 + 1 +1 +1 − 1 -1 1来表示二分类的类别

    k k k个基学习器线性组合成强学习器 f k ( x ) = ∑ i = 1 k α i G i ( x ) f_k(x)=\sum_{i=1}^k\alpha_iG_i(x) fk(x)=i=1kαiGi(x)

    也就是说,最终我们得到的强学习器就是 f ( x ) = ∑ i = 1 M α i G i ( x ) f(x)=\sum_{i=1}^M\alpha_iG_i(x) f(x)=i=1MαiGi(x)

  • 初始化 N N N个样本在训练集中的权重 w 1 i = 1 N , i = 1 , 2 , ⋯   , N w_{1i}=\frac{1}{N},i=1,2,\cdots,N w1i=N1,i=1,2,,N,即初始权重相同,

    k k k轮迭代后各个样本在训练集中的权重为 D ( k ) = ( w k 1 , w k 2 , ⋯   , w k N ) D(k)=(w_{k1},w_{k2},\cdots,w_{kN}) D(k)=(wk1,wk2,,wkN)

再回顾一下我们要做什么:

  1. 要计算 D ( k ) = ( w k 1 , w k 2 , ⋯   , w k N ) D(k)=(w_{k1},w_{k2},\cdots,w_{kN}) D(k)=(wk1,wk2,,wkN),增大被误分样本的权重,减小被正确分类样本的权重,使得先前基学习器做错的样本在后续的训练过程中受到更多关注
  2. 要计算 f k ( x ) = ∑ i = 1 k α i G i ( x ) f_k(x)=\sum_{i=1}^k\alpha_iG_i(x) fk(x)=i=1kαiGi(x),对基学习器进行加权结合,错误率小的基学习器权重大,错误率大的基学习器权重小

下面我们考虑一次完整的迭代:

在第 k − 1 k-1 k1次迭代完成后,已经得到了 G 1 ( x ) G_1(x) G1(x) G k − 1 ( x ) G_{k-1}(x) Gk1(x)一共 k − 1 k-1 k1个基学习器,并将训练集中的权重调整为 D ( k ) = ( w k 1 , w k 2 , ⋯   , w k N ) D(k)=(w_{k1},w_{k2},\cdots,w_{kN}) D(k)=(wk1,wk2,,wkN)用以训练下一轮迭代时的基学习器,

现在我们考虑第 k k k次迭代,此时拥有训练集 D ( k ) D(k) D(k),用以训练基学习器 G k ( x ) G_k(x) Gk(x),训练完成后我们使用 G k G_{k} Gk N N N个样本进行分类,正确为0错误为1,求加权误差率

e k = ∑ i = 1 N w k i I ( G k ( x i ) ≠ y i ) e_{k}=\sum_{i=1}^{N}w_{ki}\mathcal{I}(G_{k}(x_i)\neq y_i) ek=i=1NwkiI(Gk(xi)=yi)

那么我们就可以求得 G k ( x ) G_k(x) Gk(x)的权重系数为:

α k = 1 2 log ⁡ 1 − e k e k \alpha_k=\frac{1}{2}\log\frac{1-e_k}{e_k} αk=21logek1ek

为什么这样计算弱学习器权重系数?

  • 首先我们考虑最终的模型表达式 f ( x ) = ∑ i = 1 M α i G i ( x ) f(x)=\sum_{i=1}^M\alpha_iG_i(x) f(x)=i=1MαiGi(x),可以看到这是一个加性模型(additive model)。我们希望这个模型在训练集上的误差最小,用一个损失函数 L L L来衡量模型在训练集上的误差:

    min ⁡ ∑ i = 1 N L ( y i , f ( x i ) ) = min ⁡ ∑ i = 1 N L ( y i , ∑ i = 1 M α i G i ( x i ) ) \min\sum_{i=1}^NL(y_i,f(x_i))=\min\sum_{i=1}^NL(y_i,\sum_{i=1}^M\alpha_iG_i(x_i)) mini=1NL(yi,f(xi))=mini=1NL(yi,i=1MαiGi(xi))

    这是一个非常难的优化问题,因为我们要求每一次迭代的得到的 α \alpha α G G G最终形成全局最优解,这让我想起来之前学组合优化(也叫运筹学)的时候学到的多阶段决策问题

    【机器学习】集成学习方法:Bagging(随机森林)+Boosting(AdaBoost)_第2张图片

    恍然大悟,这就是个动态规划问题,只需要每次迭代优化当前的目标:

    min ⁡ ∑ i = 1 N L ( y i , f k − 1 ( x i ) + α k G k ( x i ) ) \min\sum_{i=1}^NL(y_i,f_{k-1}(x_i)+\alpha_kG_k(x_i)) mini=1NL(yi,fk1(xi)+αkGk(xi))

    不断迭代,求得从 k = 1 k=1 k=1 k = M k=M k=M的所有所有基分类器及其权重,问题得到了解决

  • Adaboost使用 指数损失函数 L = e − y ⋅ f ( x ) L=e^{-y\cdot f(x)} L=eyf(x)来衡量模型在训练集上的误差,指数损失函数是分类任务原本0/1损失函数的一致(consistent)替代损失函数,由于指数损失函数有更好的数学性质,例如处处可微,所以我们用它替代0/1损失作为优化目标。

    由上一点的分析,我们得到某次迭代的损失:

    L o s s = ∑ i = 1 N L ( − y i f k ( x i ) ) = ∑ i = 1 N e − y i f k ( x i ) = ∑ i = 1 N e − y i ( f k − 1 ( x i ) + α k G k ( x i ) ) \begin{aligned}Loss&=\sum_{i=1}^NL(-y_if_k(x_i))\\&=\sum_{i=1}^Ne^{-y_if_k(x_i)}\\&=\sum_{i=1}^Ne^{-y_i\bigl(f_{k-1}(x_i)+\alpha_kG_k(x_i)\bigr)}\end{aligned} Loss=i=1NL(yifk(xi))=i=1Neyifk(xi)=i=1Neyi(fk1(xi)+αkGk(xi))

    我们要优化的是 α k \alpha_k αk G k G_k Gk y i y_i yi f k − 1 f_{k-1} fk1对第 k k k轮来说都是已知量,设 c i = e − y i f k − 1 ( x i ) c_i=e^{-y_if_{k-1}(x_i)} ci=eyifk1(xi),则可化简为:

    L o s s = ∑ i = 1 N c i e − y i α k G k ( x i ) Loss=\sum_{i=1}^Nc_ie^{-y_i\alpha_kG_k(x_i)} Loss=i=1NcieyiαkGk(xi)

    那么我们的优化目标就是 min ⁡ L o s s = min ⁡ ∑ i = 1 N c i e − y i α k G k ( x i ) \min Loss = \min \sum_{i=1}^Nc_ie^{-y_i\alpha_kG_k(x_i)} minLoss=mini=1NcieyiαkGk(xi),接下来就是求解上式的优化问题的最优解 α k ∗ \alpha_k^* αk G k ∗ G_k^* Gk

    首先求解 G k ∗ G_k^* Gk G k ∗ = arg ⁡ min ⁡ G k ∑ i = 1 N c i I ( y i ≠ G k ( x i ) ) G_k^*=\arg \min_{G_k}\sum_{i=1}^Nc_i\mathcal{I}(y_i\neq G_k(x_i)) Gk=argminGki=1NciI(yi=Gk(xi)),将指数函数换成指示函数是因为前面说的指数损失函数和0/1损失函数是一致等价的,而这也就是AdaBoost算法的基学习器的学习过程,即计算数据集的分类误差率

    然后求解 α k ∗ \alpha_k^* αk,将 G k ∗ G_k^* Gk代入 L o s s Loss Loss,对 α \alpha α进行求导,使其为0即可得到:

    α k = 1 2 log ⁡ 1 − e k e k \alpha_k=\frac{1}{2}\log\frac{1-e_k}{e_k} αk=21logek1ek 为什么能导成这样我看了半个小时也没看懂,暂且记住吧,其中 e k = ∑ i = 1 N c i I ( G k ( x i ) ≠ y i ) e_{k}=\sum_{i=1}^{N}c_i\mathcal{I}(G_{k}(x_i)\neq y_i) ek=i=1NciI(Gk(xi)=yi)

同时也就有了第 k k k次迭代后的强学习器为:

f k ( x ) = ∑ i = 1 k α i G i ( x ) = f k − 1 ( x ) + α k G k ( x ) f_{k}(x)=\sum_{i=1}^k\alpha_iG_i(x)=f_{k-1}(x)+\alpha_kG_k(x) fk(x)=i=1kαiGi(x)=fk1(x)+αkGk(x)

然后我们再更新样本权重,用以下一轮的迭代:

w ( k + 1 ) i = w k i e − α k y i G k ( x i ) ∑ i = 1 N w k i e − α k y i G k ( x i ) w_{(k+1)i}=\frac{w_{ki}e^{-\alpha_ky_iG_k(x_i)}}{\sum_{i=1}^Nw_{ki}e^{-\alpha_ky_iG_k(x_i)}} w(k+1)i=i=1NwkieαkyiGk(xi)wkieαkyiGk(xi),这里的分母相当于做归一化使总权重始终为1,得到 D ( k + 1 ) = { w ( k + 1 ) 1 , w ( k + 1 ) 2 , ⋯   , w ( k + 1 ) N } D(k+1)=\{w_{(k+1)1},w_{(k+1)2},\cdots,w_{(k+1)N}\} D(k+1)={w(k+1)1,w(k+1)2,,w(k+1)N}

w ( k + 1 ) i w_{(k+1)i} w(k+1)i的计算方式可以看出,若第 i i i个样本分类错误,则 y i ⋅ G k ( x i ) < 0 y_i\cdot G_k(x_i)<0 yiGk(xi)<0,导致样本的权重在第 k + 1 k+1 k+1次迭代的训练集 D ( k + 1 ) D(k+1) D(k+1)中增大,如果分类正确,则权重减小

在之前的推导中我们设 c ( k − 1 ) i = e − y i f k − 1 ( x i ) c_{(k-1)i}=e^{-y_if_{k-1}(x_i)} c(k1)i=eyifk1(xi),则 c k i = e − y i f k ( x i ) c_{ki}=e^{-y_if_{k}(x_i)} cki=eyifk(xi),又 f k ( x ) = f k − 1 ( x ) + α k G k ( x ) f_k(x)=f_{k-1}(x)+\alpha_kG_k(x) fk(x)=fk1(x)+αkGk(x),于是得到:

c k i = e − y i ( f k − 1 ( x i ) + α k G k ( x i ) ) = c ( k − 1 ) i e − y i α k G k ( x i ) c_{ki}=e^{-y_i(f_{k-1}(x_i)+\alpha_kG_k(x_i))}=c_{(k-1)i}e^{-y_i\alpha_kG_k(x_i)} cki=eyi(fk1(xi)+αkGk(xi))=c(k1)ieyiαkGk(xi)

对它进行归一化就得到了我们的权重更新式

至此,就完成了第 k k k次迭代,然后继续下一次的迭代直到 k = M k=M k=M停止即可


机器学习的内容暂且更新至此,机器学习中复杂的数学推导和优化方法需要有极强的功底,学习之路还很长,之后会先更新深度学习和计算机视觉专栏,越努力越幸运!

你可能感兴趣的:(机器学习,机器学习,集成学习,随机森林,人工智能)