隨機森林演算法原理剖析

獵手家園發表於2017-06-01

隨機森林演算法
  整合學習有兩個流派,一個是boosting派系,它的特點是各個弱學習器之間有依賴關係。另一種是bagging流派,它的特點是各個弱學習器之間沒有依賴關係,可以並行擬合。
  隨機森林是整合學習中可以和梯度提升樹GBDT分庭抗禮的演算法,尤其是它可以很方便的並行訓練,在如今大資料大樣本的的時代很有誘惑力。

  隨機森林是一種比較新的機器學習模型,經典的機器學習模型是神經網路。神經網路預測精確,但是計算量很大。

  2001年Breiman把分類樹組合成隨機森林(Breiman 2001a),即在變數(列)的使用和資料(行)的使用上進行隨機化,生成很多分類樹,再彙總分類樹的結果。隨機森林在運算量沒有顯著提高的前提下提高了預測精度。
隨機森林對多元公線性不敏感,結果對缺失資料和非平衡的資料比較穩健,可以很好地預測多達幾千個解釋變數的作用(Breiman 2001b),被譽為當前最好的演算法之一(Iverson et al. 2008)。

  隨機森林顧名思義,是用隨機的方式建立一個森林,森林裡面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類(對於分類演算法),然後看看哪一類被選擇最多,就預測這個樣本為那一類。

隨機森林演算法原理:
  隨機森林是從原始訓練樣本集N中有放回地重複隨機抽取k個樣本生成新的訓練樣本集合,然後根據自助樣本集生成k個分類樹組成隨機森林,新資料的分類結果按分類樹投票多少形成的分數而定。其實質是對決策樹演算法的一種改進,將多個決策樹合併在一起,每棵樹的建立依賴於一個獨立抽取的樣品,森林中的每棵樹具有相同的分佈,分類誤差取決於每一棵樹的分類能力和它們之間的相關性。特徵選擇採用隨機的方法去分裂每一個節點,然後比較不同情況下產生的誤差。能夠檢測到的內在估計誤差、分類能力和相關性決定選擇特徵的數目。單棵樹的分類能力可能很小,但在隨機產生大量的決策樹後,一個測試樣品可以透過每一棵樹的分類結果經統計後選擇最可能的分類。

  在建立每一棵決策樹的過程中,有兩點需要注意取樣與完全分裂。首先是兩個隨機取樣的過程,random forest對輸入的資料要進行行、列的取樣。對於行取樣,採用有放回的方式,也就是在取樣得到的樣本集合中,可能有重複的樣本。假設輸入樣本為N個,那麼取樣的樣本也為N個。這樣使得在訓練的時候,每一棵樹的輸入樣本都不是全部的樣本,使得相對不容易出現over-fitting。然後進行列取樣,從M個feature中,選擇m個(m << M)。之後就是對取樣之後的資料使用完全分裂的方式建立出決策樹,這樣決策樹的某一個葉子節點要麼是無法繼續分裂的,要麼裡面的所有樣本的都是指向的同一個分類。一般很多的決策樹演算法都一個重要的步驟——剪枝,但是這裡不這樣幹,由於之前的兩個隨機取樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。

關於隨機:
(1)訓練每棵樹時,從全部訓練樣本中選取一個子集進行訓練(即bootstrap取樣)。用剩餘的資料進行評測,評估其誤差;
(2)在每個節點,隨機選取所有特徵的一個子集,用來計算最佳分割方式。

演算法流程:
(1)訓練總樣本的個數為N,則單棵決策樹從N個訓練集中有放回的隨機抽取n個作為此單顆樹的訓練樣本(bootstrap有放回取樣)。
(2)令訓練樣例的輸入特徵的個數為M,m遠遠小於M,則我們在每顆決策樹的每個節點上進行分裂時,從M個輸入特徵裡隨機選擇m個輸入特徵,然後從這m個輸入特徵裡選擇一個最好的進行分裂。m在構建決策樹的過程中不會改變。
注意:要為每個節點隨機選出m個特徵,然後選擇最好的那個特徵來分裂。
注意:決策樹中分裂屬性的兩個選擇度量:資訊增益和基尼指數。
(3)每棵樹都一直這樣分裂下去,直到該節點的所有訓練樣例都屬於同一類,不需要剪枝。由於之前的兩個隨機取樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。

結果判定:
(1)目標特徵為數字型別:取t個決策樹的平均值作為分類結果。
(2)目標特徵為類別型別:少數服從多數,取單棵樹分類結果最多的那個類別作為整個隨機森林的分類結果。

預測:
  隨機森林是用隨機的方式建立一個森林,森林裡面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之後,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬於哪一類,然後看看哪一類被選擇最多,就預測這個樣本為那一類。
  說明:透過bagging有放回取樣後,大約36.8%的沒有被取樣到的資料,我們常常稱之為袋外資料。這些資料沒有參與訓練集模型的擬合,因此可以用來檢測模型的泛化能力。

相關文章