机器学习-集成学习:随机森林(Random Forest)
?內容參考:https://github.com/NLP-LOVE/ML-NLP/tree/master/Machine%20Learning/3.1%20Random%20Forest?????
略做修改?
0.集成學習
如果你隨機向幾千專家詢問一個復雜的問題,然后匯總他們的回答,在許多情況下,你會發現,這個匯總的答案比最好的那個專家回答得要好。同樣,如果你聚合一組預測器(比如分類器或者回歸器)的預測,得到的預測結果也比最好的單個預測器要好,這種聚合一組預測器來進行預測的方法,稱為集成學習。
例如,你可以訓練一組決策樹分類器,每一顆樹都基于訓練集不同的子集進行訓練,在做預測時,你只需要獲得所有樹的預測,然后給出票數最多的類別作為預測結果。
?常見的集成學習方法包括:bagging,Random-Forest,boosting,stacking等
1.什么是隨機森林
1.1 Bagging思想
Bagging(bootstrap aggregating的縮寫,bootstrap在統計學中是放回重新采用方法,采用時樣本不放回就是pasting)。思想就是從總體樣本當中隨機取一部分樣本進行訓練,通過多次這樣的結果,進行投票獲取平均值作為結果輸出,這就極大可能的避免了不好的樣本數據,從而提高準確度。與直接在原始訓練集上的單個預測器相比,集成學習的偏差相近,但方差更低。
Scikit-learn提供了一個簡單的API,可用BaggingClassifier進行Bagging或者Pasting(或者BaggingRegressor用于回歸)。以下代碼訓練一個包含500顆決策樹分類器繼承,每次隨機從訓練集中采用100個實例進行訓練,然后放回(如果想使用pasting,只需設置設置bootstrap=False),參數n_jobs用來指示Scikit-learn用多少CPU內核來進行訓練和預測(-1表示讓Scikit-learn使用所有可用的內核)
from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifierbag_clf = BaggingClassifier(DecisionTreeClassifier(random_state=42), n_estimators=500,max_samples=100, bootstrap=True, n_jobs=-1, random_state=42) bag_clf.fit(X_train, y_train) y_pred = bag_clf.predict(X_test)下圖比較了單個決策樹和一個由500個決策樹組成的bagging集成方法的決策邊界,可以看出集成預測的泛化效果很可能比單獨的決策樹要更好一些,二者偏差相近,但是繼承方法方差要更小(兩邊訓練集上的錯誤數量差不多,但是集成的決策邊界更加光滑)
??
1.2 隨機森林
上面提到的Bagging方法是先構建一個BaggingClassifier,然后將結果傳輸到DecisionTreeClassifier,還有一種方法是使用RandomForestClassifier。Random Forest(隨機森林)是一種基于樹模型的Bagging的優化版本(對回歸任務,還有一個RandomForestRegressor)。一下代碼為訓練一個500顆樹的隨機森林分類器,每棵樹限制未16個葉子結點。
from sklearn.ensemble import RandomForestClassifierrnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42) rnd_clf.fit(X_train, y_train)y_pred_rf = rnd_clf.predict(X_test)而同一批數據,用同樣的算法只能產生一棵樹,這時Bagging策略可以幫助我們產生不同的數據集。Bagging策略來源于bootstrap aggregation:從樣本集(假設樣本集N個數據點)中重采樣選出Nb個樣本(有放回的采樣,樣本數據點個數仍然不變為N),在所有樣本上,對這n個樣本建立分類器(ID3\C4.5\CART\SVM\LOGISTIC),重復以上步驟m次,獲得m個分類器,最后根據這m個分類器的投票結果,決定數據屬于哪一類。
每棵樹的按照如下規則生成:
一開始我們提到的隨機森林中的“隨機”就是指的這里的兩個隨機性。兩個隨機性的引入對隨機森林的分類性能至關重要。由于它們的引入,使得隨機森林不容易陷入過擬合,并且具有很好得抗噪能力(比如:對缺省值不敏感)。
隨機森林再樹的生長上引入了更多的隨機性:分裂節點不再是搜索最好的特征(信息增益最大),而是在一個隨機生成的子特征集里搜索最好的特征。建立多顆這樣的決策樹,然后通過這幾課決策樹來投票,決定數據屬于哪一類(投票機制有一票否決制、少數服從多數、加權多數)
2. 隨機森林分類效果的影響因素
- 森林中任意兩棵樹的相關性:相關性越大,錯誤率越大;
- 森林中每棵樹的分類能力:每棵樹的分類能力越強,整個森林的錯誤率越低。
減小特征選擇個數m,樹的相關性和分類能力也會相應的降低;增大m,兩者也會隨之增大。所以關鍵問題是如何選擇最優的m(或者是范圍),這也是隨機森林唯一的一個參數。
3. 隨機森林有什么優缺點
優點:
- 在當前的很多數據集上,相對其他算法有著很大的優勢,表現良好。
- 它能夠處理很高維度(feature很多)的數據,并且不用做特征選擇(因為特征子集是隨機選擇的)。
- 在訓練完后,它能夠給出哪些feature比較重要。
- 訓練速度快,容易做成并行化方法(訓練時樹與樹之間是相互獨立的)。
- 在訓練過程中,能夠檢測到feature間的互相影響。
- 對于不平衡的數據集來說,它可以平衡誤差。
- 如果有很大一部分的特征遺失,仍可以維持準確度。
缺點:
- 隨機森林已經被證明在某些噪音較大的分類或回歸問題上會過擬合。
- 對于有不同取值的屬性的數據,取值劃分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種數據上產出的屬性權值是不可信的。
4. 隨機森林如何處理缺失值?
根據隨機森林創建和訓練的特點,隨機森林對缺失值的處理還是比較特殊的。
- 首先,給缺失值預設一些估計值,比如數值型特征,選擇其余數據的中位數或眾數作為當前的估計值
- 然后,根據估計的數值,建立隨機森林,把所有的數據放進隨機森林里面跑一遍。記錄每一組數據在決策樹中一步一步分類的路徑.
- 判斷哪組數據和缺失數據路徑最相似,引入一個相似度矩陣,來記錄數據之間的相似度,比如有N組數據,相似度矩陣大小就是N*N
- 如果缺失值是類別變量,通過權重投票得到新估計值,如果是數值型變量,通過加權平均得到新的估計值,如此迭代,直到得到穩定的估計值。
其實,該缺失值填補過程類似于推薦系統中采用協同過濾進行評分預測,先計算缺失特征與其他特征的相似度,再加權得到缺失值的估計,而隨機森林中計算相似度的方法(數據在決策樹中一步一步分類的路徑)乃其獨特之處。
5. 什么是OOB?隨機森林中OOB是如何計算的,它有什么優缺點?
OOB:
上面我們提到,構建隨機森林的關鍵問題就是如何選擇最優的m,要解決這個問題主要依據計算袋外錯誤率oob error(out-of-bag error)。
bagging方法中Bootstrap每次約有1/3的樣本不會出現在Bootstrap所采集的樣本集合中,當然也就沒有參加決策樹的建立,把這1/3的數據稱為袋外數據oob(out of bag),它可以用于取代測試集誤差估計方法。
袋外數據(oob)誤差的計算方法如下:
- 對于已經生成的隨機森林,用袋外數據測試其性能,假設袋外數據總數為O,用這O個袋外數據作為輸入,帶進之前已經生成的隨機森林分類器,分類器會給出O個數據相應的分類
- 因為這O條數據的類型是已知的,則用正確的分類與隨機森林分類器的結果進行比較,統計隨機森林分類器分類錯誤的數目,設為X,則袋外數據誤差大小=X/O
優缺點:
這已經經過證明是無偏估計的,所以在隨機森林算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
6. 隨機森林的過擬合問題
你已經建了一個有10000棵樹的隨機森林模型。在得到0.00的訓練誤差后,你非常高興。但是,驗證錯誤是34.23。到底是怎么回事?你還沒有訓練好你的模型嗎?
答:該模型過度擬合,因此,為了避免這些情況,我們要用交叉驗證來調整樹的數量。
7. 代碼實現
GitHub:Jupyter Notebook Viewer
總結
以上是生活随笔為你收集整理的机器学习-集成学习:随机森林(Random Forest)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 欧洲人最爱!蔚来ET5旅行版实车亮相:真
- 下一篇: 机器学习-集成学习-梯度提升决策树(GB