向AI轉型的程式設計師都關注了這個號👇👇👇
大數據挖掘DT機器學習 公眾號: datayx
最近在做kaggle的時候,發現隨機森林這個算法在分類問題上效果十分的好,大多數情況下效果遠要比svm,log回歸,knn等算法效果好。因此想琢磨琢磨這個算法的原理。
要學隨機森林,首先先簡單介紹一下集成學習方法和決策樹算法。
Bagging和Boosting 概念及區別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一步一步向裡層探索,直至不出現字典時探索結束,得到的值即為我們的預測值。
搜索公眾號添加: datayx
不斷更新資源
深度學習、機器學習、數據分析、python
長按圖片,識別二維碼,點關注