zoukankan      html  css  js  c++  java
  • Adaboost算法推导

      Adaboost(Adaptive boosting)是boosting(提升)家族的重要算法。boosting家族算法的核心是串行训练学习器,可以理解为"站在巨人的肩膀",后一个学习器的学习是基于前一个学习器的学习基础之上的,对应的是bagging学习器,学习器之间没有依赖关系。

      把握住Adaboost算法核心是获取两个权重:一个是样本权重ω(仅用于构建模型阶段),一个是弱学习器参数α(用于构建模型阶段以及模型预测阶段)。

    Adaboost基本流程描述

      我们先来了解一下boosting的基本流程:

      先来过一下Adaboost学习的全流程:

      拥有数据集T={(x1, y1), (x2, y2), (x3, y3),... (xm, ym)};

      第一步:设置样本权重

      初始化样本权重(sample weight)D={ω11, ω12,...,ω1m}, ω1i = 1/m;权重之和=1,不仅仅是初始化,后面的标准化目的都是要保证ω之和为1;

      第二步:训练数据

      使用数据T训练模型,同时传入样本权重D,比如如果弱学习器采用的是决策树(Decision Tree),则是在调用fit(T, D)。

      第三步:计算学习器权重

      模型训练出来之后,需要计算一下该模型(学习器)的权重,为了计算权重首先计算一下错误率(统计所有的样本的):

      ωki这里代表的样本i(共有m个样本)在第k轮学习器训练中的权重,这里I(·)是一个指示函数,代表如果Gk(xi)≠yi,则I(·)值为1,反之为0;判断错误的样本的权重之和就是错误率;

      这里我曾经有困惑,既然Gk使用X训练出来的,就应该能够完全匹配啊;其实不然,决策树节点划分不是匹配,而是基于增益,那个特征值作为划分节点能够实现最大增益,就是有对的,有错的,但是选择A.a作为划分节点能够使得分类最为稳定(确定);其实即使是最终学习的结果,也还是每个叶子节点有有多种分类只不过概率不同而已,你在使用决策树的时候,预测有两个函数,一个是predict,返回概率最大的那个,predict_probability,返回定位的叶子节点的各个分类概率。所以这里既是是用训练样本训练出来的Gx,仍然会有一定错误率。

      下面的公式是用来计算学习器(Gk(x))的权重。

    αk = (1/2)log[(1 - ek)/ek]

      通过上面的公式我们可以知道ek越大,αk的值越小,即错误率越高的学习器,权重会比较小,这一点符合预期。如果我们在细分析一下,你会发现当ek = 0.5的时候(错误率是一半)是一个分界点,此时αk = 0;这意味着ek<=0.5,有αk >= 0。反之,如果ek>0.5(比较高的错误率),那么αk < 0。

      重回第一步:设置样本权重

      这里其实又回到了第一步,设置下一轮学习器的权重,只不过此时不再是第一步的取平均值,完成当前轮的学习之后要更新下一轮学习的样本权重,公式如下式所示:

      这里的Zk就是一个标准化因子,目的是让Σωk+1,i = 1,所以你可以看到Zk的项公式其实和ωk+1分子的形式是一模一样的。对于ωk+1,i是有两种结果(截图中m就是上图这个的k):

      分类正确 => ωk+1,i = ωk,i * exp(-αk) 以及 exp(-α) < 0 => 权重值减小;

      分类错误 => ωk+1,i = ωk,i * exp(αk) => 分类错误,权重增加。

      备注一下,yi和Gk(xi)返回的都是±1,所以相乘结果也是±1,同号(判断分类结果一直)则为1,异号(分类结果不一致)则为-1,这里分类结果是∈[-1, 1],和逻辑回归以及很多分类函数∈[0, 1]不一样,注意一一下。

      然后基于这个样本权重进行下轮学习和模型Gk+1(x)的构建。

      需要强调一下,boosting学习器里面获取重点是训练样本的权重,是的,每一个样本的权重;其实boosting里面的弱学习器之间并没有强弱之分,差别的本质在于他们所学的样本,虽然样本都是一套(所有的弱学习器都是同一套样本训练出来的,所以学习器本身没有优良之分),但是样本的权重却是不同的,对于决策树(adaboost的弱学习器一般选择决策树或者神经网络),在进行节点拆分,分析特征值的时候,都会使用特征值*权重之后来进行分析。

      adaboost是一个迭代算法,是通过多轮学习来构建模型;比如目标是训练出来K个学习器那么就需要学习K轮;

      最后一步:获取强学习器

      最后经过N轮学习之后,会收获N个弱学习器,最终模型如下:

      这里是二元分类的模型函数,最终根据函数的正负号来判断分类。其中αk是学习器的权重,Gk(x)则是学习器的(一颗决策树或者一个神经网络)。累加权重学习器的值,根据正负号来进行分类。

      弱学习器开始的时候因为样本*权重的分布问题,开始错误率将会非常高,但是后来随着权重不断的优化,权重样本的分布将会越来越合理,错误率将会越来越低。不过注意,作为adaboost的学习器,最终的结果是各个学习器结果*学习器权重之后来获取的,对于早期的学习器他们的权重αk值将会很低,后来随着错误率的减小,权重将会越来中。

    Adaboost原理 - αm的推导

      αm的推导要从理解Adaboost分类算法以及损失函数说起,可以用三个点来描述:

      1. 加法模型;

      2. 分步向前;

      2. 指数损失函数;

      第一个加法模型没有问题,因为我们的目标函数是弱学习器和权重乘积之和:

      第二个分步向前,每一轮的强学习器的结果的获取,都是基于之前累积的结果,数学表达如下:

      根据上面两个表达式,可以推知:

      第三个是损失函数为指数函数,有了前面两个作为基础,我们再来看一下Adaboost是如何基于损失函数形式来推导αm(弱学习器权重),这里强调一下这里推导的弱学习器的权重α是指指定的k轮的学习器Gk的权重,针对特定的学习器的权重:

     

      对于fk,基于分步向前推导,可以对其进行fk-1的变形:

     

      这里因为已经推倒到了k轮,所以fk-1和yi都是常量,所以我们把它简化设置为ω':

      我们首先来求解一下Gk(x):

    Gk(x) = argmin Σw' * I(yi ≠ f(xi))

      这个Gk公式说明了如果正确分类了yi*Gk(xi) = 1,否则yi*Gk(xi) = -1;这里解释一下,对于二元分类而言,yi = ±1,弱学习器比如决策树,Gk(xi) = ±1,所以yi*Gk(xi)一定是只能=±1。

      此时损失函数成为了两部分之和,一部分是弱学习器正确分类部分,另外一部分是错误分类部分。然后对其进行标准化,有:

      这一步的演化我花了很长时间才明白,注意上上式的Loss的Σ的范围是yi=Gm(xi)以及yi≠Gm(xi),到了上式取值范围扩充为了i=[1, N],其实两个式子是等价的,在i=[1, N]的范畴内,表达y=Gm(xi)的频率就是下式,其实是不是ω_hat并不重要,替换为1也是可以的(因为分子分母的数据sum的值是一样的,是累计的数量不同而已):

      但是这里有一个问题,为什么概率表现形式是它呢?如果是概率的话,应该就是错误的数量比上总数量即可啊。我觉得这个就是样本权重的意义,就是正常样本的权重是1,我们在计算概率的时候就是:数量/总数,但是对于赋予了权重之后,样本就不再是一个样本的概念,可能一个样本顶N个样本,或者不足一个样本。

      在i=[1, N]的范围内表达yi≠Gm(xi)与之类似:

      除此之外,你还会发现上式其实就是ek的表达式,那么上上式就是1-ek的表达式,也是Loss可以简化表达为:

      ek其实就是错误的概率或者说频率(即,N_error/N_total),然后对Loss的α求导(虽然外部是Σ,但是对于αk求导只会有一个式子包含αk):

      这里注意exp(-α)求导后变成了exp(α)(自然指数的导数还是其自身,但是符号将会被提取出来),Loss里面的(1 - ek)变成了(ek -1)。令导数 = 0,有

    ω = 0 或者(ek-1) * exp(αm) + ek * exp(αm) = 0

      这里注意exp(-α)求导后变成了exp(α)(自然指数的导数还是其自身,但是符号将会被提取出来),Loss里面的(1 - ek)变成了(ek -1)。

      继续,我们推到(ek - 1) * exp(αm) + ek * exp(αm) = 0,两边去对数(ln)有:

    Adaboost正则化

      原始公式如下:

    fk+1(x) = fk(x) + αkGk(x)

      添加正则项就是在最后一项增加系数v

    fk+1(x) = fk(x) + vαkGk(x),v∈[0, 1]

    Adaboost背后原理未知

      但是这里有一个问题,adaboost其实本质是通过改变样本的分布来提高弱学习器的分类能力;那么未来新的数据到来如果不符合历史的数据分布怎么办呢?那么预测的结果是不是会偏差比较大呢?Adaboost背后的原理还是需要深入搞清楚。

    参数设置(sklearn)

      弱学习器类型指定

      通过base_estimator,默认分类是CART分类树,回归是CART归回树;如果是其他需要注入如果算法指定了SAMME.R,这里指定的学习器需要支持概率预测。也就是模型(学习器)支持predict_proba函数。

      SAMME vs. SAMME.R

      SAMME和SAMME.R都是sklearn里面实现Adaboost的分类算法,默认SAMME.R,该算法采用的基于样本集的预测概率作为机器学习权重,这个和SAMME的基于样本集分类结果为基础来计算权重算法有不同,但是.R的方法计算速度会快一些,所以.R作为了默认的算法。在sklearn里面可以通过algorithm参数来指定相应的算法。

      弱学习器的数量

      通过n_estimator来进行指定(和随机森林里面要创建几棵树的参数名一样)。

    Adaboost的多分类

      Adaboost的多分类有M1和M2算法,M1算法是基于Adaboost的二元分类算法的,只是在模型函数(H(x))以及学习器权重公式(βt)以及样本权重公式(Dt)做了修改,使之适应多分类;M2算法基于M1,不过更加复杂;这里没有使用经典的softmax类型,以及oneOone等方式,可以在附录区看一下相应算法流程。

    Adaboost的回归算法

      Adaboost的回归算法种类比较多,但是其思想和分类是一样的,基本流程都是为样本权重赋值,训练弱学习器,计算学习器的权重,基于学习器的权重更新样本权重,在继续训练学习器,直到迭代结束。

      不同的地方在于因为他们损失函数以及错误率计算方式不一样,所以学习器的权重公式不同,另外就是最后获得模型组成也是和分类器不同。

      具体的可以参见参考中的刘建平博客连接,在介绍Adaboost的时候提到了回归的算法R2.

    附录

    对数性质

       Adaboost多分类算法

    参考:

    https://www.cnblogs.com/pinard/p/6133937.html 刘建平的adaboost说明

    https://www.cs.utexas.edu/~dpardoe/papers/ICML10.pdfAdaboost回归算法论文

    https://zhidao.baidu.com/question/365096902.html 指数取对数公式

     详细的手推过程

    https://www.cnblogs.com/ScorpioLu/p/8295990.html

    https://blog.csdn.net/weixin_38381682/article/details/81275905

    https://blog.csdn.net/v_july_v/article/details/40718799

     Adaboost的多分类

    https://blog.csdn.net/tyh70537/article/details/76675098

     

    Adaboost的回归算法Adaboost的回归算法种类比较多,但是其思想和分类是一样的,基本流程都是为样本权重赋值,训练弱学习器,计算学习器的权重,基于学习器的权重更新样本权重,在继续训练学习器,直到迭代结束。不同的地方在于因为他们损失函数以及错误率计算方式不一样,所以学习器的权重公式不同,另外就是最后获得模型组成也是和分类器不同。具体的可以参见参考中的刘建平博客连接,在介绍Adaboost的时候提到了回归的算法R2.

  • 相关阅读:
    孩孩,你妈正在生你。。。。。。。。
    想写点关于fpga以及软核nios2的入门文章
    源代码阅读工具SourceNavigator 在ubuntu 9.04下的安装与问题解决
    真理与知识
    需要思考的十对矛盾
    【Git】将已被推送到远程仓库的文件or文件夹,从远端删除
    明天是个大日子
    C# 编码规范
    Linux 登录 Mysql 数据库
    Linux Ubuntu 16.04 安装 .Net Core
  • 原文地址:https://www.cnblogs.com/xiashiwendao/p/12193734.html
Copyright © 2011-2022 走看看