簡介
近年來,随機森林模型在界内的關注度與受歡迎程度有着顯著的提升,這多半歸功于它可以快速地被應用到幾乎任何的資料科學問題中去,進而使人們能夠高效快捷地獲得第一組基準測試結果。在各種各樣的問題中,随機森林一次又一次地展示出令人難以置信的強大,而與此同時它又是如此的友善實用。
需要大家注意的是,在上文中特别提到的是第一組測試結果,而非所有的結果,這是因為随機森林方法固然也有自己的局限性。在這篇文章中,我們将向你介紹運用随機森林建構預測模型時最令人感興趣的幾個方面。
随機森林的發展史
談及随機森林算法的産生與發展,我們必須回溯到20世紀80年代。可以說,該算法是Leo Breiman, Adele Cutler, Ho Tin Kam, Dietterich, Amit和Geman這幾位大師嘔心瀝血的共同結晶,他們中的每個人都對随機森林算法的早期發展作出了重要的貢獻。Leo Breiman和 Adele Cutler最早提出了執行随機森裡的關鍵算法,這一算法也成為了他們的專利之一。Amit, Gemen和Ho Tim Kam各自獨立地介紹了特征随即選擇的思想,并且運用了Breiman的“套袋”思想建構了控制方差的決策樹集合。在此之後,Deitterich在模型中引入了随即節點優化的思想,對随機森裡進行了進一步完善。
Leo Breiman
什麼是随機森林?
随機森林是一種多功能的機器學習算法,能夠執行回歸和分類的任務。同時,它也是一種資料降維手段,用于處理缺失值、異常值以及其他資料探索中的重要步驟,并取得了不錯的成效。另外,它還擔任了內建學習中的重要方法,在将幾個低效模型整合為一個高效模型時大顯身手。
在随機森林中,我們将生成很多的決策樹,并不像在CART模型裡一樣隻生成唯一的樹。當在基于某些屬性對一個新的對象進行分類判别時,随機森林中的每一棵樹都會給出自己的分類選擇,并由此進行“投票”,森林整體的輸出結果将會是票數最多的分類選項;而在回歸問題中,随機森林的輸出将會是所有決策樹輸出的平均值。
随機森林在Python和R中的實作
随機森林在R packages和Python scikit-learn中的實作是當下非常流行的,下列是在R和Python中載入随機森林模型的具體代碼:
Python
#Import Library
fromsklearn.ensemble import RandomForestClassifier #use RandomForestRegressor for regression problem
#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(n_estimators=1000)
# Train the model using the training sets and check score
model.fit(X, y)
#Predict Output
predicted= model.predict(x_test)
R Code
library(randomForest)
x<- cbind(x_train,y_train)
# Fitting model
fit<- randomForest(Species ~ ., x,ntree=500)
summary(fit)
#Predict Output
predicted= predict(fit,x_test)
好了,現在我們已經了解了運作随機森林算法的代碼,接下來讓我們看看這個算法本身的運作方式是什麼樣的吧!
随機森林算法是如何工作的?
在随機森林中,每一個決策樹“種植”和“生長”的規則如下所示:
1.假設我們設定訓練集中的樣本個數為N,然後通過有重置的重複多次抽樣來獲得這N個樣本,這樣的抽樣結果将作為我們生成決策樹的訓練集;
2.如果有M個輸入變量,每個節點都将随機選擇m(m<M)個特定的變量,然後運用這m個變量來确定最佳的分裂點。在決策樹的生成過程中,m的值是保持不變的;
3.每棵決策樹都最大可能地進行生長而不進行剪枝;
4.通過對所有的決策樹進行加總來預測新的資料(在分類時采用多數投票,在回歸時采用平均)。
随機森林的優點與缺點
優點:
1.正如上文所述,随機森林算法能解決分類與回歸兩種類型的問題,并在這兩個方面都有相當好的估計表現;
2.随機森林對于高維資料集的處理能力令人興奮,它可以處理成千上萬的輸入變量,并确定最重要的變量,是以被認為是一個不錯的降維方法。此外,該模型能夠輸出變量的重要性程度,這是一個非常便利的功能。下圖展示了随機森林對于變量重要性程度的輸出形式:
3.在對缺失資料進行估計時,随機森林是一個十分有效的方法。就算存在大量的資料缺失,随機森林也能較好地保持精确性;
4.當存在分類不平衡的情況時,随機森林能夠提供平衡資料集誤差的有效方法;
5.模型的上述性能可以被擴充運用到未标記的資料集中,用于引導無監督聚類、資料透視和異常檢測;
6.随機森林算法中包含了對輸入資料的重複自抽樣過程,即所謂的bootstrap抽樣。這樣一來,資料集中大約三分之一将沒有用于模型的訓練而是用于測試,這樣的資料被稱為out of bag samples,通過這些樣本估計的誤差被稱為out of bag error。研究表明,這種out of bag方法的與測試集規模同訓練集一緻的估計方法有着相同的精确程度,是以在随機森林中我們無需再對測試集進行另外的設定。
缺點:
1.随機森林在解決回歸問題時并沒有像它在分類中表現的那麼好,這是因為它并不能給出一個連續型的輸出。當進行回歸時,随機森林不能夠作出超越訓練集資料範圍的預測,這可能導緻在對某些還有特定噪聲的資料進行模組化時出現過度拟合。
2.對于許多統計模組化者來說,随機森林給人的感覺像是一個黑盒子——你幾乎無法控制模型内部的運作,隻能在不同的參數和随機種子之間進行嘗試。
調整随機森林模型中的參數
到目前為止,我們已經對整個随機森林模型進行了基本的了解,與此同時,對于模型中各種參數的調整與修改也十分重要,下列為python scikit-learn中随機森林模型的文法:
classsklearn.ensemble.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,bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0,warm_start=False, class_weight=None)
具體的參數說明這裡不再贅述,大家可以到scikit-learn.org的3.2.4.3.1章節進行檢視。
這些參數在調節随機森林模型的準确性方面起着至關重要的作用。科學地使用這些名額,将能顯著的提高模型工作效率。
結束語
在本文中,我們介紹了最常用的機器學習算法之一——随機森林,并對它的優缺點以及參數調整進行了說明,我們非常推薦大家在日常分析中使用随機森林,并通過參數調整進一步了解這個模型的分析能力。