《统计学习方法》第八章

1.1 提升方法(AdaBoost)

        boosting(提升方法)的主要思想就是改变训练样本的权重,学习多个分类器(弱可学习,强可学习),然后将这些分类器进行线性组合,从而提高分类的性能。

        下面会去研究AdaBoost的具体做法。然后通过训练误差分析去了解为什么AdaBoost可以提高学习进度。然后从前向分布算法去解释AdaBoost。最后再了解提升树(Boosting Tree)的具体做法。

        首先就是一些大前提背景:

        强学习和弱学习的区别就是正确率是否高,前者正确率高,后者正确率仅比随机猜测略好。

        并且强学习和弱学习是等价,也就是弱学习可以提升(boost)为强学习,那么怎么将弱学习变为强学习呢?

        方法就是从弱学习算法出发,反复学习,得到一系列的弱分类器(称为基本分类器),然后组合弱分类器,构成一个强分类器。

        多数的提升方法都是改变训练数据的概率分布,针对不同的训练数据分布调用弱学习算法一系列的弱分类器。

        所以总的来说,Boosting就两个问题需要搞清:一是每一轮如何改变训练数据的权值或概率分布,二十如何将弱分类器组合成一个强分类器。

        笼统地解决第一个问题就是:提高那些被前一轮弱分类器错误样本的权值,降低那些被正确分类样本的权值。这样的话错误的样本会得到更大的关注。

        第二个问题就是采取加权多数表决,加大分类误差率小的弱分类器的权值,使其在表决中起较大的作用,减小分类误差率大的弱分类器的权值,使其在表决中起较小的作用。

1.1.1 AdaBoost算法

        输入:训练数据集T={(x_1,x_2),(x_2,y_2),......,(x_N,y_N)}y_i\in Y=\left \{ +1,-1 \right \}

        输出:最终分类器G(x)

        (1)初始化训练数据的权值分布D_1(第一批权值)

D_1=(w_{11},...,w_{1i},...,w_{1N}), w_{1i}=\frac{1}{N}, i=1,2,...,N

        (2)假设我们的权值更新共有M轮,m=1,2,...,M

                (a)使用具有权值分布D_m的训练数据集学习,得到基本分类器:

G_m(x):X\rightarrow \left \{ -1,+1 \right \} :输入一个x,然后输出分类

                (b)计算当前次基本分类器G_m(x)在训练数据集上的分类误差率:

e_m=\sum^{N}_{i=1}P(G_m(x_i)\neq y_i)=\sum^{N}_{i=1}w_{mi}(G_m(x_i)\neq y_i)

上面这个公式的意思就是我们把错误样本的对应的权值给累计起来

                (c)然后计算对应G_m(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_iG_m(x_i)),i=1,2,...,N

                        再看第二个式子,可以看到下一代每一个样本的权值是和当前代的基本分类器对应        的权值\alpha_m有关,也和当前代的分类是否正确有关

                        这里的Z_m是规范化因子:

Z_m=\sum^{N}_{i=1}w_{mi}exp(-\alpha_my_iG_m(x_i))

                        观察这个规范化因子,就是当前所有样本的具体情况的一个总和,正是这个规范化因子,才使得具体每个权值更新的时候成为一个概率分布的存在

        (3)当我们拿到手上的基本分类器已经满足条件时,就可以把基本分类器给整合起来:

f(x)=\sum^M_{m=1}\alpha_mG_m(x)

                于是最终的分类器就是:

G(x)=sign\left ( \sum^M_{m=1}\alpha_mG_m(x) \right )

        具体例子可以看看书上P159页,直接看都看得懂,所以就不放出来了

1.2 AdaBoost算法的训练误差分析

        AdaBoost最基本的性质就是它能在学习过程中不断减少训练误差,下面就开看看怎么做到的

        书上提出了一个定理:

