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