機器學習技法 之 隨機森林(Random Forest)


森林顧名思義就是有很多樹,這里的樹當然就是決策樹。實際上隨機森林就是將 fully-grown C&RT decision tree 作為 bagging 基模型(base model)。

\[\text{random forest (RF) = bagging + fully-grown C\&RT decision tree} \]

bagging 會減小方差(variance),而一顆完全長成樹的方差會很大,兩種相互補足。所以隨機森林有以下優點:

  • highly parallel/efficient to learn(效率高,可並行處理)
  • inherit pros of C&RT(繼承 C&RT 的優點)
  • eliminate cons of fully-grown tree(彌補 完全長成樹的缺點)

隨機特征空間(Feature Expansion/Projection)

在 bagging 中使用 bootstrap 獲取隨機數據,實現多樣化。那么還有什么方法呢,那便是從特征出發,類似於非線性轉換函數,挖掘出不一樣的特征空間。隨機森林中提出兩種方法特征映射和特征擴展。

特征映射(Projection)

特征映射實際上是從原來的特征 \(\mathbf{x}\) 中隨機選擇選取 \(d^{\prime}\) 個特征。該映射函數 \(\Phi ( \mathbf { x } )\) 實現如下:

\[\text { when sampling index } i _ { 1 } , i _ { 2 } , \ldots , i _ { \alpha ^ { \prime } } : \Phi ( \mathbf { x } ) = \left( x _ { i _ { 1 } } , x _ { i _ { 2 } } , \ldots , x _ { i _ { d ^ { \prime } } } \right) \]

同時建議 \(d^{\prime} \ll d\),這樣的話對於 \(d\) 很大時,可以提高效率。

所以隨機森林的一種表現形式為:

\[\text{RF = bagging + random-subspace C\&RT} \]

特征擴展(Expansion)

特征擴展實際上也是特征映射,只是其映射函數不同而已,這里認為映射函數則是乘上一個映射矩陣。

\[\Phi ( \mathbf { x } ) = \mathrm { P } \cdot \mathbf { x } \]

在特征映射中,則是一個 \(d^{\prime}\)\(N\) 列的矩陣,且每一行每列均為單位向量(natural basis)。在特征擴展中,則該映射矩陣的維度不變,但是每一行都是一個隨機生成的向量(不再是單位向量),映射后的每一個特征則是多個特征的線性組合(combination),即\(\text { projection (combination) with random row } \mathbf { p } _ { i } \text { of } \mathrm { P } : \phi _ { i } ( \mathbf { x } ) = \mathbf { p } _ { i } ^ { T } \mathbf { x }\),,但是建議該向量是一個稀疏向量只有 \(d^{\prime \prime}\) 個非零項。

所以隨機森林的另一種表現形式為:

\[\text{RF = bagging + random-combination C\&RT} \]

OOB 估計(Out-Of-Bag Estimate)

由於在 bagging 中使用了 bootstrap 獲取隨機樣本,那么便會導致有很多數據未被采樣到,這些樣本並未被用於獲取 \(g_t\),所以這些樣本叫做 \(g_t\) 的袋外樣本(out-of-bag (OOB) examples)。

那么對於一個樣本量為 \(N\) 的數據集,一個樣本在 bootstraping 中未被采樣的概率是 \(\left( 1 - \frac { 1 } { N } \right) ^ { N }\)

\(N\) 相當大時:

\[\left( 1 - \frac { 1 } { N } \right) ^ { N } = \frac { 1 } { \left( \frac { N } { N - 1 } \right) ^ { N } } = \frac { 1 } { \left( 1 + \frac { 1 } { N - 1 } \right) ^ { N } } \approx \frac { 1 } { e } \]

也就是說 OOB 的樣本數量大概為:\(\frac { 1 } { e } N\)

雖然說 \(g_t\) 的 OOB 可以用於驗證 OOB,但是並不常用,這是因為 bagging 這種算法針對的是全部的 \(g_t\) 的融合后的性能,那么這里提出 \(G _ { n } ^ { - }\),其數學表達如下:

\[G _ { n } ^ { - } ( \mathbf { x } ) = \operatorname { average } \left( g _ { i_1 } , g _ { i_2 },\cdots , g _ { i_{T^- }} \right) \]

其中 \(n\) 代表了樣本的索引,\(T^-\) 代表未使用第 \(n\) 個樣本的 \(g_t\) 個數, \((i_1,i_2,\cdots,i_{T^-})\) 表示的是這\(n\) 個樣本索引集合。

那么OOB誤差為:

\[E _ { \mathrm { oob } } ( G ) = \frac { 1 } { N } \sum _ { n = 1 } ^ { N } \operatorname { err } \left( y _ { n } , G _ { n } ^ { - } \left( \mathbf { x } _ { n } \right) \right) \]

所以 \(E _ { \mathrm { oob } }\) 是 bagging/RF 的自我驗證(self-validation),且在實際運用中可以准確估計 RF 的性能。

那么 bagging/RF 的驗證流程可以寫出:

\[\begin{aligned} G _ { m ^ { * } } & = \mathrm { RF } _ { m ^ { * } } ( \mathcal { D } ) \\ m ^ { * } & = \underset { 1 \leq m \leq M } { \operatorname { argmin } } E _ { m } \\ E _ { m } & = E _ { \mathrm { oob } } \left( \mathrm { RF } _ { m } ( \mathcal { D } ) \right) \end{aligned} \]

