集成学习-Bagging集成学习算法随机森林(Random Forest)
?
隨機森林算法屬性
隨機森林顧名思義,是用隨機的方式建立一個森林,森林里面有很多的決策樹組成,隨機森林的每一棵決策樹之間是沒有關聯的。在得到森林之后,當有一個新的輸入樣本進入的時候,就讓森林中的每一棵決策樹分別進行一下判斷,看看這個樣本應該屬于哪一類(對于分類算法),然后看看哪一類被選擇最多,就預測這個樣本為那一類。
隨機森林和使用決策樹作為基本分類器的(bagging)有些類似。以決策樹為基本模型的bagging在每次bootstrap放回抽樣之后,產生一棵決策樹,抽多少樣本就生成多少棵樹,在生成這些樹的時候沒有進行更多的干預。而隨機森林也是進行bootstrap抽樣,但它與bagging的區別是:在生成每棵樹的時候,每個節點變量都僅僅在隨機選出的少數變量中產生。因此,不但樣本是隨機的,連每個節點變量(Features)的產生都是隨機的。
許多研究表明, 組合分類器比單一分類器的分類效果好,隨機森林(random forest)是一種利用多個分類樹對數據進行判別與分類的方法,它在對數據進行分類的同時,還可以給出各個變量(基因)的重要性評分,評估各個變量在分類中所起的作用。
隨機森林在以決策樹為基學習器構建Bagging的基礎上,進一步在訓練過程中引入了隨機屬性選擇。傳統決策樹在選擇劃分屬性時,是在當前結點的屬性集合中選擇一個最優屬性;在隨機森林中,對基決策樹的每個結點,先從該結點的屬性集合d中隨機選擇一個包含k個屬性的子集,然后再從這個子集中選擇一個最優屬性用于劃分,參數k控制了隨機性的引入程度,一般推薦k=log2d
一開始我們提到的隨機森林中的“隨機”就是指的這里的兩個隨機性。兩個隨機性的引入對隨機森林的分類性能至關重要。由于它們的引入,使得隨機森林不容易陷入過擬合,并且具有很好得抗噪能力(比如:對缺省值不敏感)。由于Bagging每次訓練都進行采樣來訓練模型,所以模型的泛化能力很強,對于降低模型的方差很有作用。當然對于訓練基地額擬合誤差就會大一點,也就輸模型偏倚會大一些。
注意到這和GBDT的子采樣是不同的,GBDT的子采樣是無放回采樣,而Bagging的子采樣是有有放回采樣。
對于一個樣本,它在某一次含m個樣本的訓練集的隨機采樣中,每次被采集到的概率是1/m。不被采集到的概率為1?1/m。如果m次采樣都沒有被采集中的概率是(1?1/m)m。當m→∞時,(1?1/m)m→1/e?0.368。也就是說,在bagging的每輪隨機采樣中,訓練集中大約有36.8%的數據沒有被采樣集采集中。對于這36.8%的沒有被采集到的數據,我們稱之為袋外數據(Out of bag,簡稱oog)。這些數據沒有參與訓練模型的擬合,因此可以檢驗模型泛化能力.
隨機決策樹的構造
建立每棵決策樹的過程中,有2點:采樣與完全分裂。首先是兩個隨機采樣的過程,RF要對輸入數據進行一下行(樣本)、列(特征)采樣,對于行采樣(樣本)采用有放回的方式,也就是在采樣得到的樣本中可以有重復。從M個特征中(列采樣)出m特征。之后就是用完全分裂的方式建立出決策樹。這樣決策樹的某一個葉子節點要么是無法繼續分裂的,要么里面的所有樣本的都是指向的同一個分類。一般很多的決策樹算法都一個重要的步驟 - 剪枝,但是這里不這樣干,由于之前的兩個隨機采樣的過程保證了隨機性,所以就算不剪枝,也不會出現over-fitting。
分裂的辦法是:采用上面說的列采樣的過程從這m個屬性中采用某種策略(比如說信息增益)來選擇1個屬性作為該節點的分裂屬性。決策樹形成過程中每個節點都要按完全分裂的方式來分裂,一直到不能夠再分裂為止(如果下一次該節點選出來的那一個屬性是剛剛其父節點分裂時用過的屬性,則該節點已經達到了葉子節點,無須繼續分裂了)。
每棵樹的按照如下規則生成:
總的來說就是隨機選擇樣本數,隨機選取特征,隨機選擇分類器,建立多顆這樣的決策樹,然后通過這幾課決策樹來投票,決定數據屬于哪一類(投票機制有一票否決制、少數服從多數、加權多數)
?
隨機森林算法優缺點
主要優點是:
訓練可以高度并行化,對于大數據大樣本(千萬級樣本,多變量)訓練速度有優勢。
它能夠處理很高維度(feature很多)的數據,并且不用做特征選擇,對數據集的適應能力強:既能處理離散型數據,也能處理連續型數據,數據集無需規范化,且不需要降維。
可以得到變量重要性排序(兩種方式:基于OOB誤分率的增加量和基于分裂時的GINI下降量)。
由于采取了隨機采樣,模型的泛化能力強,方差小,不容易過擬合(兩個隨機,隨機抽取特征,隨機抽取樣本)。
對于不平衡數據集來說,RF提供平衡誤差的有效方法(可以通過采樣)。
如果有很大一部分的特征遺失(缺失值),仍可以維持準確度。
相比于Boosting系列的GBDT和Adaboost,RF實現比較簡單。
主要缺點是:
隨機森林已經被證明在某些噪音較大的分類或回歸問題上會過擬合。
對于有不同取值的屬性的數據,取值劃分較多的屬性會對隨機森林產生更大的影響,所以隨機森林在這種數據上產出的屬性權值是不可信的。
RF在解決回歸問題時,并不如分類表現那么好,因為它不能給出一個連續的輸出(決策樹本身限定)。
處理小數據或低維數據,可能不能產生很好的分類。
?
隨機森林如何處理缺失值?
根據隨機森林創建和訓練的特點,隨機森林對缺失值的處理還是比較特殊的。
- 首先,給缺失值預設一些估計值,比如數值型特征,選擇其余數據的中位數或眾數作為當前的估計值
- 然后,根據估計的數值,建立隨機森林,把所有的數據放進隨機森林里面跑一遍。記錄每一組數據在決策樹中一步一步分類的路徑.
- 判斷哪組數據和缺失數據路徑最相似,引入一個相似度矩陣,來記錄數據之間的相似度,比如有N組數據,相似度矩陣大小就是N*N
- 如果缺失值是類別變量,通過權重投票得到新估計值,如果是數值型變量,通過加權平均得到新的估計值,如此迭代,直到得到穩定的估計值。
其實,該缺失值填補過程類似于推薦系統中采用協同過濾進行評分預測,先計算缺失特征與其他特征的相似度,再加權得到缺失值的估計,而隨機森林中計算相似度的方法(數據在決策樹中一步一步分類的路徑)乃其獨特之處。
什么是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
優缺點:這已經經過證明是無偏估計的,所以在隨機森林算法中不需要再進行交叉驗證或者單獨的測試集來獲取測試集誤差的無偏估計。
為什么要進行隨機抽樣?
如果不進行隨機抽樣,每棵樹的訓練集都一樣,那么最終訓練出的樹分類結果也是完全一樣的,依然沒有解決決策樹過擬合問題。隨機抽樣是為了保證不同決策樹之間的多樣性,從而提高模型的泛化能力。使得隨機森林不容易陷入過擬合,并且具有較好的抗噪能力(比如:對缺省值不敏感)。
為什么要有放回地抽樣?
而隨機森林最后分類取決于多棵樹(弱分類器)的投票表決,這種表決應該是"求同"。如果是無放回的抽樣,那么每棵樹的訓練樣本都是不同的,都是沒有交集的,這樣每棵樹都是"有偏的",從而影響最終的投票結果。為了保證最終結果的可靠性,同時又要保證模型的泛化能力,需要每一顆樹既要“求同“ 又要 ”存異”
?
模型參數方法
控制bagging框架的參數
- estimators:隨機森林中樹的棵樹,即要生成多少個基學習器(決策樹)。
- boostrap:是否采用自助式采樣生成采樣集。
- obb_score:是否使用袋外數據來估計模型的有效性。
控制決策樹的參數
- criterion:選擇最優劃分屬性的準則,默認是"gini",可選"entropy"。
- max_depth:決策樹的最大深度
- max_features:隨機抽取的候選劃分屬性集的最大特征數(屬性采樣)
- min_samples_split:內部節點再劃分所需最小樣本數。默認是2,可設置為整數或浮點型小數。
- min_samples_leaf:葉子節點最少樣本數。默認是1,可設置為整數或浮點型小數。
- max_leaf_nodes:最大葉子結點數。默認是不限制。
- min_weight_fraction_leaf:葉子節點最小的樣本權重和。默認是0。
- min_impurity_split:節點劃分最小不純度。
其他參數:
- n_jobs:并行job的個數
- verbose:是否顯示任務進程
對象屬性:
- estimators_:打印輸出隨機森林中所有的樹。
- classes_:輸出樣本集的類別。
- n_classes_:輸出類別數量。
- n_features_:特征數量。
- n_outputs_:當模型被fit時的輸出維度。看看下圖來感受一些這個屬性。
- feature_importances_:特征重要性。
- oob_score_:袋外估計準確率得分,必須是oob_score參數選擇True的時候才可用。
- oob_decision_function_:袋外估計對應的決策函數。
方法:
- apply(X):將訓練好的模型應用在數據集X上,并返回數據集X對應的葉指數。
- decision_function(X):返回決策函數值(比如svm中的決策距離)。
- fit(X,Y):在數據集(X,Y)上訓練模型。
- get_parms():獲取模型參數。
- predict(X):預測數據集X的結果。
- predict_log_proba(X):預測數據集X的對數概率。
- predict_proba(X):預測數據集X的概率值。
- score(X,Y):輸出數據集(X,Y)在模型上的準確率。
?
?
https://cloud.tencent.com/developer/article/1170422
https://cloud.tencent.com/developer/article/1541702
https://www.cnblogs.com/pinard/p/6156009.html
?
?
總結
以上是生活随笔為你收集整理的集成学习-Bagging集成学习算法随机森林(Random Forest)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 逻辑回归模型详解(Logistic Re
- 下一篇: 蓝桥杯_算法训练_矩阵乘法