隨機森林算法學習
最近在做kaggle的時候,發現隨機森林這個算法在分類問題上效果十分的好,大多數情況下效果遠要比svm,log回歸,knn等算法效果好。因此想琢磨琢磨這個算法的原理。
要學隨機森林,首先先簡單介紹一下集成學習方法和決策樹算法。下文僅對該兩種方法做簡單介紹(具體學習推薦看統計學習方法的第5章和第8章)。
Bagging和Boosting的概念與區別
該部分主要學習自:http://www.cnblogs.com/liuwu265/p/4690486.html
隨機森林屬於集成學習(Ensemble Learning)中的bagging算法。在集成學習中,主要分為bagging算法和boosting算法。我們先看看這兩種方法的特點和區別。
Bagging(套袋法)
bagging的算法過程如下:
從原始樣本集中使用Bootstraping方法隨機抽取n個訓練樣本,共進行k輪抽取,得到k個訓練集。(k個訓練集之間相互獨立,元素可以有重復)
對於k個訓練集,我們訓練k個模型(這k個模型可以根據具體問題而定,比如決策樹,knn等)
對於分類問題:由投票表決產生分類結果;對於回歸問題:由k個模型預測結果的均值作為最后預測結果。(所有模型的重要性相同)
Boosting(提升法)
boosting的算法過程如下:
對於訓練集中的每個樣本建立權值wi,表示對每個樣本的關注度。當某個樣本被誤分類的概率很高時,需要加大對該樣本的權值。
進行迭代的過程中,每一步迭代都是一個弱分類器。我們需要用某種策略將其組合,作為最終模型。(例如AdaBoost給每個弱分類器一個權值,將其線性組合最為最終分類器。誤差越小的弱分類器,權值越大)
Bagging,Boosting的主要區別
樣本選擇上:Bagging采用的是Bootstrap隨機有放回抽樣;而Boosting每一輪的訓練集是不變的,改變的只是每一個樣本的權重。
樣本權重:Bagging使用的是均勻取樣,每個樣本權重相等;Boosting根據錯誤率調整樣本權重,錯誤率越大的樣本權重越大。
預測函數:Bagging所有的預測函數的權重相等;Boosting中誤差越小的預測函數其權重越大。
並行計算:Bagging各個預測函數可以並行生成;Boosting各個預測函數必須按順序迭代生成。
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
1)Bagging + 決策樹 = 隨機森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT
決策樹
常用的決策樹算法有ID3,C4.5,CART三種。3種算法的模型構建思想都十分類似,只是采用了不同的指標。決策樹模型的構建過程大致如下:
ID3,C4.5決策樹的生成
輸入:訓練集D,特征集A,閾值eps 輸出:決策樹T
若D中所有樣本屬於同一類Ck,則T為單節點樹,將類Ck作為該結點的類標記,返回T
若A為空集,即沒有特征作為划分依據,則T為單節點樹,並將D中實例數最大的類Ck作為該結點的類標記,返回T
否則,計算A中各特征對D的信息增益(ID3)/信息增益比(C4.5),選擇信息增益最大的特征Ag
若Ag的信息增益(比)小於閾值eps,則置T為單節點樹,並將D中實例數最大的類Ck作為該結點的類標記,返回T
否則,依照特征Ag將D划分為若干非空子集Di,將Di中實例數最大的類作為標記,構建子節點,由結點及其子節點構成樹T,返回T
對第i個子節點,以Di為訓練集,以A-{Ag}為特征集,遞歸地調用1~5,得到子樹Ti,返回Ti
CART決策樹的生成
這里只簡單介紹下CART與ID3和C4.5的區別。
CART樹是二叉樹,而ID3和C4.5可以是多叉樹
CART在生成子樹時,是選擇一個特征一個取值作為切分點,生成兩個子樹
選擇特征和切分點的依據是基尼指數,選擇基尼指數最小的特征及切分點生成子樹
決策樹的剪枝
決策樹的剪枝主要是為了預防過擬合,過程就不詳細介紹了。
主要思路是從葉節點向上回溯,嘗試對某個節點進行剪枝,比較剪枝前后的決策樹的損失函數值。最后我們通過動態規划(樹形dp,acmer應該懂)就可以得到全局最優的剪枝方案。
隨機森林(Random Forests)
隨機森林是一種重要的基於Bagging的集成學習方法,可以用來做分類、回歸等問題。
隨機森林有許多優點:
具有極高的准確率
隨機性的引入,使得隨機森林不容易過擬合
隨機性的引入,使得隨機森林有很好的抗噪聲能力
能處理很高維度的數據,並且不用做特征選擇
既能處理離散型數據,也能處理連續型數據,數據集無需規范化
訓練速度快,可以得到變量重要性排序
容易實現並行化
隨機森林的缺點:
當隨機森林中的決策樹個數很多時,訓練時需要的空間和時間會較大
隨機森林模型還有許多不好解釋的地方,有點算個黑盒模型
與上面介紹的Bagging過程相似,隨機森林的構建過程大致如下:
從原始訓練集中使用Bootstraping方法隨機有放回采樣選出m個樣本,共進行n_tree次采樣,生成n_tree個訓練集
對於n_tree個訓練集,我們分別訓練n_tree個決策樹模型
對於單個決策樹模型,假設訓練樣本特征的個數為n,那么每次分裂時根據信息增益/信息增益比/基尼指數選擇最好的特征進行分裂
每棵樹都一直這樣分裂下去,直到該節點的所有訓練樣例都屬於同一類。在決策樹的分裂過程中不需要剪枝
將生成的多棵決策樹組成隨機森林。對於分類問題,按多棵樹分類器投票決定最終分類結果;對於回歸問題,由多棵樹預測值的均值決定最終預測結果
使用案例
from sklearn.ensemble import RandomForestClassifier
trainSet,trainLabel,testSet,testLabel = getFuturesDataSet(npyPath,0.67)
model = RandomForestClassifier(bootstrap=True,random_state=0) model.fit(trainSet,trainLabel) #降維 # x_pca_test = pca.fit_transform(x_test) result = model.predict(np.array(testSet))
相關文檔原文:http://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html
————————————————
原文鏈接:https://blog.csdn.net/qq547276542/article/details/78304454