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

森林顧名思義就是有很多樹,這裏的樹當然就是決策樹。實際上隨機森林就是將 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}

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} 中隨機選擇選取 dd^{\prime} 個特徵。該映射函數 Φ(x)\Phi ( \mathbf { x } ) 實現如下:

 when sampling index i1,i2,,iα:Φ(x)=(xi1,xi2,,xid) \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)

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

所以隨機森林的一種表現形式爲:
RF = bagging + random-subspace C&RT \text{RF = bagging + random-subspace C\&RT}

特徵擴展(Expansion)

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

Φ(x)=Px \Phi ( \mathbf { x } ) = \mathrm { P } \cdot \mathbf { x }

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

所以隨機森林的另一種表現形式爲:
RF = bagging + random-combination C&RT \text{RF = bagging + random-combination C\&RT}

OOB 估計(Out-Of-Bag Estimate)

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

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

NN 相當大時:
(11N)N=1(NN1)N=1(1+1N1)N1e \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 的樣本數量大概爲:1eN\frac { 1 } { e } N

雖然說 gtg_t 的 OOB 可以用於驗證 OOB,但是並不常用,這是因爲 bagging 這種算法針對的是全部的 gtg_t 的融合後的性能,那麼這裏提出 GnG _ { n } ^ { - },其數學表達如下:

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

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

那麼OOB誤差爲:

Eoob(G)=1Nn=1Nerr(yn,Gn(xn)) E _ { \mathrm { oob } } ( G ) = \frac { 1 } { N } \sum _ { n = 1 } ^ { N } \operatorname { err } \left( y _ { n } , G _ { n } ^ { - } \left( \mathbf { x } _ { n } \right) \right)

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

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

Gm=RFm(D)m=argmin1mMEmEm=Eoob(RFm(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}

即不需要將數據集 D\mathcal{D} 分爲 Dtrain\mathcal{D}_{\text{train}}Dval\mathcal{D}_{\text{val}}。不需要在驗證後再次訓練了。那麼該驗證方法便可以用於選擇特徵擴展中的 dd^{\prime \prime} 了。

特徵選擇

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

經過特徵選擇之後:
Φ(x)=(xi1,xi2,,xid) 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}

這樣做的優點:

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

這樣做事物缺點:

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

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

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

也就是說計算

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

然後根據分數選擇 top-dd^\prime 的特徵。

線性模型(Linear Model)

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

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

之後使用權重的絕對值作爲該特徵的評判分數:

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

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

排列測試(Permutation Test)

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

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

 importance (i)= performance (D) performance (D(p)) with D(p) is D with {xn,i} replaced by permuted {xn,i}n=1N \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 在驗證的同時計算特徵的重要性分數。

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

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

舉例說明

A Simple Data Set

在這裏插入圖片描述
左側是第900顆決策樹,實用 bootstrap 獲取的,其中 N=N/2N^{\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)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章