\frac{1}{N}\sum^N_{i=1}I(G(x_i)\neq y_i)\leq \frac{1}{N}\sum_i exp\left ( -y_if(x_i) \right )=\prod Z_m

        先看左边的不等式:

                第一项就是分类错误时候的概率,不一样就输出1,一样就输出0

                第二项我们看当分类错误的时候,y_if(x_i))< 0,故exp(-y_if(x_i))\geq 1,所以肯定是右边比左边大

        再看右边的等式:

                我们根据f(x)=\sum^M_{m=1}\alpha_mG_m(x)而代入左边的累加式:

                \frac{1}{N}\sum_i exp(-y_if(x_i))=\frac{1}{N}\sum_i exp(-\sum^M_{m=1}a_my_iG_m(x_i))

                然后根据w_{mi}exp(-\alpha_my_iG_m(x_i))=Z_mw_{m+1,i},代入上式,从而可以拗一个w出来,但是为什么是变成连乘,但还是没推出来。

               上式就等于:\sum_iw_{1i}\prod ^{M}_{m=1}exp(-\alpha_my_iG_m(x_i))=Z_1\sum_iw_{2i}\prod ^{M}_{m=2}exp(-\alpha_my_iG_m(x_i))=Z_1Z_2\sum_iw_{3i}\prod ^{M}_{m=2}exp(-\alpha_my_iG_m(x_i))=\prod ^M_{m=1}Z_m

                所以:假如我们选择合适的G_m的话,可以使得Z_m变小,也就是压低了上界,我任你怎么狂,反正上界就这么多,越来越少了,所以下降速度会越来越快。

                

                下面的二分类问题的AdaBoost的训练误差边界这里还没有看,关键就是连乘怎么变换过去的,最终可以得出AdaBoost的训练误差是以指数级别下降的。

1.3 前向分布算法

        首先了解加法模型:f(x)=\sum^M_{m=1}\beta _mb(x;\gamma _m)

        其中b(x;\gamma_m)作为基函数,\gamma_m为基函数的参数,\beta _m为基函数的系数

        在给定训练数据以及损失函数的条件下,学习加法模型称为经验风险极小化,也就是损失函数极小化的问题:

min(\sum^N_{i=1})L(y_i,\sum^N_{m=1} \beta_mb(x_i;\gamma_m))​​​​​​​

        我们可以看到学习加法模型里面,有可能会有很多参数在里面,如果一起学习,那么变量套多就很难快速地找到最优解,于是我们打算每一步之学习一个基函数及其系数,然后逐步逼近优化目标上式损失函数极小化函数

        具体流程:

        输入:训练数据集T=\left \{ \left ( x_1,y_1 \right),\left ( x_2,y_2 \right),...,\left ( x_N,y_N \right) \right \},损失函数L(y,f(x));基函数集\left \{ b(x;\gamma) \right \}

        输出:加法模型f(x)

        (1)初始化加法模型f_{0}(x)

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

                (a)极小化损失函数

(\beta_m,\gamma_m)=arg min\sum^N_{i=1}L(y_i, f_{m-1}(x_i)+\beta*b(x_i;\gamma))

                        我自己了解是在已有的函数基础上,再加上加法模型作为辅助,然后再去过一遍上述的极小化。最后我们会获得参数\beta_m,\gamma_m

                (b)更新我们的加法模型:

f_m(x)=f_{m-1}(x)+\beta_mb(x;\gamma_m)

        (3)得到加法模型:

f(x)=f_M(x)=\sum^{M}_{m=1}\beta_m*b(x;\gamma_m )

1.3.1 前向分步算法与AdaBoost的联系

        我们可以看到AdaBoost和前向分步算法是非常相似的,其实AdaBoost就是前向分步的特例,当模型是由基本分类器组成的加法模型,而损失函数就是指数函数。

        当基函数为基本分类器时,该加法模型等价于AdaBoost的最终分类器,从上面的两个算法的流程对比中,我们也发现更新流程都是一样的,下面就是证明损失函数是指数形式的了

L(y,f(x))=exp(-y*f(x))

        在迭代到第M轮的时候,我们的目标是使得前向分步算法得到的a_mG_m(x),使得f_m(x)在训练集T上的指数损失最小,观看上面的 1.3的(2)的(a),我们把这个最小化的损失函数的式子转化为这个:

(a_m(x),G_m(x))=argmin\sum^{N}_{i=1}exp(-y_i(f_{m-1}(x_i)+\alpha G(x_i)))

        又因为这个函数是一个关于\alpha_mG_m(x)的函数,于是可以换一个表达式:

