機器學習:隨機森林(Random Forest)
隨機森林,Random Forest,簡稱RF,是一個很強大的模型。要研究隨機森林,首先要研究決策樹,然後再去看RF是怎麼通過多顆決策樹的整合提高的模型效果。
決策樹分為三種,分別是ID3、C4.5和CART決策樹:
ID3:資訊增益
C4.5:資訊增益率
CART:Gini係數
而隨機森林演算法中,“隨機”是這個模型的靈魂,“森林”只是一種簡單的組合方式而已。隨機森林在構建每棵樹的時候,為了保證每棵樹之間的獨立性,通常會採用兩到三層的隨機性。
1)從資料抽樣開始,每顆樹都隨機地在原有資料的基礎上進行有放回的抽樣。假定訓練資料有1萬條,隨機抽取8千條資料,因為是有放回的抽樣,可能原資料中有500條被抽了兩次,即最後的8千條中有500條是重複的資料。每顆樹都進行獨立的隨機抽樣,這樣保證了每顆樹學習到的資料側重點不一樣,保證了樹之間的獨立性。
2)抽取了資料,就可以開始構建決策分支了,在每次決策分支時,也需要加入隨機性,假設資料有20個特徵(屬性),每次只隨機取其中的幾個來判斷決策條件。假設取4個屬性,從這4個特徵中來決定當前的決策條件,即忽略其它的特徵。取特徵的個數,通常不能太小,太小了使得單顆樹的精度太低,太大了樹之間的相關性會加強,獨立性會減弱。通常取總特徵的平方根,或者log2(特徵數)+1,在scikit-learn的實現中,支援sqrt與log2,而spark還支援onethird(1/3)。
3)在結點進行分裂的時候,除了先隨機取固定個特徵,然後選擇最好的分裂屬性這種方式,還有一種方式,就是在最好的幾個(依然可以指定sqrt與log2)分裂屬性中隨機選擇一個來進行分裂。scikit-learn中實現了兩種隨機森林演算法,一種是RandomForest,另外一種是ExtraTrees,ExtraTrees就是用這種方式。在某些情況下,會比RandomForest精度略高。
總結來說,使用隨機性的三個地方如下:
1、隨機有放回的抽取資料;
2、隨機選取N個特徵,選擇最好的屬性進行分裂;
3、在N個最好的分裂特徵中,隨機選擇一個進行分裂;
這就是隨機森林的三個“隨機”所在,“隨機”的目的就是為了保證各個基演算法模型的相互獨立,從而提升組合後的精度。當然,還要保證每個基分類器不至於太弱,至少要強於隨機猜測,也就是錯誤率不要超過0.5。
呼叫RandomForestClassifier時的引數說明:
- n_estimators:指定森林中樹的顆數,越多越好,只是不要超過記憶體;
- criterion:指定在分裂使用的決策演算法;
- max_features:指定了在分裂時,隨機選取的特徵數目,sqrt即為全部特徵的平均根;
- min_samples_leaf:指定每顆決策樹完全生成,即葉子只包含單一的樣本;
- n_jobs:指定並行使用的程序數;
從隨機森林的構建過程來看,隨機森林的每棵樹之間都是獨立構建的,而且是儘量的往獨立的方向靠攏,不依賴其他樹的構建。就這一特點,就被大家所喜愛,因為這樣就可以做成並行的!
隨機森林基本上繼承了決策樹的全部優點,它只需要做很少的資料準備,其他演算法常常需要對資料做歸一化。決策樹能夠處理連續變數,也能處理離散變數,當然也能做多分類問題,多分類問題依然還是二叉樹。決策樹就是if-else語句,區別只是哪些條件寫在if,哪些寫在else,因此易於理解和解釋。
決策樹的可解釋性很強,你可以打印出整個樹來,從哪個因素開始決策的,一目瞭然。隨機森林的解釋性就沒這麼強了,因為引入了隨機抽取特徵,而且是多棵樹共同決定,樹一旦多了,很難說清楚得出結論的具體過程,雖然可以打印出每棵樹的結構,但是很難分析。
雖然不好解釋,但是RF解決了決策樹的過擬合問題,使模型的穩定性增加,對噪聲也更加魯棒,從而提升了整體預測精度。
因為隨機森林能計算引數的重要性,因此也可用於對資料的降維,只選取少量幾維重要的特徵來近似表示原資料。同理,在資料有眾多的特徵時,也可以用於特徵選擇,選擇關鍵的特徵用於演算法中。
最後,在大資料環境下,隨著森林中樹的增加,最後生成的模型可能過大,因為每顆樹都是完全生長,儲存了用於決策的全部資料,導致模型可能達到幾G甚至幾十G。如果用於線上的預測,光把模型載入到記憶體就需要很長時間,因此比較適合離線處理。