第七章——集成學習和隨機森林(Ensemble Learning and Random Forests)


俗話說,三個臭皮匠頂個諸葛亮。類似的,如果集成一系列分類器的預測結果,也將會得到由於單個預測期的預測結果。一組預測期稱為一個集合(ensemble),因此這一技術被稱為集成學習(Ensemble Learning)。集成學習算法稱作集成方法(Ensemble method)。

例如,可以基於訓練集的不同隨機子集,訓練一組決策樹分類器。做預測是,首先拿到每一個決策樹的預測結果,得票數最多的一個類別作為最終結果,這就是隨機森林。

此外,通常還可以在項目的最后使用集成方法。比如已經創建了幾個不錯的分類器,可以將其集成為一個更優秀的分類器。

本章介紹了最手歡迎的分類器,包括bagging,boosting,stacking。

7.1 投票分類器(Voting Classifiers)

假如訓練了一些分類器,如圖7-1所示,

7-1. 訓練不同的分離器

根據每一分類器的預測結果,我們選擇得票最多的分類器作為最終預測結果,如圖7-2所示。這種多數票決分類器被稱作硬投票(hard voting)分類器。

7-2. 硬投票分類器

一般情況下,投票分類器會優於它所集成的每一個分類器。即使每一個單獨的分類器都很弱(預測結果僅僅略高於隨機猜測),集成分類器也可以很強,只要弱分類器是多種多樣不同的分類器。

 為什么會這么神奇呢?假設一枚硬幣有缺陷,會導致51%的概率正面朝上,49%的概率反面朝上。如果投擲1000次,大約會有510次正面朝上,490次反面朝上,大多是是朝上的。通過數學計算可知,投擲1000次,大部分正面朝上的概率是75%(可以根據林德貝格-勒維中心極限定理求得)。投擲的次數越多,這一概率越高(投擲10000次,這一概率是97%)。這是由於大數定律:在重復試驗中,隨着試驗次數的增加,事件發生的頻率趨於其期望。

類似的,假設有1000個分類器,其單獨的正確率僅有51%,通過多數票決預測分類,其正確率可達75%。不過,這需要分類器完全獨立,錯誤不相關。但由於是在同樣的數據集訓練的,錯誤的類型可能相同,從而降低了正確率。

如果分類器可以給出類別的概率(也就是具有predict_proba()方法),那么可以使Scikit-Learn的最終預測結果為平均概率最高的那一類別。這被稱作軟投票(soft voting)。軟投票的性能一般優於硬投票。

7.2 Bagging and Pasting

另一種獲得不同分類器的方法是,訓練算法雖然是相同的,但訓練數據確是從訓練集中隨機選取的不同子集。如果子集的選取是有放回采樣(sampling with replacement。replace在這里是復位、歸還的意思,不是代替的意思。),這一方法稱為bagging(bootstrap aggregating的簡稱。在統計學上,有放回采樣稱為bootstrapping)。如果是無放回采樣(sampling without replacement),則稱之為pasting

7.2.1 Bagging and Pasting in Scikit-Learn

介紹了如何使用BaggingRegressor

如圖7-5所示,集成樹和單個子樹有大致相當的bias,但是前者的variance更小。(二者在訓練集上的誤差大致相當,但是集成樹邊界更規則,更容易一般化。)

圖7-5. 一棵決策樹 Vs 500棵決策樹bagging集成

有放回抽樣(Bootstrapping)生成的子集之間更具多樣性,因此bagging比pasting具有稍高的bias,但是預測期之間的相關性也較小從而集成后的variance會減小。總體來說,bagging更優一些。

7.2.2 Out-of-Bag評估

使用bagging時,對於某一個預測器,某些樣本可能被抽樣多次,也有些樣本可能從沒被抽樣到。事實上,對於每一個預測期,平均有63%的樣本會被抽樣到,剩下的從沒有被抽到的37%樣本稱為out-of-bag (oob)樣本。注意,對每個預測器,這是不同的37%樣本。

可以證明為什么平均37%的樣本不會被抽到。假設樣本總數是$m$,在$m$次有放回抽樣中,一個樣本始終沒有被抽中的概率為$P(oob)= (1 - \frac{1}{m})^m$,當$m$足夠大時,

\begin{align*}
\lim_{m \rightarrow +\infty}(1 - \frac{1}{m})^m &= \lim_{m \rightarrow +\infty}(\frac{m - 1}{m})^m \\
&= \lim_{m \rightarrow +\infty}(\frac{1}{\frac{m}{m-1}})^m \\
&= \lim_{m \rightarrow +\infty}(\frac{1}{1 + \frac{1}{m-1}})^m \\
&= \lim_{m \rightarrow +\infty}\frac{1}{(1 + \frac{1}{m-1})(1 + \frac{1}{m-1})^{m-1}} \\
&= \lim_{m \rightarrow +\infty}\frac{1}{(1 + \frac{1}{m-1})e} \\
&= \frac{1}{e} \\
&\approx 0.37
\end{align*}

對於某一個預測器來說,它並沒有使用oob樣本,因此該預測器可以使用oob樣本進行評估,而不用專門划分出校驗集。

7.3 Random Patches and Random Subspaces

BaggingClassifier也支持特征抽樣,這通過超參數max_features和bootstrap_features控制。工作原理與max_samples和bootstrap類似,只不過把樣本抽樣替換成了特征抽樣。

這一方法在高維度輸入(比如圖像)是很有用。樣本和特征均抽樣稱為Random Patches method,只對特征抽樣稱為Random Subspaces method

7.4 隨機森林(Random Forests) 

隨機森林是一系列決策樹的集成,一般使用bagging方法。 

7.4.1 Extra-Trees 

