機器學習演算法總結--隨機森林
簡介
隨機森林指的是利用多棵樹對樣本進行訓練並預測的一種分類器。它是由多棵CART(Classification And Regression Tree)構成的。對於每棵樹,其使用的訓練集是從總的訓練集中有放回取樣出來的,這意味著總訓練集中有些樣本可能多次出現在一棵樹的訓練集中,也可能從未出現在一棵樹的訓練集中。在訓練每棵樹的節點時,使用的特徵是從所有特徵中按照一定比例隨機地無放回的抽取的,假設總的特徵數是
M
,則這個比例可以是(√M),12(√M),2(√M) 。
訓練過程
隨機森林的訓練過程可以總結如下:
(1)給定訓練集S
,測試集T
,特徵維數F
。確定引數:使用到的CART的數量t
d
,每個節點使用到的特徵數量f
,終止條件:節點上最少樣本數s
,節點上最少的資訊增益m
對於第1-t棵樹,i=1-t
:
(2)從S中有放回的抽取大小和S一樣的訓練集S(i),作為根節點的樣本,從根節點開始訓練
(3)如果當前節點上達到終止條件,則設定當前節點為葉子節點,如果是分類問題,該葉子節點的預測輸出為當前節點樣本集合中數量最多的那一類c(j)
,概率p
為c(j)
佔當前樣本集的比例;如果是迴歸問題,預測輸出為當前節點樣本集各個樣本值的平均值。然後繼續訓練其他節點。如果當前節點沒有達到終止條件,則從F維特徵中無放回的隨機選取f維特徵。利用這f維特徵,尋找分類效果最好的一維特徵k
th
,當前節點上樣本第k維特徵小於th
的樣本被劃分到左節點,其餘的被劃分到右節點。繼續訓練其他節點。有關分類效果的評判標準在後面會講。
(4)重複(2)(3)直到所有節點都訓練過了或者被標記為葉子節點。
(5)重複(2),(3),(4)直到所有CART都被訓練過。
預測過程
預測過程如下:
對於第1-t棵樹,i=1-t:
(1)從當前樹的根節點開始,根據當前節點的閾值th,判斷是進入左節點(<th
)還是進入右節點(>=th
),直到到達,某個葉子節點,並輸出預測值。
(2)重複執行(1)直到所有t棵樹都輸出了預測值。如果是分類問題,則輸出為所有樹中預測概率總和最大的那一個類,即對每個c(j)的p進行累計;如果是迴歸問題,則輸出為所有樹的輸出的平均值。
有關分類效果的評判標準,因為使用的是CART,因此使用的也是CART的評判標準,和C3.0,C4.5都不相同。
對於分類問題(將某個樣本劃分到某一類),也就是離散變數問題,CART使用Gini值作為評判標準。定義為
例如:分為2類,當前節點上有100個樣本,屬於第一類的樣本有70個,屬於第二類的樣本有30個,則
對於迴歸問題,相對更加簡單,直接使用
特徵重要性度量
計算某個特徵X的重要性時,具體步驟如下:
對每一顆決策樹,選擇相應的袋外資料(out of bag,OOB)計算袋外資料誤差,記為errOOB1.
所謂袋外資料是指,每次建立決策樹時,通過重複抽樣得到一個數據用於訓練決策樹,這時還有大約1/3的資料沒有被利用,沒有參與決策樹的建立。這部分資料可以用於對決策樹的效能進行評估,計算模型的預測錯誤率,稱為袋外資料誤差。
這已經經過證明是無偏估計的,所以在隨機森林演算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
隨機對袋外資料OOB所有樣本的特徵X加入噪聲干擾(可以隨機改變樣本在特徵X處的值),再次計算袋外資料誤差,記為errOOB2。
- 假設森林中有N棵樹,則特徵X的重要性=
∑errOOB2−errOOB1N 。這個數值之所以能夠說明特徵的重要性是因為,如果加入隨機噪聲後,袋外資料準確率大幅度下降(即errOOB2上升),說明這個特徵對於樣本的預測結果有很大影響,進而說明重要程度比較高。
特徵選擇
在特徵重要性的基礎上,特徵選擇的步驟如下:
- 計算每個特徵的重要性,並按降序排序
- 確定要剔除的比例,依據特徵重要性剔除相應比例的特徵,得到一個新的特徵集
- 用新的特徵集重複上述過程,直到剩下m個特徵(m為提前設定的值)。
- 根據上述過程中得到的各個特徵集和特徵集對應的袋外誤差率,選擇袋外誤差率最低的特徵集。
優點
- 在資料集上表現良好
- 在當前的很多資料集上,相對其他演算法有著很大的優勢
- 它能夠處理很高維度(feature很多)的資料,並且不用做特徵選擇
- 在訓練完後,它能夠給出哪些feature比較重要
- 在建立隨機森林的時候,對generlization error使用的是無偏估計
- 訓練速度快
- 在訓練過程中,能夠檢測到feature間的互相影響
- 容易做成並行化方法
- 實現比較簡單
程式碼實現
簡單使用sklearn中隨機森林演算法的例子:
#Import Library
from sklearn.ensemble import RandomForestClassifier
#Assumed you have, X (predictor) and Y (target) for training data set and x_test(predictor) of test_dataset
# Create Random Forest object
model= RandomForestClassifier()
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
此外,OpenCV中也實現了隨機森林演算法。具體使用例子可以檢視RandomForest隨機森林總結。