
01.隨機森林概述
隨機森林=決策樹+bagging,隨機森林是一種比較新的機器學習算法,是集成算法的一種。上世紀八十年代Breiman等人發明分類樹算法,通過反復二分數據進行分類或回歸,計算量大大降低,2001年Breiman把分類樹組合成隨機森林,即在樣本和特征的使用上進行隨機化,生成很多分類樹,再匯總分類樹結果。隨機森林在運算量沒有顯著提高前提下提高了預測精度,隨機森林對多元共線性不敏感,結果對缺失數據和非平衡數據比較穩健,可以很好地預測多達幾千個解釋變量的作用,被譽為當前最好算法之一。
隨機森林是集成分類算法的一種,隨機森林是用隨機的方式建立一個森林,森林由很多的決策樹組成,且每一棵決策樹之間是沒有關聯的。得到隨機森林模型后,當對新的樣本進行預測時,隨機森林中的每一棵決策樹分別進行判斷,bagging集成策略比較簡單,對于分類問題通常采用簡單的投票法,得到最多票數的類別為最終模型輸出。對于回歸問題通常使用平均法,T個弱分類器得到的回歸結果進行算術平均即為最終模型輸出。
02.相關基礎知識
1. 集成學習概述集成學習集合多個機器學習算法來完成學習任務。即“博采眾長”,集成學習可用于分類問題集成、回歸問題集成、特征選取集成、異常點檢測集成等。從下圖可以看出集成學習通過訓練集訓練出若干個個體學習器,通過一定的結合策略,可以最終形成一個強學習器,達到博采眾長的目的。

據此可以看出,集成學習要解決的主要問題有兩個,第一如何得到個體學習器;第二如何選擇一種結合策略。
2. 集成學習中的個體學習器得到若干個個體學習器,有兩種方式。第一種是所有的個體學習器都是同一類的,或者說是同質的,即所有的個體學習器都是同一種機器學習算法,比如都是決策樹或者神經網絡個體學習器。第二種是所有的個體學習器不全是同一類學習器,如里面包含支持向量機、邏輯回歸、樸素貝葉斯等個體學習器,再通過某種策略來確定最終的分類強學習器。目前來看,同質個體學習器應用廣泛。一般說的集成學習算法多指同質個體學習器。而同質個體學習器使用最多的模型是神經網絡和決策樹。同質個體學習器按照個體學習器之間是否存在依賴關系分為兩類:第一類是個體學習器之間不存在強依賴關系,一系列個體學習器并行生成,代表算法是bagging和隨機森林(Random Forest)系列模型。第二類是個體學習器之間存在強依賴關系,一系列個體學習器都需要串行生成,代表算法boosting算法。
3. 集成學習之baggingBagging的算法原理用一張圖概括如下:

從上圖可以看出,bagging的個體弱學習器的訓練集是通過隨機采樣得到的,通過T次隨機采樣,可以得到T個采樣集,可以分別獨立的訓練出T個弱學習器,再對這T個弱學習器通過集合策略得到最終的強學習器。這里的隨機采樣,一般采用的是自助采樣法,即有放回地隨機采樣。這樣每次采樣集和原始訓練集不同,和其他采樣集也不同,這樣便得到多個不同的弱學習器。隨機森林可以理解成是bagging的一個特化進階版,所謂的特化是因為隨機森林的弱學習器都是決策樹。所謂的進階是隨機森林在bagging的樣本隨機采樣基礎上,又加了特征的隨機選擇,其基本思想和bagging一致。
4. 集成學習及結合策略集成學習結合策略主要有三類:(1)對于數值類的回歸問題,常采用平均法的集合策略,即對所有弱學習器的輸出結果求平均作為強學習器的輸出。(2)對于分類問題,常采用的集合策略是投票法,最簡單的投票法是相對多數投票法,也就是少數服從多數,也就是T個弱學習器對樣本x的預測結果中,數量最多的類為最終的分類類別,如果不止一個類別獲得最高票,則隨機選擇一個作為最終類別;稍復雜的投票方法是絕對多數投票法,也就是要票數過半,在相對多數投票的基礎上,不僅要最高票,還要票數過半,否則會沒有預測結果;更復雜的是加權投票法,和加權平均法一樣,每一個弱學習器的分類票數乘以一個權重,最終將各個類別的加權票數求和,最大的值對應的類別即為最終預測類別。(3)另外一種更加復雜的集合策略是學習法,代表方法是stacking,當使用stacking的結合策略時,我們不是對弱學習器的結果做簡單的邏輯處理,而是再加上一層學習器,即將弱學習器的學習結果作為所加的一層學習器的輸入,重新訓練一個學習器來得到最終結果,這種情況下,我們將弱學習器成為初級學習器,把用于結合的學習器作為次級學習器,對于測試集,首先通過初級學習器預測一次,得到次級學習器的輸入樣本,再用次級學習器預測一次,得到最終的預測結果。
5. 決策樹(Decision Tree)決策樹是一種基本的分類器,主要工作原理就是根據特征對數據集進行劃分,最后把數據貼上兩類不同的標簽。構建好的決策樹呈樹狀結構,可以理解成是if-then規則的集合,主要優點是模型具有較好的可讀性,分類速度快。常見的決策樹算法有ID3、C4.5、和CART。下圖為決策樹模型的一個典型案例,根據西瓜的各種特征去判斷西瓜是好瓜還是壞瓜,從根節點開始一級一級地進行判斷決策,直到葉節點,也即判斷出其是好瓜還是壞瓜。決策樹學習的是自頂向下的遞歸方法,其基本思想是以信息熵為度量構造一顆熵值下降最快的樹,到葉子節點處的熵值為零,此時每個葉節點的樣本都屬于同一類。