(\alpha_m,G_m(x))=argmin\sum^{N}_{i=1}\bar{w}_{mi}exp\left [ -y_i\alpha G(x_i) \right ]

        其中,\bar{w}_{mi}=exp\left [ -y_if_{m-1}(x_i) \right ],现在就是求证最小化上式就等同于前面AdaBoost算法得到的\alpha_mG_m(x),现在我们将整个过程分开成两部,第一步就是先求出最小的G_m(x),其次再求最小的\alpha

        最小的G(x)的误差率是这么得到的呢,就是当前版本的分类正确率高:

G^{*}_m(x)=argmin\sum^N_{i=1}\bar{w}_{mi}I(y_i\neq G(x_i))

        然后就是求\alpha^{*}_m:书上这个变式我有点不太理解,后面为什么可以变成最终的式子

\sum^{N}_{i=1}\bar{w}_{mi}exp[-y_i \alpha G(x_i)]=\sum_{y_i=G_m(x_i)}\bar{w}_{mi}e^{-\alpha}+\sum_{y_i\neq G_m(x_i)}\bar{w}_{mi}e^{\alpha}=(e^{\alpha}-e^{-\alpha})\sum^N_{i=1}\bar{w}_{mi}I(y_i \neq G(x_i))+e^{-\alpha}\sum^{N}_{i=1}\bar{w}_{mi}

        大概看出来的是分两种情况讨论,一种是分对了,一种是分不对,但是最后的式子怎来有点搞不懂

        然后我们将上面得到的G^{*}_m(x)代入,并且对\alpha求导,让其等于0,最后可以得出最小值\alpha

        求导比较容易,代入化简然后取对数就好了,最后可以得到:

\alpha^{*}_m=\frac{1}{2}log \frac{1-e_m}{e_m}

        我们可以看到,最后是和AdaBoost等价的,唯一区别就是那个Zm,所以他们是等价的。

        具体的求导过程:

        字丑,如果出错了,麻烦大家指出更正。

1.3.2 提升树

        提升树就是以决策树为基函数的提升方法。

        对分类问题就是二叉分类树,对回归问题就是二叉回归树

        提升树模型可以表示为决策树的加法模型。多个决策树加在一起:

f_{M}(x)=\sum^{M}_{m=1}T(x;\theta_m)

T(x;\theta_m)表示决策树,\theta_m表示决策树的参数,M表示树的个数

        提升树也是采用前向分步算法:

f_m(x)=f_{m-1}(x)+T(x;\theta_m)

        假设f_{m-1}(x)就是当前模型,通过经验风险极小化确定下一颗决策树的参数\theta_m

\hat{\theta_m}=argmin\sum^{N}_{i=1}L(y_i;f_{m=1}(x_i)+T(x;\theta_m))                        

        我们可以发现提升树可以做很多事情,有用平方误差损失函数的回归问题,用指数损失函数的分类问题(前面证明了),以及用一般损失函数的一般决策问题。

        下面叙述回归问题的提升树:

         整棵树我们可以表示为:

T(x;\theta)=\sum^{J}_{j=1}c_jI(x\in R_j)

        其中,参数\theta=\left \{ (R_1,c_1),(R_2,c_2),...,(R_J,c_J) \right \}代表的是树的区域划分以及各个区域上的常输出的常数

        所以我们相当于把问题换成了求解参数\theta

\hat{\theta_m}=argmin\sum^{N}_{i=1}L(y_i,f_{m-1}(x_i)+T(x_i;\theta_m))

采用平方误差损失函数:L(y,f(x))=(y-f(x))^2

所以,对应的损失:L(y,f_{m=1}+T(x;\theta_m))=\left [ y-f_{m-1}(x)-T(x;\theta_m) \right ]^{2}=\left [ r-T(x;\theta_m) \right ]^{2}

        其中:r=y-f_{m-1}(x)表示的是当前模型拟合数据的残差

        残差的意思是,实际观察值与估计值(拟合值)之间的差,所以对于回归问题的提升树来说,只需要简单低拟合当前模型的残差。

        每一步我都计算当前模型的残差来取优化参数\theta,然后更新提升树,就是把子树怼进去,继续计算残差,从而优化出最好的模型,也就是把经验风险最小化的问题化解为残差问题。

        如果不理解的话,看一下书上P168的例子就很好理解了,很直观 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值