集成学习——Boosting(GBDT,Adaboost,XGBoost)

集成学习中还有一个重要的类别是Boosting,这个是基学习器具备较强依赖串行而成的算法,目前主流的主要有三个算法:GBDT,Adaboost,XGBoosthtml

这个连接能够看看:https://www.cnblogs.com/willnote/p/6801496.html算法

不一样点:机器学习

一、adaboost使用的是指数损失(其实也可使用别的损失函数,不过指数损失比较好解释),直接偏导数等于0(直接让损失函数变最小)来求得样本还有决策树的权重,函数

而gbdt和xgboost用得都是梯度降低算法,其中gbdt在分类的模型上用得是对数损失,由于分类不可导,只能使用指数或者对数损失,若是使用指数损失,其实就有点变成adaboost了学习

二、gbdt实际上是泰勒一阶展开,而xgboost是二阶展开,因此收敛速度更快优化

boosting算法的原理以下:spa

 

一、GBDT

gbdt和xgboost其实都是回归树!!!由于都用到了导数的性质,因此输出值都不能是0,1  必需要几率形式,否则不可导。几率形式在转成0,13d

1、原理

 

解释:咱们机器学习的目的都是为了让损失函数取得最小,这里损失函数能够是不少种,好比平方和损失,绝对值损失,指数对数损失等等,htm

一、假定咱们如今已经知道了咱们的损失函数blog

二、假定咱们GBDT产生的最终的F分类器是有许多个f加权获得的的

一、如今咱们给定初始的F0模型,这里能够直接给一个常数r让这个损失函数取最小,好比若是损失函数是平方损失,那么r就是均值,若是是绝对值损失函数,那么r就是中位数,

若是是什么别的损失函数,反正是有一个固定常数让他最小

二、给定F0以后咱们想要推下一个F1,前面咱们假设了是由前m-1个模型在家第m个分类器以后成为最终的F的,因此咱们这里须要求得咱们选择哪一个f可以使得咱们Fm-1与他相加后会使得损失函数最小呢

也就是咱们要取什么让损失函数最小,那这个f就是咱们要的,而后获得这个f再加上前面的Fm-1就是咱们最终的模型(其实这里没什么用,就是说一下思想)

一、如今问题来了,怎么求这个f呢,咱们使用梯度降低算法来求,这里的梯度算法是这样的,纵坐标是损失函数值,横坐标是tree,咱们要作的梯度是随着树的增长,损失函数变小

二、因此咱们就把当前截止已经造成的Fm-1模型沿着他的损失函数负梯度方面进行计算来获得最终的Fm模型

 

2、步骤

1)回归算法

一、首先初始化第一个弱学习器:,这里必定存在一个参数C使得这个损失函数最小,前面说过

二、从第t轮开始,t=1,2,3,4.。。t:

  ,这里咱们须要计算每一个样本应该如何沿着负梯度方向变化才可以使得这个模型提高

  

这个意思其实就是:咱们拿到每一个样本应该变化多少了,如今咱们创建一个树来预测这个应该变化多少,预测值加入到前面t-1轮造成的模型中,获得t轮的最终模型

三、这个时候再把t轮的模型拿来预测,预测值假设是f(t),再计算这个预测值与实际值的误差(仍是按照损失函数负梯度公式来作),差值再作模型创建,再加上原来t轮造成的模型中,获得ft+1轮 

这里解释一下:咱们想要沿着损失函数负梯度方向发展,因此你就要知道想获得这样的损失函数,你每一个样本应该怎么样变化,也就是每一个样本还差多少才可以让损失是沿着负梯度方向发展的,因此咱们才要把每一个样本的偏差值拿来作预测,若是恰好预测全对,也就是须要误差的量咱们预测全对,那么原来的f0加上咱们这一轮预测的偏差量就会使得样本预测所有正确。理解这段话很是关键!!!

2)分类算法

 

3、正则化

一、一种是跟adaboost同样,对于弱学习器增长一个步长v

二、

第二种正则化的方式是经过子采样比例(subsample)。取值为(0,1]。注意这里的子采样和随机森林不同,随机森林使用的是放回抽样,而这里是不放回抽样。若是取值为1,则所有样本都使用,等于没有使用子采样。若是取值小于1,则只有一部分样本会去作GBDT的决策树拟合。选择小于1的比例能够减小方差,即防止过拟合,可是会增长样本拟合的误差,所以取值不能过低。推荐在[0.5, 0.8]之间。

使用了子采样的GBDT有时也称做随机梯度提高树(Stochastic Gradient Boosting Tree, SGBT)。因为使用了子采样,程序能够经过采样分发到不一样的任务去作boosting的迭代过程,最后造成新树,从而减小弱学习器难以并行学习的弱点。

