您的位置:首页 > 其它

机器学习(七):集成方法(2)Boost

2017-02-05 19:40 204 查看
Boost(提升)方法不同于bagging,基分类器是顺序训练的,每个基分类器使⽤数据集的⼀个加权形式进⾏训练,其中与每个数据点相关联的权系数依赖于前⼀个分类器的表现。特别地,被⼀个基分类器误分类的点在训练序列中的下⼀个分类器时会被赋予更⾼的权重。⼀旦所有的分类器都训练完毕,那么它们的预测就会通过加权投票的⽅法进⾏组合。

1. AdaBoost

假设我们在对一组数据进行分类的时候,

确定一个分类模型;

重点观察出现分类错误的数据,产生新的模型,与原模型组合以改进模型;

重复上述过程。

把这种思想运用到机器学习算法的设计中时,就是AdaBoost算法。那么有两个问题需要回答:

如何“重点”观察出现错误分类的数据

如何将模型组合起来

AdaBoost采用的是:

提高那些前一轮中被分类器错误分类样本的权值,降低那些被正确分类样本的权值;

采用加权多数表决的方法,即加大分类错误率低的分类器的权值,减小分错错误率高的分类器的权值。

1.1 如何确定下一轮中数据的权重?

假设第t轮,数据权重是w(i)t,这一轮中学习到的模型是gt,那么其错误率是:ϵt=∑mi=1w(i)tI(y(i)≠gt(x(i)))∑mi=1w(i)t

我们定义参数Δ=1−ϵtϵt−−−−−√则有,如果gt的分类效果比随机猜测要好,那么必然有ϵt<12,Δ>1,那么我们可以这样更新数据的权重:w(i)t+1←w(i)t⋅Δw(i)t+1←w(i)t/Δ

根据Δ的定义,上述过程必然是增大错误分类样本的权值,降低那些被正确分类样本的权值。

1.2 如何确定每个分类器的权重?

对于G(x)=sign(∑t=1Tαtgt(x))

错误率越小的分类器,权重越大。很自然地,我们假设αt=monotonic(Δt),那么应当选用什么样的单调递增函数呢?我们有这样的诉求:

对于非常差的分类器(随机猜测),ϵt=12,Δ=1,那么我们希望其权重αt=0;

对于非常好的分类器,ϵt=0,Δ=∞,我们希望其权重αt=∞。

我们选择αt=ln(Δ),完全符合上述条件。

1.3 完整的AdaBoost



1.4 AdaBoost的性能



原作者有证明只需要logN次迭代,就可以令Ein(G)=0,而当T=logN时,第二项也可以变得很小。

根据AdaBoost中α的定义,我们知道将多个强学习算法(错误率很低)或者(强学习算法+多个弱学习算法)进行AdaBoost,并不会得到很好的结果,因为强学习算法的权重非常大。

2. 提升树

决策树+Boosting=提升树。

决策树+Bagging=随机森林。

提升树有几个问题需要解决:

我们已经有DTree(D)算法。如何在不更改此算法的基础上,使用带有权重的数据集?

DTree可以做到Ein≈0,此时α等于无穷大,很明显不能用于Boosting方法,如何解决?

对于第一个问题,我们可以使用按权重抽样的方法新形成一个数据集:



对于第二个问题,我们可以采用剪枝、只使用部分数据集训练等方式,来增大DTree的Ein



对于剪枝问题,当我们限制树的高度为1的时候,基分类器就变成了decision stump。

3. 从最小化损失函数的观点来看AdaBoost

3.1 准备工作

将之前的w(i)t和w(i)t+1的关系作一下化简:w(i)t+1=w(i)t⋅Δ−y(i)gt(x(i))=w(i)t⋅exp(−y(i)αtgt(x(i)))

w(i)T+1=w(i)1⋅∏t=1Texp(−y(i)αtgt(x(i)))=1Nexp(−y(i)∑t=1Tαtgt(x(i)))

3.2 前向分步算法

我们知道G(x(i))=sign(∑t=1Tαtgt(x(i)))我们用g(x,θt)来表示gt(x),其中θ是基函数的参数。那么其损失函数极小化问题为:minαt,θt∑i=1mL(y(i),∑t=1Tαtg(x(i),θt))

通常这是一个复杂的优化问题,而前向分步算法求解这一优化问题的思路是:因为学习的是加法模型,如果能够从前到后,每一步只学习一个基函数及其系数,逐步逼近优化目标函数,那么就可以简化优化复杂度,具体地,对于第t步,优化如下损失函数:minα,θ∑i=1mL(y(i),Gt−1(x(i))+αg(x(i),θ))

3.3 AdaBoost的损失函数

可以将模型公式类比于SVM:



那么我们假设损失函数为指数函数,即:J(α,g)=1m∑i=1mexp(−y(i)∑t=1Tαtgt(x(i)))



3.4 求解

根据前向分步算法,每次迭代之针对一个基函数和系数:

对于第t步:



(图片说明;图片中η就是我们要求的α)



很明显地。AdaBoost算法中的基分类器跟上述求解过程最终结果是一样的。

现在已经求得了基函数,如何求解α?

minαJ=∑i=1mw(i)texp(−y(i)αgt(x(i)))



也即:AdaBoost算法是前向分步算法的特例,其损失函数为指数函数。

4. Gradient Boosting

上面我们使用最小化损失函数的思想,采用前向分步算法求解来重新解释了AdaBoost算法。其中借助了损失函数是指数函数这一假设。

现在我们来在更加抽象的层次上考虑问题:



如何求解?类比于前文中提到的梯度下降法,我们也采用同样的方式来解析,第t次迭代有:h(x(i))=−∂err(ft(x(i)),y(i))∂ft(x(i))

令gt(x(i))=h(x(i))带入损失函数,那么现在的问题变成了:

minη1m∑i=1merr(∑t=1t−1αtgt(x(i))+ηgt(x(i)),y(i))

现在变成了单参数问题,我们可以求解最优化的η,令αt=η。

具体细节如下:





4.1 Put everying together——梯度提升树

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  机器学习