Boost(提升)方法不同于bagging,基分类器是顺序训练的,每个基分类器使⽤数据集的⼀个加权形式进⾏训练,其中与每个数据点相关联的权系数依赖于前⼀个分类器的表现。特别地,被⼀个基分类器误分类的点在训练序列中的下⼀个分类器时会被赋予更⾼的权重。⼀旦所有的分类器都训练完毕,那么它们的预测就会通过加权投票的⽅法进⾏组合。
1. AdaBoost
假设我们在对一组数据进行分类的时候,
- 确定一个分类模型;
- 重点观察出现分类错误的数据,产生新的模型,与原模型组合以改进模型;
- 重复上述过程。
把这种思想运用到机器学习算法的设计中时,就是AdaBoost算法。那么有两个问题需要回答:
- 如何“重点”观察出现错误分类的数据
- 如何将模型组合起来
AdaBoost采用的是:
- 提高那些前一轮中被分类器错误分类样本的权值,降低那些被正确分类样本的权值;
- 采用加权多数表决的方法,即加大分类错误率低的分类器的权值,减小分错错误率高的分类器的权值。
1.1 如何确定下一轮中数据的权重?
假设第t轮,数据权重是
我们定义参数
根据
1.2 如何确定每个分类器的权重?
对于
错误率越小的分类器,权重越大。很自然地,我们假设
- 对于非常差的分类器(随机猜测),
ϵt=12,Δ=1 ,那么我们希望其权重αt=0 ; - 对于非常好的分类器,
ϵt=0,Δ=∞ ,我们希望其权重αt=∞ 。
我们选择
1.3 完整的AdaBoost
1.4 AdaBoost的性能
原作者有证明只需要logN次迭代,就可以令
根据AdaBoost中α的定义,我们知道将多个强学习算法(错误率很低)或者(强学习算法+多个弱学习算法)进行AdaBoost,并不会得到很好的结果,因为强学习算法的权重非常大。
2. 提升树
决策树+Boosting=提升树。
决策树+Bagging=随机森林。
提升树有几个问题需要解决:
- 我们已经有DTree(D)算法。如何在不更改此算法的基础上,使用带有权重的数据集?
- DTree可以做到
Ein≈0 ,此时α等于无穷大,很明显不能用于Boosting方法,如何解决?
对于第一个问题,我们可以使用按权重抽样的方法新形成一个数据集:
对于第二个问题,我们可以采用剪枝、只使用部分数据集训练等方式,来增大DTree的
对于剪枝问题,当我们限制树的高度为1的时候,基分类器就变成了decision stump。
3. 从最小化损失函数的观点来看AdaBoost
3.1 准备工作
将之前的
3.2 前向分步算法
我们知道
通常这是一个复杂的优化问题,而前向分步算法求解这一优化问题的思路是:因为学习的是加法模型,如果能够从前到后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数,那么就可以简化优化复杂度,具体地,对于第t步,优化如下损失函数:
3.3 AdaBoost的损失函数
可以将模型公式类比于SVM:
那么我们假设损失函数为指数函数,即:
3.4 求解
根据前向分步算法,每次迭代之针对一个基函数和系数:
对于第t步:
(图片说明;图片中η就是我们要求的α)
很明显地。AdaBoost算法中的基分类器跟上述求解过程最终结果是一样的。
现在已经求得了基函数,如何求解α?
也即:AdaBoost算法是前向分步算法的特例,其损失函数为指数函数。
4. Gradient Boosting
上面我们使用最小化损失函数的思想,采用前向分步算法求解来重新解释了AdaBoost算法。其中借助了损失函数是指数函数这一假设。
现在我们来在更加抽象的层次上考虑问题:
如何求解?类比于前文中提到的梯度下降法,我们也采用同样的方式来解析,第t次迭代有:
令
现在变成了单参数问题,我们可以求解最优化的η,令
具体细节如下: