森林顧名思義就是有很多樹,這里的樹當然就是決策樹。實際上隨機森林就是將 fully-grown C&RT decision tree 作為 bagging 基模型(base model)。
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 } )\) 實現如下:
同時建議 \(d^{\prime} \ll d\),這樣的話對於 \(d\) 很大時,可以提高效率。
所以隨機森林的一種表現形式為:
特征擴展(Expansion)
特征擴展實際上也是特征映射,只是其映射函數不同而已,這里認為映射函數則是乘上一個映射矩陣。
在特征映射中,則是一個 \(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}\) 個非零項。
所以隨機森林的另一種表現形式為:
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\) 相當大時:
也就是說 OOB 的樣本數量大概為:\(\frac { 1 } { e } N\)
雖然說 \(g_t\) 的 OOB 可以用於驗證 OOB,但是並不常用,這是因為 bagging 這種算法針對的是全部的 \(g_t\) 的融合后的性能,那么這里提出 \(G _ { n } ^ { - }\),其數學表達如下:
其中 \(n\) 代表了樣本的索引,\(T^-\) 代表未使用第 \(n\) 個樣本的 \(g_t\) 個數, \((i_1,i_2,\cdots,i_{T^-})\) 表示的是這\(n\) 個樣本索引集合。
那么OOB誤差為:
所以 \(E _ { \mathrm { oob } }\) 是 bagging/RF 的自我驗證(self-validation),且在實際運用中可以准確估計 RF 的性能。
那么 bagging/RF 的驗證流程可以寫出:
即不需要將數據集 \(\mathcal{D}\) 分為 \(\mathcal{D}_{\text{train}}\) 和 \(\mathcal{D}_{\text{val}}\)。不需要在驗證后再次訓練了。那么該驗證方法便可以用於選擇特征擴展中的 \(d^{\prime \prime}\) 了。
特征選擇
特征選擇實際上就是刪除冗余特征(redundant features,比如年齡與生日)和不相關特征(irrelevant features,比如保險類型用於預測癌症)。
經過特征選擇之后:
這樣做的優點:
- 效率:更簡單假設函數和更短預測時間
- 泛化:消除了特征噪聲
- 可解釋性:因為重要才對這些特征進行研究
這樣做事物缺點:
- 計算消耗:特征選擇需要很高的時間消耗
- 過擬合:可能會選擇到可能很好,實際上不一定
- 不可解釋:只能解釋關聯性,但不能解釋因果關系
決策樹(decision tree)則是一種在構建過程中,同時篩選了特征的過程。
由於特征選擇可能存在爆炸性組合,那么通過重要性選擇(Feature Selection by Importance)可能可以一定程度上代替特征組合窮舉。重要性選擇指的是將每個特征進行打分,通過分數的高低選擇特征。
也就是說計算
然后根據分數選擇 top-\(d^\prime\) 的特征。
線性模型(Linear Model)
因為在線性模型中,輸出的分數(不是特征的重要性)是由 \(d\) 維特征線性組合得到的。當特征值 \(x_i\) 之間相差不大時,每個維度的特征的權重比較大時,那么這個特征可能更重要。所以先訓練出一個線性模型:
之后使用權重的絕對值作為該特征的評判分數:
但是如果使用非線性模型(數據非線性可分)的情況下,該方法不太適用。
排列測試(Permutation Test)
隨機測試指的是如果某個特征很重要,那么如果向特征加入隨機噪聲,那么一定會降低算法的性能。但是在機器學習的可行性分析中,可以得知,機器學習算法是基於獨立同分布這個前提的,也就是說如果在特征 \(i\) 中加入隨機噪聲,那么該特征的分布 \(P(x_i)\)。那么這樣操作的話,同時加入了分布的影響,所以比較合理的方法是間原來的第 \(i\) 維數據重新排列(Permutation),這樣的話分布不會改變。
那么根據這個思路寫出重要性(分數)計算公式如下:
對於任意的非線性模型,排列測試(Permutation Test)都是一個常用的統計學工具。
由於需要使用驗證進行性能測試,所以在隨機森林中,則使用 permuted OOB 和 OOB 在驗證的同時計算特征的重要性分數。
隨機森林通過 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)