【生信】“隨機森林”在生物資訊學方面的應用
“隨機森林”在生物資訊學方面的應用
簡介
隨機森林是一種基於決策樹的機器學習演算法,可以用於樣本分類或迴歸任務,屬於非線性分類器。因此它可以挖掘變數之間複雜的非線性的相互依賴關係。通過隨機森林分析,可以找出區分兩組樣本間差異的關鍵成分。
基礎知識
1. 整合學習(ensemble learning)
通過建立多個模型組合來解決單一預測問題。工作原理是生成多個學習器模型,各自獨立地學習和做出預測,最後將這些預測結合成單預測。
根據個體學習器的生成方式,整合學習可以分為兩大類:
- 個體學習器間存在強依賴關係,必須序列生成的序列化方法,代表是Boosting
- 個體學習器間不存在強依賴關係,可同時生成的並行化方法,代表是Bagging和隨機森林
2.Bagging
Bootstrap sampling:自助取樣法,就是隨機有放回的抽取,有一部分樣本會多次出現,另一部分樣本不出現。初始資料集中約有1/3的樣本未出現在取樣資料集中
Bagging:基於自助取樣法(boostrap sampling),將所有待訓練的資料放進一個黑盒子中,然後從這個bag中隨機且有放回地抽取一部分資料出來用於訓練一個基學習器(base estimator),再將這些基學習器結合。
3.決策樹
決策樹是一種基本的分類器,主要工作就是選取特徵對資料集進行劃分,最後把資料貼上不同的標籤。常見的決策樹演算法有C4.5、ID3和CART
- ID3:資訊增益 最大的準則
- C4.5:資訊增益比 最大的準則
- CART:迴歸樹(平方誤差 最小的準則);分類樹(基尼係數 最小的準則)
決策樹學習採用的是自頂向下的遞迴方法,其基本思想是以資訊熵為度量構建一棵熵值下降最快的樹,到葉子結點處的熵值為零,此時每個葉結點中的例項都屬於同一類。
4.隨機森林
- 擾動:基學習器的多樣性不僅來自樣本擾動(對初始訓練集有放回的取樣),還有屬性擾動(對樣本屬性的隨機無放回的抽樣)。
- bagging+decision trees,得到隨機森林。決策樹作為基學習器,然後採用bagging技術訓練一大堆小決策樹,最後將這些小決策樹組合起來,這樣就得到了隨機森林。
- 預測:對分類任務,通常採用投票法,對迴歸任務,通常採用平均法;若分類任務得到的兩個類具有相同的票數,則可考察學習器的置信度。
5.OOB Error
初始資料集每次約有1/3的樣本不會出現在取樣資料集中,所以使用這1/3的資料作為袋外資料(out of bag),用於取代測試集誤差估計的方法。
6.過擬合
指學習時選擇的模型所包含的引數過多,以致出現這一模型對已知資料預測很好,但對未知資料預測很差的現象。
7.剪枝
為了儘可能正確分類訓練樣本,通過去掉一些分支來降低過擬合風險:包括預剪枝和後剪枝。
隨機森林介紹
每棵樹的構建規則如下:
- 對於每棵樹而言,隨機且有放回地從訓練集中抽取N個訓練樣本,作為該樹的訓練集;每棵樹的訓練集都是不同的,裡面包含重複的訓練樣本。
- 如果每個樣本的特徵維度為M,指定一個常數m<<M,隨機從M個特徵中選取m個特徵子集(不放回),每次樹進行分裂時,從這m個特徵中選擇最優的,通常取;減小特徵選擇個數m,樹的相關性和分類能力也會相應的降低;增大m,兩者會隨之增大。所以關鍵問題是如何選擇最優的m(或者說是範圍),這也是隨機森林唯一的一個引數。
- 每棵樹都盡最大程度的生長,並且沒有剪枝的過程。
總結:兩個隨機性的引入對隨機森林的分類效能至關重要。隨機森林不容易陷入過擬合,且具有很好的抗噪能力,對預設值不敏感。
袋外錯誤率
構造隨機森林的關鍵問題是如何選擇最優的m,要解決這個問題主要依據計算袋外錯誤率oob error。
隨機森林的一個重要優點是沒有必要對它進行交叉驗證或者用一個獨立的測試集來獲得誤差的一個無偏估計。它可以在內部進行評估,也就是說在生成的過程中就可以對誤差建立一個無偏估計。
在構建每棵樹時,對訓練集使用了不同的boostrap sampling。所以對於每棵樹而言(假設第k棵樹),大約有1/3的訓練例項沒有參與第k棵樹的生成,稱為第k棵樹的oob樣本。
oob估計的計算方式如下:
- 對每個樣本,計算它作為oob樣本時樹對它的分類情況(約1/3的樹)
- 然後以簡單多數投票作為該樣本的分類結果
- 最後用誤分個數佔樣本總數的比率作為隨機森林的oob誤分率。
隨機森林的優缺點
- 優點
- 在當前所有演算法中,具有極好的準確率
- 能夠有效地執行在大資料集上
- 能夠處理具有高維特徵的輸入樣本,而且不需要降維能夠評估各個特徵在分類問題上的重要性,在生成過程中,能夠獲取到內部生成誤差的一種無偏估計
- 對於預設值問題也能夠得到很好的結果
- 不需剪枝,不容易出現過擬合問題
- 缺點
- 無法控制模型內部的執行,只能在不同的引數和隨機種子之間進行嘗試