假如我们有多个模型,要怎么灵活运用将这些模型的结果呢?可以使用模型融合(aggregation models) 的方式,将n个模型的输出进一步融合成为一个输出,得到我们想要的结果,那么怎么融合多个模型呢?常见的方法有以下几种:
核心思想:少数服从多数,民主投票
如果知道n个模型的输出,每个模型有一票,则最终的输出:
H ( x ) = s i g n ( ∑ t = 1 T h t ( x ) ) H(x)=sign(\sum_{t=1}^T h_{t}(x)) H(x)=sign(t=1∑Tht(x))
如果是多分类,则最终输出得票数最多的分类即可。
如果是预测数值型输出,则最终的输出:
H ( x ) = 1 T ∑ t = 1 T h t ( x ) H(x)=\frac{1}{T}\sum_{t=1}^Th_{t}(x) H(x)=T1t=1∑Tht(x)
可以证明融合之后的模型要比原先的效果好(更稳定):
a v g ( ( h t ( x ) − f ( x ) ) 2 ) = a v g ( h t 2 − 2 h t f + f 2 ) = a v g ( h t 2 ) − 2 H f + f 2 = a v g ( h t 2 ) − H 2 + ( H − f ) 2 = a v g ( h t 2 ) − 2 H 2 + H 2 + ( H − f ) 2 = a v g ( h t 2 − 2 h t H + H 2 ) + ( H − f ) 2 = a v g ( ( h t − H ) 2 ) + ( H − f ) 2 \begin{aligned} avg((h_t(x)-f(x))^2) &= avg(h_t^2-2h_tf+f^2) \\ &= avg(h_t^2)-2Hf+f^2 \\ &= avg(h_t^2)-H^2+(H-f)^2 \\ &= avg(h_t^2)-2H^2+H^2 +(H-f)^2 \\ &= avg(h_t^2-2h_tH+H^2)+(H-f)^2 \\ &= avg((h_t-H)^2)+(H-f)^2 \end{aligned} avg((ht(x)−f(x))2)=avg(ht2−2htf+f2)=avg(ht2)−2Hf+f2=avg(ht2)−H2+(H−f)2=avg(ht2)−2H2+H2+(H−f)2=avg(ht2−2htH+H2)+(H−f)2=avg((ht−H)2)+(H−f)2
其中, a v g ( ( h t ( x ) − f ( x ) ) 2 ) avg((h_t(x)-f(x))^2) avg((ht(x)−f(x))2)代表原始模型的均方误差, ( H − f ) 2 (H-f)^2 (H−f)2表示融合模型的军方误差,它们之间相差了一个 a v g ( ( h t − H ) 2 ) avg((h_t-H)^2) avg((ht−H)2),因此有
a v g ( ( h t ( x ) − f ( x ) ) 2 ) ≥ ( H − f ) 2 avg((h_t(x)-f(x))^2) \ge (H-f)^2 avg((ht(x)−f(x))2)≥(H−f)2
对于uniform blending,每个模型的输出要有所不同,这样融合之后的效果才有可能比单一的模型效果要好,否则平均下来得到的还是一样的结果。
核心思想 :让每个模型投票,但是给不同模型不同的票数,即给予它们不同的权重。最终的输出为:
H ( x ) = s i g n ( ∑ t = 1 T α t ⋅ h t ( x ) ) H(x)=sign(\sum_{t=1}^T \alpha_t·h_{t}(x)) H(x)=sign(t=1∑Tαt⋅ht(x))
此时要求解的目标为:
min a t ≥ 0 1 N ( y n − ∑ t = 1 T a t h t ( x n ) ) 2 \min_{a_t\ge 0}\frac{1}{N}\left(y_n-\sum_{t=1}^Ta_th_t(x_n)\right )^2 at≥0minN1(yn−t=1∑Tatht(xn))2
核心思想 :让每个模型投票,但是在不同的条件下给不同模型不同的的权重,采用非线性的方式将模型的输出融合。这种方式比较强大,有过拟合的风险。
stacking是一种分层模型集成框架。以两层为例,第一层由多个基学习器组成,其输入为原始训练集,第二层的模型则是以第一层基学习器的输出作为训练集进行再训练,从而得到完整的stacking模型。
通常使用K-fold来实现Stacking,假设我们使用5折交叉验证,有10000行训练集,2500行验证集,对于一个模型来说,5次交叉验证会将10000个训练集分成5份,每份2000个数据,每次以其中一份作为测试集,这样10000个数据都会被测试一次,最终我们可以得到 10000 × 1 10000 \times 1 10000×1的矩阵 A 1 A_1 A1,同时每次交叉验证的时候都会对验证集进行预测,每次都可以得到一个 2500 × 1 2500 \times 1 2500×1的矩阵,共得到5个。对于同一个样本的预测,我们使用平均的方式,最终5个矩阵合并为1个 2500 × 1 2500 \times 1 2500×1的矩阵 B 1 B_1 B1。由于我们是在融合多个模型,自然不止一个模型。假如我们还有模型 M o d e l 2 , M o d e l 3 , . . . , M o d e l n Model_2,Model_3,...,Model_n Model2,Model3,...,Modeln,对于每一个模型重复上述步骤,我们可以得到 A 2 , B 2 , A 3 , B 3 , . . . A n , B n A_2,B_2,A_3,B_3,...A_n,B_n A2,B2,A3,B3,...An,Bn。将所有的A,B矩阵按列合并起来,得到 A t o t a l , B t o t a l A_{total},B_{total} Atotal,Btotal。以上步骤是Stacking第一层所完成的事情。
将得到的 A t o t a l A_{total} Atotal作为第二层的训练集, B t o t a l B_{total} Btotal作为第二层的测试集,使用Liner Regression来总结所有模型的效果,得到最终的预测效果。
如果说,我们一开始并没有很多个模型,也就无法运用上面的技巧了。因此我们需要通过学习的方式来得到多个模型,一边决定怎么把它们合起来。其中,Bagging是一种通过Bootstraping学习得到多个模型并利用uniform blending来融合模型的方法。
Bootstraping:从已有的样本中有放回地随机取n份样本。即同一个样本可能被取到多次。假如有10000个样本,可以迭代三千次,每次都取出一份bootstrap sample,每份bootstrap sample可以看做是新的数据,从而我们得到了3000个模型 h t h_t ht。这是Bagging套袋法中一个重要的步骤。
Bagging的算法过程如下:
如果我们的模型对数据的随机性比较敏感的话,采用BAGging的方式得到的融合模型往往很有效果。
在Bagging的过程中,每次Boostraping取到的样本都是独立随机的。而在模型融合的算法中,我们认为每个基分类器如果越不一样的,则融合得到的效果是最好的。考虑这样一种情况,在当前一轮取到的样本得到的模型 h t 1 h_{t1} ht1,如果让他在 h t 2 h_{t2} ht2的表现变得和抛硬币的情况一样,那么在 h t 2 h_{t2} ht2的样本就会使得 h t 2 h_{t2} ht2跟 h t 1 h_{t1} ht1的差别变大,也就是说两个分类器会得到很不一样的决策边界。
而boostraping的过程其实就是在给样本赋予不同权重的过程,比如说,我们取到了3个样本1,,0个样本2,1个样本3,那么他们的权重就分别是3,0,1。要改变下一个模型的表现,其实只要修改它们的权重即可。令 ϵ \epsilon ϵ表示当前模型下分类错误的比例。则我们的权重优化操作为:
或者我们进一步定义放缩因子 t = 1 − ϵ ϵ t=\sqrt{\frac{1-\epsilon}{\epsilon}} t=ϵ1−ϵ,则权重优化操作变为:
在通常 ϵ \epsilon ϵ都要小于 1 2 \frac{1}{2} 21,否则我们的基学习器就比抛硬币的概率还低了。此时 t ≥ 1 t\ge 1 t≥1,则上面的式子表现为增大错误分类的权重,缩小正确分类的权重。经过上面的修正,当前模型的表现就会变成五五开的情况。
通常一开始的权重u初始化为 1 N \frac{1}{N} N1,即每个样本都取一次。
那我们最终要怎么确定每个模型 h t h_t ht在最终模型h中占用的权重呢?考虑模型有的可能变现较差,有的表现较好,那么给予不同的权重是一个合理的选择。对于一个表现良好的模型 h t h_t ht,它的缩放因子t会更大,因此可以考虑使用 ln t \ln t lnt。当t越大时,错误率 ϵ \epsilon ϵ越低,得到的权重越大,当t=1时,错误率 ϵ \epsilon ϵ为 1 2 \frac{1}{2} 21, ln t \ln t lnt=0,即这样的模型不予考虑,因为他跟抛硬币没什么区别。
对于权重更新的式子可以合并为
u m + 1 , i = u m , i Z m ⋅ e x p ( − α m y i G m ( x i ) ) , i = 1 , 2... , N Z m = ∑ i = 1 N u m , i exp ( − α m y i G m ( x i ) ) u_{m+1,i}=\frac{u_{m,i}}{Z_m}·exp\left(-\alpha_my_iG_m(x_i)\right) ,i=1,2...,N\\ Z_m=\sum_{i=1}^Nu_{m,i}\exp (-\alpha_my_iG_m(x_i)) um+1,i=Zmum,i⋅exp(−αmyiGm(xi)),i=1,2...,NZm=i=1∑Num,iexp(−αmyiGm(xi))
其中 Z m Z_m Zm为规范化因子。构建基本分类器的线性组合
f ( x ) = ∑ m = 1 M α m G m ( x ) f(x)=\sum_{m=1}^M\alpha_mG_m(x) f(x)=m=1∑MαmGm(x)
得到最终分类器
G ( x ) = s i g n ( f ( x ) ) = s i g n ( ∑ m = 1 M α m G m ( x ) ) G(x)=sign(f(x))=sign\left(\sum_{m=1}^M\alpha_mG_m(x)\right) G(x)=sign(f(x))=sign(m=1∑MαmGm(x))
最终我们得到Adaptive Boosting的算法流程如下:
当 G ( x i ) ≠ y i G(x_i) \ne y_i G(xi)̸=yi时, y i f ( x i ) < 0 y_if(x_i) \lt 0 yif(xi)<0,因而 exp ( − y i f ( x i ) ) ≥ 1 \exp (-y_if(x_i))\ge 1 exp(−yif(xi))≥1。则有 1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ≤ 1 N ∑ i exp ( − y i f ( x i ) ) \frac{1}{N}\sum\limits_{i=1}^NI(G(x_i)\ne y_i)\le \frac{1}{N}\sum\limits_i\exp(-y_if(x_i)) N1i=1∑NI(G(xi)̸=yi)≤N1i∑exp(−yif(xi))
又
1 N ∑ i exp ( − y i f ( x i ) ) = 1 N ∑ i exp ( − ∑ m = 1 M α m y i G m ( x i ) ) = ∑ i u 1 , i ∏ m = 1 M exp ( − α m y i G m ( x i ) ) = Z 1 ∑ i u 2 , i ∏ m = 2 M exp ( − α m y i G m ( x i ) ) = Z 1 Z 2 ∑ i u 3 , i ∏ m = 3 M exp ( − α m y i G m ( x i ) ) = . . . = Z 1 Z 2 . . . Z M − 1 ∑ i u M , i exp ( − α m y i G m ( x i ) ) = ∏ m = 1 M Z m \begin{aligned} &\frac{1}{N}\sum\limits_i\exp(-y_if(x_i))\\ &=\frac{1}{N}\sum\limits_i\exp\left(-\sum_{m=1}^M\alpha_my_iG_m(x_i)\right)\\ &=\sum_iu_{1,i}\prod_{m=1}^M\exp(-\alpha_my_iG_m(x_i))\\ &=Z_1\sum_iu_{2,i}\prod_{m=2}^M\exp(-\alpha_my_iG_m(x_i))\\ &=Z_1Z_2\sum_iu_{3,i}\prod_{m=3}^M\exp(-\alpha_my_iG_m(x_i))\\ &=...\\ &=Z_1Z_2...Z_{M-1}\sum_iu_{M,i}\exp(-\alpha_my_iG_m(x_i))\\ &=\prod_{m=1}^MZ_m\\ \end{aligned} N1i∑exp(−yif(xi))=N1i∑exp(−m=1∑MαmyiGm(xi))=i∑u1,im=1∏Mexp(−αmyiGm(xi))=Z1i∑u2,im=2∏Mexp(−αmyiGm(xi))=Z1Z2i∑u3,im=3∏Mexp(−αmyiGm(xi))=...=Z1Z2...ZM−1i∑uM,iexp(−αmyiGm(xi))=m=1∏MZm
因此AdaBoost最终分类器的训练误差界为
1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ≤ 1 N ∑ i exp ( − y i f ( x i ) ) = ∏ m Z m \frac{1}{N}\sum_{i=1}^NI(G(x_i)\ne y_i)\le \frac{1}{N}\sum_i\exp(-y_if(x_i))=\prod_mZ_m N1i=1∑NI(G(xi)̸=yi)≤N1i∑exp(−yif(xi))=m∏Zm
结论:每一轮可以选取适当的 G m G_m Gm使得 Z m Z_m Zm最小,从而使得训练误差下降最快。
在二分类问题里,令 γ m = 1 2 − ϵ m \gamma_m=\frac{1}{2}-\epsilon_m γm=21−ϵm,有
Z m = ∑ i = 1 N u m , i exp ( − α m y i G m ( x i ) ) = ∑ y i = G m ( x i ) u m , i e − a m + ∑ y i ≠ G m ( x i ) u m , i e a m = ( 1 − ϵ m ) e − a m + ϵ m e a m = 2 ϵ m ( 1 − ϵ m ) = 1 − 4 γ m 2 \begin{aligned} Z_m &=\sum_{i=1}^Nu_{m,i}\exp(-\alpha_my_iG_m(x_i))\\ &=\sum_{y_i=G_m(x_i)}u_{m,i}e^{-a_m}+\sum_{y_i \ne G_m(x_i)}u_{m,i}e^{a_m}\\ &=(1-\epsilon_m)e^{-a_m}+\epsilon_me^{a_m}\\ &=2\sqrt{\epsilon_m(1-\epsilon_m)}\\ &=\sqrt{1-4\gamma_m^2} \end{aligned} Zm=i=1∑Num,iexp(−αmyiGm(xi))=yi=Gm(xi)∑um,ie−am+yi̸=Gm(xi)∑um,ieam=(1−ϵm)e−am+ϵmeam=2ϵm(1−ϵm)=1−4γm2
再由 e x e^x ex和 1 − x \sqrt{1-x} 1−x在点x=0处的泰勒展开式推出不等式 ( 1 − 4 γ m 2 ) ≤ exp ( − 2 γ m 2 ) \sqrt{(1-4\gamma_m^2)}\le \exp(-2\gamma_m^2) (1−4γm2)≤exp(−2γm2),从而有
∏ m = 1 M ( 1 − 4 γ m 2 ) ≤ exp ( − 2 ∑ m = 1 M γ m 2 ) \prod_{m=1}^M\sqrt{(1-4\gamma_m^2)} \le \exp(-2\sum_{m=1}^M\gamma_m^2) m=1∏M(1−4γm2)≤exp(−2m=1∑Mγm2)
则二分类的训练误差界为
∏ m = 1 M Z m = ∏ m = 1 M 1 − 4 γ m 2 ≤ exp ( − 2 ∑ m = 1 M γ m 2 ) \prod_{m=1}^MZ_m=\prod_{m=1}^M\sqrt{1-4\gamma_m^2} \le \exp(-2\sum_{m=1}^M\gamma_m^2) m=1∏MZm=m=1∏M1−4γm2≤exp(−2m=1∑Mγm2)
如果存在 γ > 0 \gamma \gt 0 γ>0,对所有m有 γ m ≥ γ \gamma_m \ge \gamma γm≥γ,则
1 N ∑ i = 1 N I ( G ( x i ) ≠ y i ) ≤ exp ( − 2 M γ 2 ) \frac{1}{N}\sum_{i=1}^NI(G(x_i)\ne y_i)\le \exp(-2M\gamma^2) N1i=1∑NI(G(xi)̸=yi)≤exp(−2Mγ2)
这表明在此条件下Adaboost的训练误差是以指数速率下降的!
其实AdaBoost是当前向分步算法损失函数为指数损失时的特例。 前向分步算法如下:
前向分步算法将同时求解M个模型的参数 β m , γ m \beta_m,\gamma_m βm,γm的优化问题简化为逐次求解各个 β m , γ m \beta_m,\gamma_m βm,γm。这与AdaBoost的步骤一致。
当前向分步算法的损失函数是
L ( y , f ( x ) ) = exp [ − y f ( x ) ] L(y,f(x))=\exp [-yf(x)] L(y,f(x))=exp[−yf(x)]
时,等价于AdaBoost算法学习的具体步骤。
假设经过m-1轮迭代后已经得到 f m − 1 ( x ) f_{m-1}(x) fm−1(x),在第m轮时,需要迭代得到 a m , G m ( x ) 和 f m ( x ) a_m,G_m(x)和f_m(x) am,Gm(x)和fm(x),有
f m ( x ) = f m − 1 ( x ) + a m G m ( x ) f_m(x)=f_{m-1}(x)+a_mG_m(x) fm(x)=fm−1(x)+amGm(x)
目标是让前向分步算法中得到的 a m a_m am和 G m ( x ) G_m(x) Gm(x)使 f m ( x ) f_m(x) fm(x)在训练集T上的指数损失最小,即
( a m , G m ( x ) ) = arg min a , G ∑ i = 1 N exp [ − y i ( f m − 1 ( x i ) + a G ( x i ) ) ] = arg min a , G ∑ i = 1 N u ˉ m , i exp [ − y i a G ( x i ) ] . . . . . . . . . . ( 1 ) (a_m,G_m(x))=\arg \min_{a,G}\sum_{i=1}^N\exp [-y_i(f_{m-1}(x_i)+aG(x_i))] \\ =\arg \min_{a,G}\sum_{i=1}^N\bar u_{m,i}\exp [-y_iaG(x_i)] ..........(1) (am,Gm(x))=arga,Gmini=1∑Nexp[−yi(fm−1(xi)+aG(xi))]=arga,Gmini=1∑Nuˉm,iexp[−yiaG(xi)]..........(1)
其中 u ˉ m , i = exp [ − y i f m − 1 ( x i ) ] \bar u_{m,i}=\exp[-y_if_{m-1}(x_i)] uˉm,i=exp[−yifm−1(xi)],为当前已知量,与最小化无关。
使式子1最小的G(x)为
G m ∗ ( x ) = arg min G ∑ i = 1 N u ˉ m , i I ( y i ≠ G ( x i ) ) G^*_m(x)=\arg \min_G\sum_{i=1}^N\bar u_{m,i}I(y_i \ne G(x_i)) Gm∗(x)=argGmini=1∑Nuˉm,iI(yi̸=G(xi))
此分类器即为AdaBoost算法学习的基本分类器 G m ( x ) G_m(x) Gm(x),它是使第m轮数据分类误差率最小的分类器。
∑ i = 1 N u ˉ m , i exp [ − y i a G ( x i ) ] = ∑ y i = G m ( x i ) u ˉ m , i e − a + ∑ y i ≠ G m ( x i ) u ˉ m , i e a = ∑ y i = G m ( x i ) u ˉ m , i e − a + ∑ y i ≠ G m ( x i ) u ˉ m , i e a + ∑ y i ≠ G m ( x i ) u ˉ m , i e − a − ∑ y i ≠ G m ( x i ) u ˉ m , i e − a = ( e a − e − a ) ∑ i = 1 N u ˉ m , i I ( y i ≠ G ( x i ) ) + e − a ∑ i = 1 N u ˉ m , i \begin{aligned} &\sum_{i=1}^N\bar u_{m,i}\exp [-y_iaG(x_i)]\\ &=\sum_{y_i=G_m(x_i)}\bar u_{m,i}e^{-a}+\sum_{y_i \ne G_m(x_i)}\bar u_{m,i}e^a \\ &=\sum_{y_i=G_m(x_i)}\bar u_{m,i}e^{-a}+\sum_{y_i \ne G_m(x_i)}\bar u_{m,i}e^a +\sum_{y_i \ne G_m(x_i)}\bar u_{m,i}e^{-a} -\sum_{y_i \ne G_m(x_i)}\bar u_{m,i}e^{-a} \\ &=(e^a-e^{-a})\sum_{i=1}^N\bar u_{m,i}I(y_i \ne G(x_i))+e^{-a}\sum_{i=1}^N\bar u_{m,i} \end{aligned} i=1∑Nuˉm,iexp[−yiaG(xi)]=yi=Gm(xi)∑uˉm,ie−a+yi̸=Gm(xi)∑uˉm,iea=yi=Gm(xi)∑uˉm,ie−a+yi̸=Gm(xi)∑uˉm,iea+yi̸=Gm(xi)∑uˉm,ie−a−yi̸=Gm(xi)∑uˉm,ie−a=(ea−e−a)i=1∑Nuˉm,iI(yi̸=G(xi))+e−ai=1∑Nuˉm,i
由于已经求出 G m ( x ) G_m(x) Gm(x),我们将其带入,对a求导并使其导数为0,得到
a m ∗ = 1 2 log 1 − ϵ m ϵ m a_m^*=\frac{1}{2}\log \frac{1-\epsilon_m}{\epsilon_m} am∗=21logϵm1−ϵm
其中
ϵ m = ∑ i = 1 N u ˉ m , i I ( y i ≠ G m ( x i ) ) ∑ i = 1 N u ˉ m , i \epsilon_m=\frac{\sum_{i=1}^N\bar u_{m,i}I(y_i \ne G_m(x_i))}{\sum_{i=1}^N\bar u_{m,i}} ϵm=∑i=1Nuˉm,i∑i=1Nuˉm,iI(yi̸=Gm(xi))
跟AdaBoost中的 a m a_m am完全一致。
而权重的更新由 f m = f m − 1 + a m G m ( x ) f_m=f_{m-1}+a_mG_m(x) fm=fm−1+amGm(x)以及 u ˉ m , i = exp [ − y i f m − 1 ( x i ) ] \bar u_{m,i}=\exp[-y_if_{m-1}(x_i)] uˉm,i=exp[−yifm−1(xi)]得
u ˉ m + 1 , i = u ˉ m , i exp [ − y i a m G m ( x ) ] \bar u_{m+1,i}=\bar u_{m,i}\exp [-y_ia_mG_m(x)] uˉm+1,i=uˉm,iexp[−yiamGm(x)]
添上规范化因子 Z m Z_m Zm就与AdaBoost中的权值更新公式等价。