即不需要將數據集 \(\mathcal{D}\) 分為 \(\mathcal{D}_{\text{train}}\)\(\mathcal{D}_{\text{val}}\)。不需要在驗證后再次訓練了。那么該驗證方法便可以用於選擇特征擴展中的 \(d^{\prime \prime}\) 了。

特征選擇

特征選擇實際上就是刪除冗余特征(redundant features,比如年齡與生日)和不相關特征(irrelevant features,比如保險類型用於預測癌症)。

經過特征選擇之后:

\[\begin{aligned}& \Phi ( \mathrm { x } ) = \left( x_ { i _ { 1 } } , x _ { i _ { 2 } } , \cdots, x _ { i _ { d ^ { \prime } } } \right) \\ &\text { with } d ^ { \prime } < d \text { for } g ( \Phi ( \mathbf { x } ) ) \end{aligned} \]

這樣做的優點:

  • 效率:更簡單假設函數和更短預測時間
  • 泛化:消除了特征噪聲
  • 可解釋性:因為重要才對這些特征進行研究

這樣做事物缺點:

  • 計算消耗:特征選擇需要很高的時間消耗
  • 過擬合:可能會選擇到可能很好,實際上不一定
  • 不可解釋:只能解釋關聯性,但不能解釋因果關系

決策樹(decision tree)則是一種在構建過程中,同時篩選了特征的過程。

由於特征選擇可能存在爆炸性組合,那么通過重要性選擇(Feature Selection by Importance)可能可以一定程度上代替特征組合窮舉。重要性選擇指的是將每個特征進行打分,通過分數的高低選擇特征。

也就是說計算

\[\text { importance } (i )\text { for } i = 1,2 , \ldots , d \]

然后根據分數選擇 top-\(d^\prime\) 的特征。

線性模型(Linear Model)

因為在線性模型中,輸出的分數(不是特征的重要性)是由 \(d\) 維特征線性組合得到的。當特征值 \(x_i\) 之間相差不大時,每個維度的特征的權重比較大時,那么這個特征可能更重要。所以先訓練出一個線性模型:

\[\text { score } = \mathbf { w } ^ { T } \mathbf { x } = \sum _ { i = 1 } ^ { d } w _ { i } x _ { i } \]

之后使用權重的絕對值作為該特征的評判分數:

\[\text { importance } ( i ) = \left| w _ { i } \right| \text { with some 'good' } \mathrm { w } \]

但是如果使用非線性模型(數據非線性可分)的情況下,該方法不太適用。

排列測試(Permutation Test)

隨機測試指的是如果某個特征很重要,那么如果向特征加入隨機噪聲,那么一定會降低算法的性能。但是在機器學習的可行性分析中,可以得知,機器學習算法是基於獨立同分布這個前提的,也就是說如果在特征 \(i\) 中加入隨機噪聲,那么該特征的分布 \(P(x_i)\)。那么這樣操作的話,同時加入了分布的影響,所以比較合理的方法是間原來的第 \(i\) 維數據重新排列(Permutation),這樣的話分布不會改變。

那么根據這個思路寫出重要性(分數)計算公式如下:

\[\begin{array} { c } \text { importance } ( i ) = \text { performance } ( \mathcal { D } ) - \text { performance } \left( \mathcal { D } ^ { ( p ) } \right) \\\\ \text { with } \mathcal { D } ^ { ( p ) } \text { is } \mathcal { D } \text { with } \left\{ x _ { n , i } \right\} \text { replaced by permuted } \left\{ x _ { n , i } \right\} _ { n = 1 } ^ { N } \end{array} \]

對於任意的非線性模型,排列測試(Permutation Test)都是一個常用的統計學工具。

由於需要使用驗證進行性能測試,所以在隨機森林中,則使用 permuted OOB 和 OOB 在驗證的同時計算特征的重要性分數。

\[\text { importance } ( i ) = E _ { \mathrm { oob } } ( G ) - E _ { \mathrm { oob } } ^ { ( p ) } ( G ) \]

隨機森林通過 permutation + OOB 實現特征選擇,這一操作常常是有效且實用的,所以在實踐過程中如果遇到 non-linear 的特征選擇問題,常常選擇隨機森林進行初步的特征選擇。

舉例說明

A Simple Data Set

在這里插入圖片描述
左側是第900顆決策樹,實用 bootstrap 獲取的,其中 \(N^{\prime} = N/2\)。右側是使用900顆決策樹的隨機森林,可以看出決策樹越多,邊界越趨於平滑且類似(趨)於大間隔(邊界位於正負樣本之間)。

A Complicated Data Set

在這里插入圖片描述
可以看出隨着決策樹個數增加,更容易處理非線性問題。

A Complicated and Noisy Data Set

在這里插入圖片描述
可以看出隨着樹的增加,噪聲隨着投票可能會得到糾正(noise corrected by voting)。

可以看出理論上來說對於隨機森林,決策樹越多越好(the more, the ‘better’)。那么需要多少呢,因為不可能無窮多,並且需要考慮時間消耗和模型復雜度導致的過擬合。

因為隨機森林很隨機,所以如果整個過程都很隨機,那么最好多次檢測是否樹的個數足夠多,以保證算法穩定性。(if the whole random process too unstable should double-check stability of G to ensure enough trees)


免責聲明!

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



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