您好,登錄后才能下訂單哦!
這篇文章給大家介紹隨機森林的原理及Python代碼實現是怎樣的,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
最近在做kaggle的時候,發現隨機森林這個算法在分類問題上效果十分的好,大多數情況下效果遠要比svm,log回歸,knn等算法效果好。因此想琢磨琢磨這個算法的原理。
要學隨機森林,首先先簡單介紹一下集成學習方法和決策樹算法。
Bagging和Boosting都是將已有的分類或回歸算法通過一定方式組合起來,形成一個性能更加強大的分類器,更準確的說這是一種分類算法的組裝方法。即將弱分類器組裝成強分類器的方法。
首先介紹Bootstraping,即自助法:它是一種有放回的抽樣方法(可能抽到重復的樣本)。
1、Bagging (bootstrap aggregating)
Bagging即套袋法,其算法過程如下:
A)從原始樣本集中抽取訓練集。每輪從原始樣本集中使用Bootstraping的方法抽取n個訓練樣本(在訓練集中,有些樣本可能被多次抽取到,而有些樣本可能一次都沒有被抽中)。共進行k輪抽取,得到k個訓練集。(k個訓練集之間是相互獨立的)
B)每次使用一個訓練集得到一個模型,k個訓練集共得到k個模型。(注:這里并沒有具體的分類算法或回歸方法,我們可以根據具體問題采用不同的分類或回歸方法,如決策樹、感知器等)
C)對分類問題:將上步得到的k個模型采用投票的方式得到分類結果;對回歸問題,計算上述模型的均值作為最后的結果。(所有模型的重要性相同)
2、Boosting
其主要思想是將弱分類器組裝成一個強分類器。在PAC(概率近似正確)學習框架下,則一定可以將弱分類器組裝成一個強分類器。
關于Boosting的兩個核心問題:
1)在每一輪如何改變訓練數據的權值或概率分布?
通過提高那些在前一輪被弱分類器分錯樣例的權值,減小前一輪分對樣例的權值,來使得分類器對誤分的數據有較好的效果。
2)通過什么方式來組合弱分類器?
通過加法模型將弱分類器進行線性組合,比如AdaBoost通過加權多數表決的方式,即增大錯誤率小的分類器的權值,同時減小錯誤率較大的分類器的權值。
而提升樹通過擬合殘差的方式逐步減小殘差,將每一步生成的模型疊加得到最終模型。
3、Bagging,Boosting二者之間的區別
Bagging和Boosting的區別:
1)樣本選擇上:
Bagging:訓練集是在原始集中有放回選取的,從原始集中選出的各輪訓練集之間是獨立的。
Boosting:每一輪的訓練集不變,只是訓練集中每個樣例在分類器中的權重發生變化。而權值是根據上一輪的分類結果進行調整。
2)樣例權重:
Bagging:使用均勻取樣,每個樣例的權重相等
Boosting:根據錯誤率不斷調整樣例的權值,錯誤率越大則權重越大。
3)預測函數:
Bagging:所有預測函數的權重相等。
Boosting:每個弱分類器都有相應的權重,對于分類誤差小的分類器會有更大的權重。
4)并行計算:
Bagging:各個預測函數可以并行生成
Boosting:各個預測函數只能順序生成,因為后一個模型參數需要前一輪模型的結果。
4、總結
這兩種方法都是把若干個分類器整合為一個分類器的方法,只是整合的方式不一樣,最終得到不一樣的效果,將不同的分類算法套入到此類算法框架中一定程度上會提高了原單一分類器的分類效果,但是也增大了計算量。
下面是將決策樹與這些算法框架進行結合所得到的新的算法:
1)Bagging + 決策樹 = 隨機森林
2)AdaBoost + 決策樹 = 提升樹
3)Gradient Boosting + 決策樹 = GBDT
集成學習通過構建并結合多個分類器來完成學習任務。集成學習通過將多個學習器進行結合,常可獲得比單一學習器更好的泛化性能。
考慮一個簡單例子:在二分類任務中,假定三個分類器在三個測試樣本上的表現如下圖,其中√表示分類正確,×表示分類錯誤,集成學習的結果通過投票法產生,即“少數服從多數”。如下圖,在(a)中,每個分類器都只有66.6%的精度,但集成學習卻達到了100%;在(b)中,三個分類器沒有差別,集成之后性能沒有提高;在(c)中,每個分類器的精度都只有33.3%,集成學習的結果變得更糟。這個簡單地例子顯示出:要獲得好的集成,個體學習器應“好而不同”,即個體學習器要有一定的“準確性”,即學習器不能太差,并且要有“多樣性”,即學習器間具有差異。
根據個體學習器的生成方式,目前的集成學習方法大致可分為兩大類,即個體學習器之間存在強依賴關系,必須串行生成的序列化方法,以及個體學習器間不存在強依賴關系,可同時生成的并行化方法;前者的代表是Boosting,后者的代表是Bagging和“隨機森林”(Random Forest)
Bagging與隨機森林
要得到泛化性能強的集成,集成中的個體學習器應盡可能相互獨立,雖然這在現實任務中很難做到,但我們可以設法使基學習器盡可能具有較大的差異。
在我的實驗中,使用“自助采樣法”:給定包含m個樣本的數據集,我們先隨機取出一個樣本放入采樣集中,再把該樣本放回初始數據集,使得下次采樣時該樣本仍有可能被選中,這樣,經過m次隨機操作,我們得到含m個樣本的采樣集,初始訓練集中有的樣本在采樣集里多次出現,有的則從未出現。
按照這種方法,我們可以采樣出T個含m個訓練樣本的采樣集,然后基于每個采樣集訓練處一個基學習器,再將這些基學習器進行結合,這就是Bagging的基本流程。在對預測輸出進行結合時,Bagging通常對分類任務使用簡單投票法,對回歸任務使用簡單平均法。
隨機森林是Bagging的一個擴展。隨機森林在以決策樹為基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇(即引入隨機特征選擇)。傳統決策樹在選擇劃分屬性時時在當前節點的屬性集合(假定有d個屬性)中選擇一個最優屬性;而在隨機森林中,對基決策樹的每個節點,先從該節點的屬性集合中隨機選擇一個包含k個屬性的子集,然后再從這個子集中選擇一個最優屬性用于劃分。這里的參數k控制了隨機性的引入程度:若令k=d,則基決策樹的構建與傳統決策樹相同;若令k=1,則是隨機選擇一個屬性進行劃分。
在這篇文章中,我們只講隨機森林的分類部分。隨機森林用于分類時,即采用n個決策樹分類,將分類結果用簡單投票法得到最終分類,提高分類準確率。
對于決策樹不太了解的童鞋,可以看上一篇:
python機器學習:決策樹ID3、C4.5
簡單來說,隨機森林就是對決策樹的集成,但有兩點不同:
(1)采樣的差異性:從含m個樣本的數據集中有放回的采樣,得到含m個樣本的采樣集,用于訓練。這樣能保證每個決策樹的訓練樣本不完全一樣。
(2)特征選取的差異性:每個決策樹的n個分類特征是在所有特征中隨機選擇的(n是一個需要我們自己調整的參數)
隨機森林需要調整的參數有:
(1) 決策樹的個數
(2) 特征屬性的個數
(3) 遞歸次數(即決策樹的深度)
下面,講一下如何用代碼實現隨機森林。
代碼實現流程:
(1) 導入文件并將所有特征轉換為float形式
(2) 將數據集分成n份,方便交叉驗證
(3) 構造數據子集(隨機采樣),并在指定特征個數(假設m個,手動調參)下選取最優特征
(4) 構造決策樹
(5) 創建隨機森林(多個決策樹的結合)
(6) 輸入測試集并進行測試,輸出預測結果
(1) 導入文件并將所有特征轉換為float形式
(2) 將數據集分成n份,方便交叉驗證
(3) 構造數據子集(隨機采樣),并在指定特征個數(假設m個,手動調參)下選取最優特征
(4) 構造決策樹
(5) 創建隨機森林(多個決策樹的結合)
(6) 輸入測試集并進行測試,輸出預測結果
對以上代碼的一點總結:
訓練部分:假設我們取dataset中的m個feature來構造決策樹,首先,我們遍歷m個feature中的每一個feature,再遍歷每一行,通過spilt_loss函數(計算分割代價)來選取最優的特征及特征值,根據是否大于這個特征值進行分類(分成left,right兩類),循環執行上述步驟,直至不可分或者達到遞歸限值(用來防止過擬合),最后得到一個決策樹tree。
測試部分:對測試集的每一行進行判斷,決策樹tree是一個多層字典,每一層為一個二分類,將每一行按照決策樹tree中的分類索引index一步一步向里層探索,直至不出現字典時探索結束,得到的值即為我們的預測值。
關于隨機森林的原理及Python代碼實現是怎樣的就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。