三、对于弱学习器即CART回归树进行正则化剪枝。

 

 

二、XGBoost

 XGBoost是GBDT的一个升级,gbdt使用泰勒一阶展开,而xgboost使用二阶

其中

 

三、Adaboost

 Adaboost的基本思想是这样的:

一、一开始全部的样本权重所有相等,训练处第一个基分类器,根据这个基分类器对样本进行划分

二、从第二轮开始针对前一轮的分类结果从新赋予样本权重,对于分类错误的样本权重加大,正确的样本权重减小。

三、以后根据新获得样本的权重指导本轮中的基分类器训练,即在考虑样本不一样权重的状况下获得本轮错误率最低的基分类器。重复以上步骤直至训练到约定的轮数结束,每一轮训练获得一个基分类器。

能够想象到,远离边界(超平面)的样本点老是分类正确,而分类边界附近的样本点老是有大几率被弱分类器(基分类器)分错,因此权值会变高,即边界附近的样本点会在分类时获得更多的重视。

 

步骤说明:

1)分类问题

一、对于全部的样本,咱们先赋予初始权重,分别都相等1/M

二、选择一个基分类器对样本进行分类,计算通过这个基分类器分类后的偏差率,其中w为样本权重,这个函数表示若预测值与实际值不一致返回1,不然返回0

通过以上的计算,就会计算出全部分类错的样本的偏差率

三、计算这个基学习器的权重系数:,这个公式说明:若是偏差率ek越小,那么越大,那么log以后也越大,所以这个系数ak也越大,这说明若是偏差率越小,学习期的系数权重越大(注意跟下面的样本系数不同啊!!!)

四、更新样本的权重,把错分的权重加大,正确的权重减少其中ZK是规范化因子

这里先解释第一个公式,也就是权重公式:ex函数图像能够去百度一下,是一个过0,1点的递增函数,也就是若是分类错误,那么yi*Gk(xi)就不是同号就<0,那么这个就会比较大,大于1,也就是原来的权重基础上乘以一个比1大的数字,调大了这个权重,同理,若是分类正确就会调小,也就是,若是分错了,偏差率变大了,样本权重变大(记住跟系数权重不同啊!!!)

第二个公式是规范化因子,由于若是不除以这个因子,会致使权重总和不等于1,除掉这个因子以后全部权重加起来又等于1了

五、根据不一样权重的样本在作第二个基分类器,一样计算权重,一直轮

六、最后经过训练出来的K个分类器进行决策:

 

2)回归问题

回归问题不一样的是偏差率的计算:

一、对于全部的样本,咱们先赋予初始权重,分别都相等1/M

二、选择一个基学习期进行学习,获得第一个模型

首先计算最大偏差:,接着计算每一个样本的相对偏差,每一个样本的相对偏差加权求和获得这个基学习器的偏差率ek

注意:

一样根据偏差率更新基学习器权重,再更新样本权重:其中Z也是规范化因子

这里的公式这么理解:若是这个样本的偏差率比较大,那么就会比较小,因为ak是一个小于1的数,因此这个就会比较大,同时样本权重就加大了,

三、最后也是经过训练出来的K个分类器进行决策:

 

损失函数优化:

前面咱们只是介绍了计算权重、系数的公式,没有解释缘由,如下推导这个公式产生的缘由

Adaboost是模型为加法模型,学习算法为前向分步学习算法,损失函数为指数函数的分类问题。

加法模型很好理解:由于咱们最终决策是根据这K个决策树相加来作决策的

前向分步学习也很好理解:由于t+1轮学习期是根据t轮学习期的结果进行的

损失函数为指数函数:真是难理解这里

定义损失函数为:

这里这样理解:若是yi与预测值f(x)一致,那么想成是>0,那么指数就会比较小,比1小;若是yi与预测值f(x)不一致,那么想成是<0,加个负号大于0,指数就变大大于1,把全部的样本的这个指数值累加,若是可以取最小,说明都分类对了嘛,因此这个是他的损失函数,完美!!!

因为咱们前面了解到了,,因此代入获得

因此损失函数再变化成下面的样子

而后下面重点来了:

这个能够分红yi=G(x)和yi不等于G(x)两部分相加,觉得等因而1,不等因而-1,因此化简成那样

这里从1到2,先把这个看做是总的减去yi不等于G(I)的,而后再跟后面的合并

不等于那一部分提取出来,加上后面的这个是总的,接下来就能够求导了,咱们对a求导获得

而后代入最后获得a的计算公式,这个就解释了前面为何用这个公式,

最后想说真是太他么难了!!

 

 

 Adaboost算法正则化:

对于Adaboost算法咱们也能够加入正则化,其实就是加在每一个基分类器前面

相关文章
相关标签/搜索