目录
1.前言
2.涉及的知识
2.1提升(boosting)
2.2加法模型(additive model)
2.3前向分布算法(forward stagewise algorithm)
3.Adaboost算法
3.1算法思想
3.2算法步骤
3.3Adaboost算法的迭代更新
4.GBDT算法
4.1算法思想
4.2提升树(Boosting Tree)
4.3GBDT的流程
4.3.1算法流程:
4.3.2GBDT一些要注意的点
Adaboost和GBDT是机器学习里面两个很重要的算法,他们是集成方法(ensemble learning)中提升(boosting)的两个算法。本篇博客就讲讲对这两个算法的一些理解。
提升是一个迭代的过程,用来自适应地改变训练样本的分布,使基分类器都聚焦再那些很难分的样本上。如下图所示,通俗的讲就是我们同样是训练多个不一样的基模型,我们训练一个基模型使根据上一次的基模型的性能进行调整,每一次更新调整就是一次提升。最终我们也得到很多个基模型,我们对这些基模型再统一起来集成成我们最终的预测模型。
Boosting算法在最终的分类器集成中用的一种方法就是进行加法,加法模型
其中,是基函数,
是基函数的参数,
为基函数的系数。
我们在集成的最终一步中,要对所有的基分类器进行一个集成,而我们得到的最终的分类器也是要最优的,也就是将损失函数极小化。我们不难发现,我们当要对最终的加法模型进行损失函数极小化的话,是一个十分复杂的优化问题,因为涉及了很多个模型的参数,对这些参数而言都将损失函数最小化。
前向分算法的思想就是:因为我们学习的是加法模型,那么我们在每一次模型的组合(加法)中都进行模型的最优化,也就是再每次迭代过程产生新模型的时候,都考虑极小化损失函数,通过这个目标来学习一个新模型,这样我们的优化问题就简化了很多,变成了对某一个分类器进行极小化的优化,考虑的参数也只是某个模型的参数。我们通过这样,从前向后逐步逼近优化目标函数,达到优化的效果。
Adaboost算法是Adaptive boosting的缩写,意思为自适应的提升算法。他相比起另一种集成学习方法装袋(bagging)来说,它是给每一个训练样本负一个权值,而且可以在每一轮的提升过程结束时自动调整样本的权值。通过调整样本的权值,我们可以根据权值用作抽样分布,也可以使用权值学习有利于高权值样本的模型。
Adaboost算法就是通过赋予样本权值,同时权值都随分类器对样本的效果进行调整以达到最好的效果。这个调整的宗旨就是:增加被错误分类的样本的权值,而减少被正确分类的样本的权值。迫使分类器再随后迭代中关注那些很难分类的样本。
Adaboost是一个以加法模型为模型,以指数函数为损失函数,以前向分布算法为学习模型的二类分类学习方法。
具体来说,Adaboost算法分为三个步骤:
1.先将所有的样本都赋予相同的权值1/N,从而使得他们被选作训练的可能性都一样。
2.训练弱分类器。具体训练过程中,如果某个样本点已经被准确的分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确的分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代的进行下去。
3.在训练出有多个弱分类器后,将弱分类器组合成强分类器,在这里同样要对不同分类器加一个权值,以表示在集成中分类器的影响力。我们通过加大错误率小的分类器的权值,降低错误率高的分类器的权值,使得分类函数更受错误率小的分类器的影响。
在Adaboost算法中,我们使用错误率和重要性来描述某个分类器的好坏。
假设现在我们对N个抽样的样本进行训练学习,得到一个新的弱分类器C。
1.这个弱分类器的错误率为:
可以看出错误率是对这个弱分类器的训练样本的的加权误差。
2.我们利用错误率计算到弱分类器C的重要性:
这里的重要性是随着错误率的升高而降低的。
3.根据弱分类器的重要性以及参与学习的训练样本的预测结果是否正确,来更新这些训练样本的权值。
当样本预测正确时,要缩小样本权值,给样本乘上一个小于1的数;同样当样本预测错误时,要扩大样本权值,给样本乘上一个大于1的数。
GBDT算法是Gradient Boosting Decision Tree的缩写,中文也叫梯度提升决策树。在集成学习方法里面,GBDT就是以决策树作为基分类器的提升集成方法。而在提升树(Boosting Tree)里面,GBDT也是使用梯度提升来最优化损失函数的一种方法。GBDT是一种以加法模型为模型,以向前分布算法为学习模型的算法。
提升树模型是采用加法模型和前向分布算法,以决策树为基模型的提升方法叫做提升树。提升树的加法模型是:
其中的M是提升的次数,θm就是第m个树分类器的参数(在回归树中,树的参数是指每个叶子结点的回归值)。
提升树使用以下前向分布算法:
在提升树中,用拟合残差学习新的模型,意思是将前一个弱模型得到的残差(每个样本的实际值和这个模型的拟合值的差值)作为新模型的训练数据,残差用r表示。
在提升树模型中,每次我们迭代更新都要找到上一个模型的拟合残差,再用这个拟合残差来优化我们的损失函数,进而训练学习出我们的新模型。当损失函数是平方损失和指数损失函数时,每一步的优化时很简单的。但可能会碰到一些一般的损失函数,这时候优化就很难了(意思是,我们对特殊的损失函数优化来说,可以得出的结论是我们用拟合残差就可以优化损失函数;那么普及到一般情况的损失函数,我们的优化结论却很难得出,也就是这个损失函数的残差很难找出)。
针对这问题,有人就提出来用损失函数的负梯度在当前模型的值作为回归提升树中的残差近似值,来拟合这个回归树:
(1).初始化:
(其中L函数是损失函数,一开始初始化的模型是要使损失函数最小)
(2).对m = , 2 , 3 , ... , J,计算
(a).对每一个样本计算残差(在GBDT中用负梯度代替残差,同时指的是上一个弱模型上的梯度)
(b).利用每个样本的残差来训练拟合一个新的回归树,得到第m棵树的叶节点Rmj。(这里注意,此时用拟合残差来训练学习一个新的模型,这里仅仅是划分了叶节点,但是每个叶节点上的回归值并未计算!!!!)
(c).得到了回归树和每个叶子结点,也将每个样本归类到对应叶子中,此时再利用每个叶子的样本计算回归值:
在回归树中计算叶子的回归值,本来是要解损失函数的最优化问题。但是由证明可以知道,当回归树的损失函数是平方损失时,叶节点的最佳值时(样本的均值,也就是残差的均值);当回归树的损失函数是绝对损失时,叶节点的最佳值是(样本中位数,也就是残差中位数),在这里也体现了GBDT中,利用残差来最小化损失函数的思路。
(d).更新新一个模型:
(其中函数I中,当传入x被归到Rmj叶子中,那么I = 1;否则为0)
(3).得到回归树
1.GBDT是提升树,在提升树中都是不断通过更新新一个模型的参数来训练出一个新的模型(回归树模型中的参数就是每个叶子结点的回归值),同时也是用拟合残差来优化损失函数。
2.在GBDT中的梯度体现在,本来提升树算法用拟合残差的方法来优化损失函数,进而迭代更新模型。而考虑到对一般的提升树损失函数来说,拟合残差比较难计算出来,就提出用旧模型基础上得出的负梯度来当作残差的近似值。
3.在训练学习新的模型之前,先求出上一个模型的残差(已经用了负梯度来代替,其实就是负梯度),再把残差当作样本的实际值来进行训练模型。首先得到的回归树模型中,仅仅只是将样本分类到回归树的叶子结点中,但是叶子结点的回归值并未计算。
4.我们GBDT进行损失函数优化的这一步骤就体现在计算叶子结点的回归值,为什么前面说的是用拟合残差来优化呢?因为在计算叶子结点的回归值时,我们用的是(本叶子节点样本的均值或者中位数,其实就是残差的均值或者中位数)进行计算的,就可以说用的是残差来优化。