03.隨機森林介紹1. 隨機森林原理
Bagging+decision trees,我們便可得到隨機森林。隨機森林對bagging只做了小的改動,基學習器的多樣性不僅來自對初始訓練集有放回的采樣,還有對樣本屬性的隨機無放回的抽樣。將CART決策樹作為弱分類器,然后采用bagging技術訓練一些小決策樹,最后將這些小決策樹集合起來,便可得到一個森林模(隨機森林)。
在對預測輸出進行集合時,通常對分類任務使用簡單投票法,對回歸任務采用簡單平均法。
2. 隨機森林的構建過程1) 在生成每棵決策樹時,隨機有放回地從訓練集中抽取N個訓練樣本,作為該樹的訓練集(每棵樹的訓練集都是不同的,而且里面包含重復的訓練樣本)。2) 若特征空間共有D個特征,則在每一輪生成決策樹的過程中,從D個特征中隨機選擇其中的d個特征(d<D)組成一個新的特征集,通過使用新的特征集來生成決策樹,d的選取要是最優的,通常取。通常減小特征選擇的個數d,各決策樹的相關性和分類能力也會相應降低,增大d,兩者也都會隨之增大。所以如何選擇最優的d是一個關鍵的問題,也是隨機森林的一個重要參數。3) 重復以上兩步s次,即建立s個決策樹。4) 這s個決策樹形成隨機森林,通過投票表決結果,得到最終的輸出結果。隨機森林包括兩個隨機的層面:樣本隨機、特征選擇隨機。
3. 隨機森林的評價指標上面我們提到,構建隨機森林的一個關鍵問題是如何選擇最優的d,要解決這個問題主要依據計算袋外誤差率obb error(out-of-bag error)。隨機森林有一個重要的優點是:沒有必要對其進行交叉驗證或用一個獨立的測試集去獲得誤差的一個無偏估計。其可以在內部進行評估,即在生成過程中就對誤差建立了一個無偏估計。在構建每個樹時,我們對訓練集采用了不同的bootstrap sample(隨機且有放回的采樣)。所以對每棵樹來說,假設對第k棵樹,大約有1/3的樣本沒有參與第k棵樹的生成,它們稱為第k棵樹的obb樣本。根據采樣特點我們可以進行obb估計,計算方式如下:1) 對每個樣本,計算其作為obb樣本時決策樹對它的分類情況。2) 然后以簡單多數投票作為樣本的分類結果。3) 最后用誤分個數占樣本總數的比率,作為隨機森林的obb的誤分率。obb誤分率是隨機森林泛化誤差的一個無偏估計,它的結果近似于需要大量計算的k折交叉驗證。對隨機森林而言,袋外誤差率等于測試集的誤差率。測試集上表現好,說明泛化能力強,反之說明泛化能力弱。
4. 隨機森林分類模型案例 本案例是使用sklearn里的鳶尾花數據集,根據鳶尾花的不同特征組合構建隨機森林模型,并對鳶尾花的進行分類。代碼如下圖:

不同兩兩特征組合對鳶尾花分類的準確率
隨機森林對鳶尾花數據的兩特征組合的分類結果
由上圖可知,所有鳶尾花被分為三類,不同兩特征組合的分類準確率不同。隨機森林算法在隨機決策樹生成過程采用的Boostrap,所以在一棵樹的生成過程并不會使用所有的樣本,未使用的樣本就叫(Out_of_bag)袋外樣本(oob 數據集),通過袋外樣本,可以評估這個樹的準確度,其他子樹葉按這個原理評估,最后可以取平均值。oob_score = True:表示使用 oob 數據集作為測試數據集,估算算法的泛化能力;oob_score 默認為 False,不使用 oob 數據集作為測試數據集。