1 引言
本文主要结合了李宏毅的机器学习课程之Ensemble和周志华的《机器学习》西瓜书两者的说法,对ensemble这一竞赛利器做了总结。
Ensemble主要可以分为bagging和boosting两种方法。其中,bagging适用于基模型复杂度比较高的情况(如树模型),其目的是为了减小variance,即阻止过拟合的情况。而boosting则是适用于基模型是弱学习器的情况,其目的是减小biases,基本上多弱模型都可以用(如果分类正确率低于50%,取个反就可以了)~
2 Bagging
个人觉得bagging其实和神经网络中的drop-out非常相似。我们只给每个模型看数据的一部分,不给它们看全貌,然后希望它们在这一部分上有比较好的学习结果,最后综合各个模型的结果,做一个blending,得到最终的结果。
Bagging在选取数据时,采用的是bootstrap的方法,即有放回的抽样。假设我们有 mm 个样本的数据集 。我们希望利用有放回的抽样方法构造一个新的数据集 D′D′,其样本个数仍旧是m。显然 DD 中的一些数据会在 中重复出现,这也就意味着有一部分数据在 D′D′ 中是不会出现的。
我们可以做一个简单的估计。样本在m次采样中,始终没有被采到的概率为 (1−1m)m(1−1m)m ,取极限的话为
这一部分没有被采样到的数据可以作为验证集来使用,这个方法被称“包外估计”(out-of-bag estimate)。
根据该方法训练得到多个模型之后,可以取平均或者投票得到最终结果。
其中,随机森林便是一个典型的利用bagging方法的模型,只不过在随机森林当中,数据的特征也是随机选取的。
3 Boosting
Boosting的主要想法是在已有模型的基础上,重视被错分的样本,再训练一个模型来融合到原模型中,以此来提高模型的准确率,如此不断反复。那么如何重视被错分的样本呢?这就是boosting的一个有意思的地方了。它给每个样本赋予了一个权重,每次boosting之后,样本的权重就会被更新,而这里的权重直接影响了训练时的Loss function。
式中, unun 即为每个样本的权重。也就是说,现在我们的样本变成了这个样子
Boosting的方法有很多,我们这里主要讲一下其中比较流行的AdaBoost算法。
假设我们在第一个基模型 f1(x)f1(x) 上训练得到的错误率为(此时所有样本权重均相同)
其中
我们希望学习器的错误率 ϵ1ϵ1 是大于0.5的,否则我们取个反,或者不要这个学习器,换一个。
知道了哪些训练错了,哪些训练对了之后,我们就要进行最重要的重新分配权重了。所谓的重新分配权重就是给正确的权重除以一个 d1d1 ,错误的权重乘以一个 d1d1, d1>1d1>1。
那么这个 d1d1 怎么来?我们希望再更新权重之后,新的权重满足下式
也就是说,从权重上来看要错的对的各占一半,即
其中, Z1ϵ1=∑f1(xn)≠ynun1d1Z1ϵ1=∑f1(xn)≠ynu1nd1, Z1(1−ϵ1)=∑f1(xn)=ynun1d1Z1(1−ϵ1)=∑f1(xn)=ynu1nd1,代入上式可得
再用此时的权重去训练出第二个模型 f2(xn)f2(xn) 。之后,继续如此操作,直到达到弱分类器个数限制。
为了方便表示,我们通常把 dd 表示成 eαeα 的形式,那么,权重的更新可以直接写成
其中, αt=ln(dt)αt=ln(dt)。
得到所有的模型之后,我们希望把训练的 TT 个模型融合起来,这个融合的过程就叫做blending。
一种简单的做法就是直接取结果的平均
但这样的做法不够机智。我们每个模型的可信度是不同的,我们需要给每个模型一个权重,得到一个加权平均的结果
这里的 αtαt 就是我们前面的 αt=ln((1−ϵ1)/ϵ1−−−−−−−−−√)αt=ln((1−ϵ1)/ϵ1)。可以证明随着模型数量的增加,模型在训练集上的表现会越来越好,详细证明可参见李宏毅的视频。
4 Gradient Boosting
顾名思义,这是用Gradient的方法来进行boosting。上文中的Adaboost其实就是一种特殊的Gradient Boosting。Gradient Boosting的总体流程为
既然是要做Gradient,当然要有目标函数啊。这里的目标函数就是
于是,就有
又由于
所以我们希望 −η∂L(g)∂g(x)|g(x)=gt−1(x)−η∂L(g)∂g(x)|g(x)=gt−1(x) 和 αtft(x)αtft(x) 是方向相同的。即找到一个 ft(x)ft(x) 使得
然后找一个 αtαt 使得 L(g)L(g) 最小。
当 L(g)=∑ne−yng(xn)L(g)=∑ne−yng(xn) 的时候,可以推出这就是我们的Adaboosting。
详细推导过程偷下懒,参见李宏毅的视频即可。