集成模型之隨機森林(二)
來自專欄人工智慧隨筆8 人贊了文章
1 隨機森林原理
隨機森林(Random Forest,以下簡稱RF)是bagging的一個特化進階版。
- 所謂的特化是因為隨機森林使用了CART決策樹作為基學習器。
- 所謂的進階是隨機森林在bagging的樣本隨機採樣基礎上,又加上了特徵欄位的隨機選擇。這樣進一步增強了模型的泛化能力。
Q1: 為什麼叫做隨機森林?
隨機森林包含兩個關鍵詞,一個是「隨機」,一個就是「森林」。隨機森林的基學習器是決策樹,一個決策樹稱為「樹」,那多個決策樹聚集在一起便是森林了,這體現了隨機森林演算法的集成思想。 隨機森林的"隨機"有兩層含義,即樣本抽樣的隨機性和特徵抽樣的隨機性。
隨機森林的原理如下圖所示:
輸入:
- 樣本集 ,
- 弱分類器迭代次數T。
演算法流程:
- 對於第 棵樹而言:
- 隨機有放回地從訓練集中的抽取 m 個訓練樣本(bootstrap sample),作為該樹的訓練集 ;
- 從 中隨機選擇一部分特徵子集,訓練第 t 個決策樹模型;
- 每棵樹沒有剪枝過程,生長到指定的樹的深度。
2. 如果是分類演算法預測,則T個弱學習器投出最多票數的類別或者類別之一為最終類別。如果是回歸演算法,T個弱學習器得到的回歸結果進行算術平均得到的值為最終的模型輸出。
輸出:
最終的強分類器
Q2: 為什麼要進行隨機抽樣?
如果不進行隨機抽樣,每棵樹的訓練集都一樣,那麼最終訓練出的樹分類結果也是完全一樣的,依然沒有解決決策樹過擬合問題。隨機抽樣是為了保證不同決策樹之間的多樣性,從而提高模型的泛化能力。使得隨機森林不容易陷入過擬合,並且具有較好的抗噪能力(比如:對預設值不敏感)。
Q3: 為什麼要有放回地抽樣?
而隨機森林最後分類取決於多棵樹(弱分類器)的投票表決,這種表決應該是"求同"。如果是無放回的抽樣,那麼每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是"有偏的",從而影響最終的投票結果。為了保證最終結果的可靠性,同時又要保證模型的泛化能力,需要每一顆樹既要「求同「 又要 」存異」。
綜上,隨機森林的性能與兩個因素有關:
- 森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低。
- 森林中任意兩棵樹的相關性:相關性越大,泛化能力越弱;
減小特徵選擇個數n,樹的相關性和分類能力也會相應的降低;增大n,兩者也會隨之增大。所以選擇最優的n非常重要。
2. 隨機森林的特點
下面總結一下隨機的特點:
- 在當前所有演算法中,具有極好的準確率;
- 能夠在大數據集上有效地運行;
- 能夠處理具有高維特徵的輸入樣本,而且不需要降維;
- 能夠評估各個特徵的重要性;
- 在生成過程中,能夠獲取到內部生成誤差的一種無偏估計;
- 對於預設值問題也能夠獲得很好得結果;
- ...
Q4: 上面提到隨機森林可以評估特徵重要度,其原理是怎樣的呢?
- 對每一顆決策樹,選擇相應的袋外數據(OOB)計算袋外數據誤差,記為 errOOB1;
- 隨機對袋外數據OOB所有樣本的特徵加入雜訊干擾(隨機的改變樣本在該特徵的值),再次計算袋外數據誤差,記為 errOOB2;
- 特徵的重要度= ,N 表示隨機森林中決策樹的個數。
註:關於該問題,不同的文獻有不同的解釋,大致原理都差不多
當改變樣本在該特徵的值,若袋外數據準確率大幅度下降,則該特徵對於樣本的預測結果有很大影響,說明特徵的重要度比較高。
3. 隨機森林參數解讀
首先看一下sklearn中的隨機森林都包含哪些參數:
RandomForestClassifier(n_estimators=10, criterion=gini, max_depth=None, min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=auto, max_leaf_nodes=None, min_impurity_decrease=0.0, min_impurity_split=None, bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False, class_weight=None)
下面對幾個重要的參數進行分析:
1. n_estimators: RF中子樹的數量
較多的子樹可以讓模型有更好的性能,但同時會降低演算法的速度。在保證計算速度的同時,應選擇儘可能高的值。
2. max_depth:決策樹最大深度
默認決策樹在建立子樹的時候不會限制子樹的深度。
一般數據少或者特徵少的時候取默認值。如果樣本量多,特徵也多的情況下,需要根據數據量和特徵量進行設置。常用的取值範圍為10-100之間。
3. min_samples_split:內部節點再劃分所需最小樣本數
這個值限制了子樹繼續劃分的條件,如果某節點的樣本數少於min_samples_split,則不會繼續再嘗試選擇最優特徵來進行劃分。
默認是 2,如果樣本量不大,取默認值即可。如果樣本量非常大,則增大這個值。
4. min_samples_leaf:葉子節點最少樣本數
如果某葉子節點數目小於樣本數,則會和兄弟節點一起被剪枝。可以輸入最少的樣本數的整數,或者最少樣本數占樣本總數的百分比。
默認是1,如果樣本量不大,取默認值即可。如果樣本量非常大,則增大這個值。
5. max_features: RF允許單個決策樹使用特徵的最大數量。
取值為以下幾種 (下式中N為樣本總特徵數) :
- auto或sqrt:每顆子樹可以利用總特徵數的平方根個 。 例如,如果變數(特徵)的總數是100,所以每顆子樹只能取其中的10個。
- 「log2」:意味著劃分時最多考慮 個特徵 。
- 整數:代表考慮的特徵絕對數。 例如 5,就代表選取5個特徵。
- 浮點數 :代表考慮特徵總數的百分比。例如0.8表示每個隨機森林的子樹可以利用特徵數為80%*N。
增加max_features一般能提高模型的性能,因為在每個節點上,我們有更多的選擇可以考慮。 然而,會降低了單個樹的泛化能力,同時降低演算法的速度。 因此,你需要適當的平衡和選擇最佳max_features。
6. class_weight : 設置不同類別的樣本權重
默認所以的樣本權重均為1,當樣本類別分布比較均衡時,可以取默認值。當類別非均衡問題比較嚴重時,需要對該值進行設置,可以設置為"balanced",也可以設置字典{class_label: weight} 來自定義每個類別的樣本權重。
7. min_weight_fraction_leaf:葉子節點最小的樣本權重和
這個值限制了葉子節點所有樣本權重和的最小值,如果小於這個值,則會和兄弟節點一起被剪枝。
默認不考慮權重。如果我們缺失值較多,或者樣本類別非均衡問題比較嚴重,就需要考慮這個值。
8. oob_score:是否採用袋外數據驗證模型的泛化能力
默認不採用袋外數據驗證。個人建議設置為True。
關於袋外數據 集成模型概述(一) 已經介紹過。實際上,oob可以作為隨機森林交叉驗證的驗證集對模型的性能進行評估而無需額外的單獨設置驗證集。
總結一下:
以上1-5個參數是調優經常用到的參數,遇到樣本類別不均衡問題顯著時,需要調整6-7。
參考文獻:
Machine Learning & Algorithm] 隨機森林(Random Forest)
Random Forests
scikit-learn隨機森林調參小結
推薦閱讀:
※為什麼我的CNN石樂志?我只是平移了一下圖像而已
※30本最受歡迎的人工智慧書籍(Stack Overflow數據)
※Patchouli的機器學習系列教程八:邏輯回歸——『道』