集成學習通過構建多個學習器然后進行某種方式的組合來達到學習的任務,通過集成學習可以增強模型的學習和泛化能力。下面總結以下集成學習的最基本概念。
1.常用集成學習方法:
1.1 Bagging
Bagging( Bootstrap Aggregation)是一種最著名的並行式集成學習算法,其基本思想是對於訓練集做$M$次自助采樣(Bootstrap Sampling)得到$M$個采樣集,然后對每個采樣集進行訓練,得到$M$個模型,最后進行$M$個模型的整合,對分類問題用投票法,對回歸問題用求平均的方法。
Bagging的最大優點是降低模型的方差。注意到如果數據集足夠大,每一次采樣平均只能采集到大概63.2%的樣本,於是由不同采樣集之間重合的樣本數一般也不會超過30%,訓練出來的兩個模型的獨立性要大大增強,最終的模型方差將大大減小。用數學語言來描述,例如對回歸問題,我們有$M$個由訓練集$D$自助采樣后訓練出的模型$f_{1},...,f_{M}$, 對於任意的輸入$x$,我們假設$f_{i}$在$x$處的方差均約等於$\delta^{2}(x)$而對任意不同的子模型$f_{i},f_{j}$在$x$處的協方差均為正且約為$\rho(x)\delta^{2}(x)(\rho(x)\in (0,1))$,則Bagging所得到的模型$f=\frac{1}{M}\sum_{i=1}^{M}f_{i}$在$x$處的方差為:
\begin{split}\text{Var}_{D}(\frac{1}{M}\sum_{i=1}^{M}f_{i})&=\frac{1}{M^{2}}\sum_{i=1}^{M}\text{Var}_{D}(f_{i}(x))+\frac{2}{M^{2}}\sum_{1\leq i<j\leq M}\text{Cov_{D}}(f_{i}(x),f_{j}(x))\newline &\approx\frac{\delta^{2}(x)}{M}+\frac{M-1}{M}\rho(x)\delta^{2}(x)\newline &=\rho(x)\delta^{2}+\frac{(1-\rho(x))\delta^{2}(x)}{M}\end{split}
注意到隨着Bagging的子模型數量的增加,$f$的方差不斷減小,最后$M\rightarrow \infty$趨於$\rho(x)\delta^{2}(x)$, 嚴格小於單獨模型的方差$\delta^{2}(x)$。注意到我們已經分析過了,由於自助法的應用,$\rho(x)$也會比較小,所以Bagging方法將大大減小模型方差,增強泛化能力。但是我們同時注意到,方差的降低不是無限制的,如果每個模型的復雜度過高導致$\delta(x)$過大,就算是$M\rightarrow \infty$模型仍然會過擬合,所有我們在訓練的時候仍然注意得防止過擬合。
Bagging采樣自助法的另外一個好處就是訓練每一個子模型的時候都可以計算其袋外誤差來判斷每個子模型的泛化能力,另外袋外誤差還可以有其他更多用途。
由於Bagging的每個子模型的采樣和訓練完全是和其他模型不相關的,所有Bagging算法可以方便的進行並行運算。
基於樹模型的隨機森林算法是Bagging的進一步擴展,將在下一次單獨討論。
1.2 三個臭皮匠,頂一個諸葛亮——Boosting方法
所謂Boosting(提升方法)是指的一系列將若干弱的學習器提升為強的學習“委員會”("commitee")的算法。Boosting是近20余年發展出的一種強大的機器學習思想,起先是用於分類問題,后來也出現了很多同樣可以應用於回歸問題的提升方法。
所有的Boosting方法的基本想法都是先訓練出一個學習器,然后不斷根據前一步的學習器的訓練效果對學習策略進行調整來學習下一個學習器,然后對所有學習器進行整合。常見的Boosting算法有AdaBoost, GBDT以及近幾年很火熱的XGBoost,LightGBM 等等。
很多Boosting算法均可以概括為一種“前向分步可加模型”(Forward Stagewise Additive Modeling). 在該模型中,我們如果有訓練數據集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$我們希望學習一組基模型並將其線性組合得到最終模型:
\begin{equation}f(x)=\sum_{m=1}^{M}\beta_{m}b(x; \gamma_{m})\end{equation}
使得經驗誤差函數:
$$\sum_{i=1}^{N}L(f(x_{i}),y_{i})$$
最小,其中$b$為某基模型,$\gamma_{i}$為每個基模型的參數,$\beta_{i}\geq 0$為組合系數。這個時候最最直接的方法當然是求:
\begin{equation}\beta^{\ast},\gamma^{\ast}=\text{argmin}_{\beta,\gamma} L(\sum_{m=1}^{M}\beta_{m}b(x_{i}; \gamma_{m}),x_{i}),\end{equation}但是這個問題的求解太過困難。相反我們可以考慮一種貪婪算法,一步一步求解,我們稱其為“前向分步可加模型”,如下所示:
——————————————————————————————————————————
輸入:訓練集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$,損失函數$L$,基模型$b$和數$M>0$
輸出:提升后的模型
Step1. 初始化$f_{0}(x)=0$.
Step2. 對$m$從1到M:
(1) 計算出$(\beta_{m}^{\ast},\gamma_{m}^{\ast})=\text{argmin}_{\beta_{m},\gamma_{m}}\sum_{i=1}^{N}L(f_{m-1}(x_{i})+\beta_{m}b(x_{i}; \gamma_{m}) ,y_{i})$
(2) 令$f_{m}(x)=f_{m-1}(x)+\beta_{m}^{\ast}b(x,\gamma^{\ast}_{m})$
Step3. 輸出模型$f_{M}$
——-————————————————————————————————————————
1.3 Stacking
Stacking算法簡單得說就是將一組模型輸出作為另外一個模型輸入的算法,具體說先用一組“初始學習算法”學習初級數據集$D={(x_{1},y_{1}),...,(x_{N},y_{N})}$得到模型$f_{1},...,f_{T}$,然后生成一個新的數據集:
$D^{\prime}=\lbrace(f_{1}(x_{i}),f_{2}(x_{i}),...,f_{T}(x_{i}),y_{i})\mid i=1,...,N\rbrace,$
再選擇一個次級學習算法學習$D^{\prime}$ 得到模型$f$,最終輸出模型:
$$F(x)=f(f_{1}(x),...,f_{N}(x))$$
為了防止過擬合,一般也是用類似於交叉驗證的辦法來生成新的數據集$D^{\prime}$。我個人很欣賞這種算法,因為其很機智,實際上是在學習一個復合函數,但是我對其也不太了解沒有使用過,希望以后加強這方面的學習。
2. 誤差,分歧分解
就如我們在Bagging中看到的那樣,我們引入了自助法來訓練不同的模型,各個模型由於學習的數據集重合度不高所以呈現出一定的差異。一般的,集成學習中的各個子模型也應該“好而不同”,下面我們從所謂誤差,分歧分解的角度從理論上看為什么。
我們令$\mathcal{S}\subset\mathbb{R}^{P}\times\mathbb{R}$為樣本的總體,我們記$E_{\mathcal{S}}(f(x,y))$為某個函數$f$在$\mathcal{S}$上的期望, 而我們通過一個訓練集$D\subset S$得到了$M$個不同的模型$f_{1},...,f_{M}$,並且取權重$w_{1},...,w_{M} $將模型進行集成得到模型:
$$F=\sum_{i=1}^{M}w_{i}f_{i}.$$
注意到,對任意的$(x,y)\in\mathcal{S}$, $i=1,...,M$我們有:
\begin{split}&w_{i}(h_{i}(x)-y)^{2}\newline =&w_{i}(f_{i}(x)-F(x)+F(x)-y)\newline =&w_{i}(f_{i}-F(x))^{2}+2w_{i}(f_{i}(x)-F(x))(F(x)-y)+w_{i}(f_{i}(x)-y)\end{split}
上式兩邊同時取$\sum_{i=1}^{M}$,右邊第二項消失,我們得到:
$$\sum_{i=1}^{M}w_{i}(f_{i}(x)-y)^{2}=\sum_{i=1}^{M}w_{i}(f_{i}(x)-F(x))^{2}+\sum_{i=1}^{M}w_{i}(F(x)-y)^{2}$$
上式兩邊再取$E_{\mathcal{S}}$我們就可以得到:
\begin{equation}\sum_{i=1}^{M}w_{i}E_{\mathcal{S}}((f_{i}(x)-y)^{2})=\sum_{i=1}^{M}w_{i}E_{\mathcal{S}}((f_{i}(x)-F(x))^{2})+\sum_{i=1}^{M}E_{\mathcal{S}}((F(x)-y)^{2})\end{equation}
我們觀察一下,上式第一項實際上是各個子模型的均方誤差(有時候我也稱誤差為風險)的加權平均和我們記其為$\overline{E}$,而第二項實際上是體現了各個子模型的差異程度,其中令$A_{i}=E_{\mathcal{S}}((f_{i}(x)-F(x))^{2})$, 稱其為模型$f_{i}$與集成模型$F$的分歧(ambiguity), 則第二項其實就是所有分歧的加權平均我們記其為$\overline{A}$,而最后一項為集成之后模型$F$的均方誤差(風險)我們記為$E$,所以我們有:
\begin{equation}\overline{E}=\overline{A}+E\end{equation}
上式就稱為誤差-分歧分解。可以知道實際上:$E=\overline{E}-\overline{A}$,所以為了使得$E$盡量小,也就是模型泛化能力強,我們應該在保證$\overline{E}$不變的情況下盡量增大模型的多樣性,使得$\overline{A}$盡量大。
有若干種方法進行多樣性的增強,例如:
- 數據樣本擾動:例如重采樣法,AdaBoost中的調整訓練權重等
- 輸入擾動:例如列采樣Column Subsampling
- 輸出表示擾動: Flipping Output, Output Smearing, ECOC等
- 參數擾動法:對不同的子模型用不同的參數進行學習。
3.參考文獻
【1】周志華:機器學習,清華大學出版社,2016年第一版
【2】 Trevor Hastie,Robert Tibshirani,Jerome Friedman: The Elements of Statistical Learning Data Mining,Inference,and Prediction, second edition, Springer Verleg, 2009
