森林顧名思義就是有很多樹,這裏的樹當然就是決策樹。實際上隨機森林就是將 fully-grown C&RT decision tree 作爲 bagging 基模型(base model)。
random forest (RF) = bagging + fully-grown C&RT decision tree
\text{random forest (RF) = bagging + fully-grown C\&RT decision tree}
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)
特徵映射實際上是從原來的特徵 x \mathbf{x} x 中隨機選擇選取 d ′ d^{\prime} d ′ 個特徵。該映射函數 Φ ( x ) \Phi ( \mathbf { x } ) Φ ( x ) 實現如下:
when sampling index i 1 , i 2 , … , i α ′ : Φ ( x ) = ( x i 1 , x i 2 , … , x i d ′ )
\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)
when sampling index i 1 , i 2 , … , i α ′ : Φ ( x ) = ( x i 1 , x i 2 , … , x i d ′ )
同時建議 d ′ ≪ d d^{\prime} \ll d d ′ ≪ d ,這樣的話對於 d d d 很大時,可以提高效率。
所以隨機森林的一種表現形式爲:
RF = bagging + random-subspace C&RT
\text{RF = bagging + random-subspace C\&RT}
RF = bagging + random-subspace C&RT
特徵擴展(Expansion)
特徵擴展實際上也是特徵映射,只是其映射函數不同而已,這裏認爲映射函數則是乘上一個映射矩陣。
Φ ( x ) = P ⋅ x
\Phi ( \mathbf { x } ) = \mathrm { P } \cdot \mathbf { x }
Φ ( x ) = P ⋅ x
在特徵映射中,則是一個 d ′ d^{\prime} d ′ 行 N N N 列的矩陣,且每一行每列均爲單位向量(natural basis)。在特徵擴展中,則該映射矩陣的維度不變,但是每一行都是一個隨機生成的向量(不再是單位向量),映射後的每一個特徵則是多個特徵的線性組合(combination),即 projection (combination) with random row p i of P : ϕ i ( x ) = p i T x \text { projection (combination) with random row } \mathbf { p } _ { i } \text { of } \mathrm { P } : \phi _ { i } ( \mathbf { x } ) = \mathbf { p } _ { i } ^ { T } \mathbf { x } projection (combination) with random row p i of P : ϕ i ( x ) = p i T x ,,但是建議該向量是一個稀疏向量只有 d ′ ′ d^{\prime \prime} d ′ ′ 個非零項。
所以隨機森林的另一種表現形式爲:
RF = bagging + random-combination C&RT
\text{RF = bagging + random-combination C\&RT}
RF = bagging + random-combination C&RT
OOB 估計(Out-Of-Bag Estimate)
由於在 bagging 中使用了 bootstrap 獲取隨機樣本,那麼便會導致有很多數據未被採樣到,這些樣本並未被用於獲取 g t g_t g t ,所以這些樣本叫做 g t g_t g t 的袋外樣本(out-of-bag (OOB) examples)。
那麼對於一個樣本量爲 N N N 的數據集,一個樣本在 bootstraping 中未被採樣的概率是 ( 1 − 1 N ) N \left( 1 - \frac { 1 } { N } \right) ^ { N } ( 1 − N 1 ) N 。
當 N N N 相當大時:
( 1 − 1 N ) N = 1 ( N N − 1 ) N = 1 ( 1 + 1 N − 1 ) N ≈ 1 e
\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 }
( 1 − N 1 ) N = ( N − 1 N ) N 1 = ( 1 + N − 1 1 ) N 1 ≈ e 1
也就是說 OOB 的樣本數量大概爲:1 e N \frac { 1 } { e } N e 1 N
雖然說 g t g_t g t 的 OOB 可以用於驗證 OOB,但是並不常用,這是因爲 bagging 這種算法針對的是全部的 g t g_t g t 的融合後的性能,那麼這裏提出 G n − G _ { n } ^ { - } G n − ,其數學表達如下:
G n − ( x ) = average ( g i 1 , g i 2 , ⋯ , g i T − )
G _ { n } ^ { - } ( \mathbf { x } ) = \operatorname { average } \left( g _ { i_1 } , g _ { i_2 },\cdots , g _ { i_{T^- }} \right)
G n − ( x ) = a v e r a g e ( g i 1 , g i 2 , ⋯ , g i T − )
其中 n n n 代表了樣本的索引,T − T^- T − 代表未使用第 n n n 個樣本的 g t g_t g t 個數, ( i 1 , i 2 , ⋯ , i T − ) (i_1,i_2,\cdots,i_{T^-}) ( i 1 , i 2 , ⋯ , i T − ) 表示的是這n n n 個樣本索引集合。
那麼OOB誤差爲:
E o o b ( G ) = 1 N ∑ n = 1 N err ( y n , G n − ( x n ) )
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 o o b ( G ) = N 1 n = 1 ∑ N e r r ( y n , G n − ( x n ) )
所以 E o o b E _ { \mathrm { oob } } E o o b 是 bagging/RF 的自我驗證(self-validation),且在實際運用中可以準確估計 RF 的性能。
那麼 bagging/RF 的驗證流程可以寫出:
G m ∗ = R F m ∗ ( D ) m ∗ = argmin 1 ≤ m ≤ M E m E m = E o o b ( R F m ( D ) )
\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}
G m ∗ m ∗ E m = R F m ∗ ( D ) = 1 ≤ m ≤ M a r g m i n E m = E o o b ( R F m ( D ) )
即不需要將數據集 D \mathcal{D} D 分爲 D train \mathcal{D}_{\text{train}} D train 和 D val \mathcal{D}_{\text{val}} D val 。不需要在驗證後再次訓練了。那麼該驗證方法便可以用於選擇特徵擴展中的 d ′ ′ d^{\prime \prime} d ′ ′ 了。
特徵選擇
特徵選擇實際上就是刪除冗餘特徵(redundant features,比如年齡與生日)和不相關特徵(irrelevant features,比如保險類型用於預測癌症)。
經過特徵選擇之後:
Φ ( x ) = ( x i 1 , x i 2 , ⋯ , x i d ′ ) with d ′ < d for g ( Φ ( x ) )
\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}
Φ ( x ) = ( x i 1 , x i 2 , ⋯ , x i d ′ ) with d ′ < d for g ( Φ ( x ) )
這樣做的優點:
效率:更簡單假設函數和更短預測時間
泛化:消除了特徵噪聲
可解釋性:因爲重要纔對這些特徵進行研究
這樣做事物缺點:
計算消耗:特徵選擇需要很高的時間消耗
過擬合:可能會選擇到可能很好,實際上不一定
不可解釋:只能解釋關聯性,但不能解釋因果關係
決策樹(decision tree)則是一種在構建過程中,同時篩選了特徵的過程。
由於特徵選擇可能存在爆炸性組合,那麼通過重要性選擇(Feature Selection by Importance)可能可以一定程度上代替特徵組合窮舉 。重要性選擇指的是將每個特徵進行打分,通過分數的高低選擇特徵。
也就是說計算
importance ( i ) for i = 1 , 2 , … , d
\text { importance } (i )\text { for } i = 1,2 , \ldots , d
importance ( i ) for i = 1 , 2 , … , d
然後根據分數選擇 top-d ′ d^\prime d ′ 的特徵。
線性模型(Linear Model)
因爲在線性模型中,輸出的分數(不是特徵的重要性)是由 d d d 維特徵線性組合得到的。當特徵值 x i x_i x i 之間相差不大時,每個維度的特徵的權重比較大時,那麼這個特徵可能更重要。所以先訓練出一個線性模型:
score = w T x = ∑ i = 1 d w i x i
\text { score } = \mathbf { w } ^ { T } \mathbf { x } = \sum _ { i = 1 } ^ { d } w _ { i } x _ { i }
score = w T x = i = 1 ∑ d w i x i
之後使用權重的絕對值作爲該特徵的評判分數:
importance ( i ) = ∣ w i ∣ with some ’good’ w
\text { importance } ( i ) = \left| w _ { i } \right| \text { with some 'good' } \mathrm { w }
importance ( i ) = ∣ w i ∣ with some ’good’ w
但是如果使用非線性模型(數據非線性可分)的情況下,該方法不太適用。
排列測試(Permutation Test)
隨機測試指的是如果某個特徵很重要,那麼如果向特徵加入隨機噪聲,那麼一定會降低算法的性能。但是在機器學習的可行性分析中,可以得知,機器學習算法是基於獨立同分布這個前提的,也就是說如果在特徵 i i i 中加入隨機噪聲,那麼該特徵的分佈 P ( x i ) P(x_i) P ( x i ) 。那麼這樣操作的話,同時加入了分佈的影響,所以比較合理的方法是間原來的第 i i i 維數據重新排列(Permutation),這樣的話分佈不會改變。
那麼根據這個思路寫出重要性(分數)計算公式如下:
importance ( i ) = performance ( D ) − performance ( D ( p ) ) with D ( p ) is D with { x n , i } replaced by permuted { x n , i } n = 1 N
\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}
importance ( i ) = performance ( D ) − performance ( D ( p ) ) with D ( p ) is D with { x n , i } replaced by permuted { x n , i } n = 1 N
對於任意的非線性模型,排列測試(Permutation Test)都是一個常用的統計學工具。
由於需要使用驗證進行性能測試,所以在隨機森林中,則使用 permuted OOB 和 OOB 在驗證的同時計算特徵的重要性分數。
importance ( i ) = E o o b ( G ) − E o o b ( p ) ( G )
\text { importance } ( i ) = E _ { \mathrm { oob } } ( G ) - E _ { \mathrm { oob } } ^ { ( p ) } ( G )
importance ( i ) = E o o b ( G ) − E o o b ( p ) ( G )
隨機森林通過 permutation + OOB 實現特徵選擇,這一操作常常是有效且實用的,所以在實踐過程中如果遇到 non-linear 的特徵選擇問題,常常選擇隨機森林進行初步的特徵選擇。
舉例說明
A Simple Data Set
左側是第900顆決策樹,實用 bootstrap 獲取的,其中 N ′ = N / 2 N^{\prime} = N/2 N ′ = 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)