隨機森林的原理及Python代碼實現

2021-02-23 機器學習AI算法工程


向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

長按圖片,識別二維碼,點關注

相關焦點

  • 原理+代碼|深入淺出Python隨機森林預測實戰
    能夠理解基本原理並將代碼用於實際的業務案例是本文的目標,本文將詳細介紹如何利用Python實現集成學習中隨機森林這個經典的方法來預測寬帶客戶的流失,主要將分為兩個部分:本文的主角是隨機森林,所以我們將以隨機森林所屬的分支 —— 裝袋法 入手,深入淺出該集成學習方法的原理步驟
  • python實現隨機森林
    最後,如果有了新的數據需要通過隨機森林得到分類結果,就可以通過對子決策樹的判斷結果的投票,得到隨機森林的輸出結果了。如下圖,假設隨機森林中有3棵子決策樹,2棵子樹的分類結果是A類,1棵子樹的分類結果是B類,那麼隨機森林的分類結果就是A類。
  • 獨家 | 一文讀懂隨機森林的解釋和實現(附python代碼)
    本文從單棵決策樹講起,然後逐步解釋了隨機森林的工作原理,並使用sklearn中的隨機森林對某個真實數據集進行預測。如今由於像Scikit-Learn這樣的庫的出現,我們可以很容易地在Python中實現數百種機器學習算法。它們是如此易用,以至於我們通常都不需要任何關於模型底層工作機制的知識就可以使用它們。
  • 實戰:用Python實現隨機森林
    在本文中,我們將介紹如何在Python中構建和使用Random Forest,而不是僅僅顯示代碼,我將嘗試了解模型的工作原理。我將從一個簡單的單一決策樹開始,然後以解決現實世界數據科學問題的方式完成隨機森林。本文的完整代碼在GitHub上以Jupyter Notebook的形式提供。理解決策樹決策樹是隨機森林的構建塊,它本身就是個直觀的模型。
  • Python學習第128課——在Python中實現醉漢隨機遊走
    【每天幾分鐘,從零入門python編程的世界!】這節我們在2D平面內實現隨機遊走。我們先把原理搞清楚,用代碼實現這個原理。原理分析:我們想像在2D平面內有一個x軸和y軸組成的坐標系,有一個人他是個醉漢,他以(0,0)為原點,隨機遊走,以x和y表示遊走後的坐標值,剛開始x=0,y=0。他每走一步之前,都需要先做一次選擇,選擇往東南西北哪一個方向去走,這個選擇我們需要先引入一個random庫,這是一個可以用來實現隨機數、隨機選擇的庫,用這個庫來實現隨機方向的選擇。
  • 自我代碼提升之隨機森林
    然而,隨機森林也並非是萬能的模型,具有一些局限。事實上,隨機森林在某些噪音較大的分類或回歸問題上可能會陷入過擬合;而基於CART數的決策樹在特徵評估時會偏向於取值劃分更多的特徵。而且,在實際應用中,即使實現優化,隨機森林的訓練所花費的資源和時間依舊相對較高。
  • Python代碼實踐|隨機森林是「黑盒子」?不存在的,擼完代碼你就懂了
    它們的熱門可以歸功於使用隨機森林方法使用者只需要很少的數據清洗,不需要進行特徵的縮放,就可以得到最優的結果。為了更好的理解背後的原理,我決定從頭實現一個隨機森林,然後在數據的不同的特徵上進行一些可視化,看看這些特徵在決定最終結果中扮演了什麼樣的角色。人們常常認為隨機森林是個黑盒子,但是簡單的過一遍這個算法,就會發現,這除了是一個利用「多數投票」方法的強大的技術外,實際上可解釋性還是挺強的。
  • 隨機森林算法入門(Python)
    隨機森林能夠用於分類和回歸問題,可以處理大量特徵,並能夠幫助估計用於建模數據變量的重要性。這篇文章是關於如何使用Python構建隨機森林模型。隨機森林可以用於幾乎任何一種預測問題(包括非線性問題)。它是一個相對較新的機器學習策略(90年代誕生于貝爾實驗室)可以用在任何方面。它屬於機器學習中的集成學習這一大類。
  • 用Python實現隨機森林算法
    隨機森林算法(Random forest algorithm)是對 bagging 算法的擴展。除了仍然根據從訓練數據樣本建立複合模型之外,隨機森林對用做構建樹(tree)的數據特徵做了一定限制,使得生成的決策樹之間沒有關聯,從而提升算法效果。本文章旨在探討如何用 Python 實現隨機森林算法。
  • Python隨機森林 - CodeProject
    隨機森林是一種在集成學習中很受歡迎的算法,可用於分類和回歸。這意味著隨機森林中包括多種決策樹,並將每個決策樹結果的平均值作為隨機森林的最終輸出。決策樹有一些缺點,比如訓練集的過擬合導至很高的差異性,不過這在隨機森林中已經可以通過Bagging(Bootstrap Aggregating)的幫助解決。因為隨機森林實際上是由多種不同的決策樹組成的,所以我們最好先了解一下決策樹算法,然後再學習隨機森林的相關知識。
  • 理解隨機森林:基於Python的實現和解釋
    數據科學家 William Koehrsen 用 Python 實現並解釋了決策樹和隨機森林的工作過程。本文將介紹如何使用 Python 構建和使用隨機森林。我們不只是簡單地展示代碼,而會盡力解釋模型的工作方式。我們將從一個解決簡單問題的單個決策樹開始,然後逐漸深入,最終完成一個針對某個真實世界數據科學問題的隨機森林。
  • Python 探針實現原理
    關於 Python 的導入機制,我以前寫過一篇文章,非常詳細,感興趣的可以點擊這個連結進行查看:[深入探討 Python 的 import 機制:實現遠程導入模塊]另外,今天再給你推薦這篇文章,同樣是介紹 Python 的導入機制,和上面的文章一起食用更佳。本文呢,將簡單講述一下 Python 探針的實現原理。
  • 機器學習之隨機森林算法(Random Forest)及python代碼實現
    隨機森林的名稱中有兩個關鍵詞,一個是「隨機」,一個就是「森林」。「森林」很好理解,一棵叫做樹,那麼成百上千棵就可以叫做森林了,這也是隨機森林的主要思想--集成思想的體現。至於「隨機」也是極其關鍵的一步,具體什麼含義在下面會再做具體介紹。
  • 數學推導+純Python實現機器學習算法20:隨機森林
    Bagging與Boosting圖示如下:    可以清楚的看到,Bagging是並行的框架,而Boosting則是序列框架(但也可以實現並行)。    有了之前多篇關於決策樹的基礎以及前述關於Bagging基本思想的闡述,隨機森林(Random Forest)就沒有太多難以理解的地方了。
  • Python大數據綜合應用 :零基礎入門機器學習、深度學習算法原理與案例
    機器學習、深度學習算法原理與案例實現暨Python大數據綜合應用高級研修班一、課程簡介
  • 機器學習、深度學習算法原理與案例實踐暨Python大數據綜合應用...
    三、課程特點 課程重視代碼實踐,使用金融、氣象、農業、交通、安防等工業界實際數據(數據已脫敏)進行機器學習模型的落地應用。雖然課程堅持推導公式,但更重視機器學習和深度學習的原理與實操;將實際工作中遇到的行業應用和痛點做最直觀切實的展示;重視算法模型的同時,更強調實際問題中應該如何模型選擇、特徵選擇和調參。
  • Python盜號原理-代碼實現截屏鍵盤記錄遠程發送(不要做壞事)
    今天呢我們就以前面的幾篇技術文章做鋪墊,來講一下python盜號的原理(學習用途,請勿用於違法犯罪),知己知彼方能百戰不殆嘛脫褲我們就不多提了,無非就是過濾不嚴謹導致的sql注入,或者資料庫存儲不安全,這個本篇文章暫且不說,當然有感興趣的,我後面的文章或許也會講講。
  • 從決策樹到隨機森林:樹型算法的原理與實現
    使用下列代碼我們可以繪製任意基於樹的模型的混淆矩陣。隨機森林通過隨機擾動而令所有的樹去相關,因此隨機森林要比 Bagging 性能更好。隨機森林不像 Bagging,在構建每一棵樹時,每一個結點分割前都是採用隨機樣本預測器。因為在核心思想上,隨機森林還是和 Bagging 樹一樣,因此其在方差上有所減少。
  • Q-Q圖原理詳解及Python實現
    本篇文章將更加全面的為大家介紹QQ圖的原理以及自己手寫函數實現畫圖過程本文的代碼文件(jupyter)和數據文件可以在我們的公眾號"數據臭皮匠" 中回復"QQ圖"獲取QQ圖是quantile-quantile(分位數-分位數圖) 的簡稱,上面也有介紹它的兩個主要作用:1.檢驗一列數據是否符合正態分布
  • 大盤點:隨機森林的優缺點以及如何用Python解釋
    全文共1755字,預計學習時長3分鐘本文來自The Learning Machine——一個開放原始碼的新項目,該項目旨在為不同背景的人群創建交互式路線圖,其中包含對概念、方法、算法及其在Python或R中的代碼裡實現所有的解釋。