在隨機森林中生成一棵決策樹時,會使用隨機選擇的特征子集,來切分數據集。還可以通過使用隨機的閾值來增加隨機性。這種更為隨機的森林被稱作Extremely Randomized Tree sensemble(簡稱Extra-Trees)。

7.4.2 特征重要性(Feature Importance)

如果觀察一棵決策樹,會發現越靠近根節點的特征越重要。可以通過計算一個特征在森林中的平均深度來評估其重要性。

7.5 Boosting

Boosting (最初被稱作hypothesis boosting)是指所有可以聯合一系類弱學習器使其成為強學習器的方法。其基本思想是循環地訓練預測器,每一次都嘗試更新其預測。現在有很多Boosting方法,最有名的是AdaBoost(Adaptive Boosting的簡稱)和Gradient Boosting

7.5.1 AdaBoost

這一技術技術在訓練的時候,多關照一下預測錯的實例 。例如,創建一個AdaBoost分類器。第一個分類器在訓練集上訓練並作出預測。然后誤分類實例的權重就會增加。第二個分類器會在權重更新后的訓練集上訓練,然后預測、更新權重。重復這一過程,如圖7-7所示。

圖7-7. AdaBoost更新實例權重並連續訓練

等所有預測器訓練完成后,預測過程類似於bagging或者pasting,只不過每一個預測期根據其總體精度,會有不同的權重。

AdaBoost算法存在一個劣勢,那就是不能並行運算,因為后面預測器的訓練,需要用到之前預測器的預測結果。

AdaBoost詳解:

訓練樣本大小$m$,每一個實例權重$w^{(i)}$初始化設置為$\frac{1}{m}$。第一個預測器進行訓練,並計算訓練集的加權誤差率(weighted error rate)$r_1$。

第$j$個預測器的加權誤差率:

\begin{align*}
r_j = \frac{\sum_{i=1,\hat{y}_j^{(i)} \neq y^{(i)}}^{m}w^{(i)}}{\sum_{i=1}^{m}w^{(i)}}
\end{align*}

其中,$\hat{y}_j^{(i)}$ 是第$j$個預測器對第$i$個實例的預測值。

預測器權重:

\begin{align*}
\alpha_j = \eta \, log \, \frac{1-r_j}{r_i}
\end{align*}

其中,$\eta$是學習率超參數(默認是1)。錯誤率越低,權重越大。錯誤率接近50%(也就是隨機猜測),權重接近0。錯誤率低於50%,則權重是負的。可參考下圖。

實例的權重將按照如下方式更新:

\begin{align*}
&for\ i = 1, 2, \cdots ,m \\
&w_{(i)} \leftarrow \left\{\begin{matrix}
w^{(i)} &if \ \hat{y}_j^{(i)} = y_{(i)} \\
w^{(i)}\ exp(a_j) &if \ \hat{y}_j^{(i)} \neq y_{(i)}
\end{matrix}\right.
\end{align*}

然后權重還要進行標准化。(也就是除以$\sum_{i=1}^{m}w^{(i)}$)

緊接着,一個新的預測試會使用更新后的權重,重復這一訓練過程。如果預測器個數超過預定值,或者預測結果已經足夠好,算法將會停止。

AdaBoost算法的預測:

\begin{align*}
\mathop{\arg\max}\limits_{k}\mathop{\sum_{j=1}^{N}}\limits_{\hat{y}_j(X)=k} a_j
\end{align*}

其中,N是預測器個數。

事實上,Scikit-Learn使用的是一用被稱作SAMME(Stagewise Additive Modeling using a Multiclass Exponential loss function)的多分類版本 AdaBoost。如果僅僅是二分類,SAMME和AdaBoost是等價的。

如果發現AdaBoost在訓練集上過擬合,可以減少評估器的數量,或者增加更強的正則約束。

7.5.2 Gradient Boosting

與AdaBoost類似,Gradient Boosting也是不停地增加預測器。不同的是,Gradient Boosting新增加的預測器,回去擬合其前任的殘差(residual errors)。該算法處理回歸任務表現很好,被稱作Gradient Tree Boosting或者Gradient Boosted Regression Trees (GBRT,梯度提升決策樹)。

與之類似的GBDT (Gradient Boosting Decision Tree)好像更出名一些。有空學習一下GBDT。

7.6 Stacking

stacking(stacked generalization的簡稱)是本章最后一個集成方法。該方法思想很簡單:與其使用簡陋的集成方法(比如硬投票),何不專門訓練一個集成方法?圖7-12展示了這一預測過程。底部的三個預測器給出了3個不同的結果(3.1、2.7、2.9),上面一個預測器(被稱作混合器,blendor)根據這3個結果,給出了最終的預測(3.0)。

圖7-12. 通過混合預測器進行集成預測

為了訓練blender,常用的方法是使用一個hold-out數據集(hold-out set)。其工作方式如下:

首先將訓練集划分為兩個子集,第一個子集用於訓練第一層的預測器,如圖7-13所示:

圖7-13. 訓練第一層

然后,使用第一層訓練出的預測器對第二個子集(也成為hold-out集)進行預測。現在hold-out集有三個預測值。這三個預測值和hold-out集的目標值組成新的訓練集,用於訓練blender,如圖7-14所示。

圖7-14. 訓練blender

此外,也可以再復雜一點,訓練多個blender。把訓練集分為3份。第一份訓練第一層,第二份用於產生第二層的訓練集,第三份用於產生第三次的訓練集。其預測過程如圖7-15所示。

7-15. 多層stacking ensemble預測流程

 

 Scikit-Learn並不直接支持stacking,不過github有開源實現:https://github.com/viisar/brew

 

 

參考文獻:Spark隨機深林擴展—OOB錯誤評估和變量權重


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM