實戰:用Python實現隨機森林

2021-01-07 阿里云云棲號

因為有Scikit-Learn這樣的庫,現在用Python實現任何機器學習算法都非常容易。實際上,我們現在不需要任何潛在的知識來了解模型如何工作。雖然不需要了解所有細節,但了解模型如何訓練和預測對工作仍有幫助。比如:如果性能不如預期,我們可以診斷模型或當我們想要說服其他人使用我們的模型時,我們可以向他們解釋模型如何做出決策的。

在本文中,我們將介紹如何在Python中構建和使用Random Forest,而不是僅僅顯示代碼,我將嘗試了解模型的工作原理。我將從一個簡單的單一決策樹開始,然後以解決現實世界數據科學問題的方式完成隨機森林。本文的完整代碼在GitHub上以Jupyter Notebook的形式提供。


理解決策樹

決策樹是隨機森林的構建塊,它本身就是個直觀的模型。我們可以將決策樹視為詢問有關我們數據問題的流程圖。這是一個可解釋的模型,因為它決定了我們在現實生活中的做法:在最終得出決定之前,我們會詢問有關數據的一系列問題。

決策樹的主要技術細節是如何構建有關數據的問題,決策樹是通過形成能夠最大限度減少基尼係數的問題而建立的。稍後我會討論Gini Impurity,但這意味著決策樹試圖形成儘可能純的節點,其中包含來自單個類的高比例樣本(數據點)的節點。

Gini Impurity和構建樹可能有點難以理解,所以首先讓我們構建一個決策樹,以便可以更好的理解它。


關於最簡單問題的決策樹

我們從一個非常簡單的二進位分類問題開始,如下所示:

我們的數據只有兩個特徵(標籤),且只有6個數據點。

雖然這個問題很簡單,但它不是線性可分的,這意味著我們不能通過數據繪製一條直線來對點進行分類。然而,我們可以繪製一系列劃分類的直線,這基本上是決策樹在形成一系列問題時將要做的事情。

要創建決策樹並在數據上訓練,我們可以使用Scikit-Learn:

在訓練過程中,我們為模型提供特徵和標籤,以便學習根據特徵對點進行分類。我們沒有針對這個簡單問題的測試集,但是在測試時,我們只給模型提供功能並讓它對標籤做出預測。

我們可以在訓練數據上測試我們模型的準確性:

我們看到它100%正確,這是我們所期望的,因為我們給了它訓練的答案。


可視化決策樹

當我們訓練決策樹時,實際上會發生什麼?我發現了解決策樹的最有用的方法是通過可視化,我們可以使用Scikit-Learn的功能(詳細信息請查看筆記本或本文)。

上圖顯示了決策樹的整個結構,除葉節點(終端節點)外,所有節點都有5個部分:

問題基於特徵值詢問數據:每個問題都有對或錯的答案。根據問題的答案,數據點在樹中移動。

Gini:節點的Gini雜質。當我們向下移動樹時,平均加權基尼係數必須減少。

samples:節點中的觀察數。

value:每個類的樣本數量。例如,頂部節點在類0中有2個樣本,在類1中有4個樣本。

class:節點中點的多數分類。在葉節點的情況下,這是對節點中所有樣本的預測。

葉節點沒有問題,因為這些是最終預測的地方。要對新節點進行分類,只需向下移動樹,使用點的特徵來回答問題,直到到達class預測的葉節點。你可以使用上面的點進行嘗試,或者進行不同的預測。


基尼係數

在這一點上,我們應該嘗試了解基尼係數。簡而言之,Gini Impurity是隨機選擇的樣本被節點中的樣本分布標記錯誤的概率。例如,在頂部(根)節點中,有44.4%錯誤的可能性根據節點中樣本標籤的分布對隨機選擇的數據點進行分類。我們可以使用下面這個等式得到這個值:

節點的Gini係數n是1減去每個J類的p_i平方的總和,讓我們計算出根節點的基尼係數。

在每個節點處,決策樹在要素中搜索要拆分的值,從而最大限度地減少基尼係數。(拆分節點的替代方法是使用信息增益)。

然後,它以遞歸過程重複此拆分過程,直到達到最大深度,或者每個節點僅包含來自一個類的樣本。每層樹的加權總基尼係數必須減少。在樹的第二層,總加權基尼係數值為0.333:

最後一層的加權總Gini係數變為0意味著每個節點都是純粹的,並且從該節點隨機選擇的點不會被錯誤分類。雖然這似乎是好結果,但這意味著模型可能過度擬合,因為節點僅使用是通過訓練數據構建的。


過度擬合:為什麼森林比一棵樹更好

你可能會想問為什麼不只使用一個決策樹?它似乎是完美的分類器,因為它沒有犯任何錯誤!記住這其中的關鍵點是樹在訓練數據上沒有犯錯。因為我們給樹提供了答案。機器學習模型的要點是很好地概括測試數據。不幸的是,當我們不限制決策樹的深度時,它往往會過度擬合。

當我們的模型具有高方差並且基本上記憶訓練數據時,一定會發生過度擬合。這意味著它可以很好地在訓練數據上,但由於測試數據不同,它將無法對測試數據做出準確的預測!我們想要的是一個能很好地學習訓練數據的模型,並且可以在其他數據集上發揮作用。當我們不限制最大深度時,決策樹容易過度擬合的原因是因為它具有無限的複雜性,這意味著它可以保持增長,直到它為每個單獨的觀察只有一個葉節點,完美地對所有這些進行分類。

要理解為什麼決策樹具有高差異,我們可以用一個人來考慮它。想像一下,你覺得明天蘋果股票會上漲,你會問一些分析師。每一位分析師都可能會有很大差異並且會嚴重依賴他們可以訪問的數據。一位分析師可能只閱讀親蘋果新聞,因此她認為價格會上漲,而另一位分析師最近從她的朋友那裡聽到蘋果產品的質量開始下降,她可能就認為價格會下降。這些個體分析師的差異很大,因為他們的答案極其依賴於他們所看到的數據。

因為每個分析師都可以訪問不同的數據,所以預計個體差異會很大,但整個集合的總體方差應該減少。使用許多個體本質上是隨機森林背後的想法:而不是一個決策樹,使用數百或數千個樹來形成一個強大的模型。(過度擬合的問題被稱為偏差-方差權衡,它是機器學習中的一個基本主題)。


隨機森林

隨機森林是許多決策樹組成的模型。這個模型不僅僅是一個森林,而且它還是隨機的,因為有兩個概念:

隨機抽樣的數據點;

基於要素子集拆分的節點;

隨機抽樣

隨機森林背後的關鍵是每棵樹在數據點的隨機樣本上訓練。樣本用替換(稱為bootstrapping)繪製,這意味著一些樣本將在一個樹中多次訓練。這個想法是通過對不同樣本的每棵樹進行訓練,儘管每棵樹相對於一組特定的訓練數據可能有很大的差異,但總體而言,整個森林的方差都很小。每個學習者在數據的不同子集上學習,然後進行平均的過程被稱為bagging,簡稱bootstrap aggregating。


用於拆分節點的隨機特徵子集

隨機森林背後的另一個關鍵點是,只考慮所有特徵的子集來分割每個決策樹中的每個節點。通常,這被設置為sqrt(n_features)意味著在每個節點處,決策樹考慮在特徵的樣本上分割總計特徵總數的平方根。考慮到每個節點的所有特徵,也可以訓練隨機森林。

如果你掌握單個決策樹、bagging決策樹和隨機特徵子集,那麼你就可以很好地理解隨機森林的工作原理。隨機森林結合了數百或數千個決策樹,在略微不同的觀察集上訓練每個決策樹,並且僅考慮有限數量的特徵來分割每個樹中的節點。隨機森林做出的最終預測是通過平均每棵樹的預測來做出的。


隨機森林實踐

與其他Scikit-Learn模型非常相似,在Python中使用隨機森林只需要幾行代碼。我們將構建一個隨機森林,但不是針對上面提到的簡單問題。為了將隨機森林與單個決策樹的能力進行對比,我們將使用分為訓練和測試的真實數據集。


數據集

我們要解決的問題是二進位分類任務。這些特徵是個人的社會經濟和生活方式特徵,標籤是健康狀況不佳為0和身體健康為1。此數據集是由中心疾病控制和預防收集,可以在這裡找到。這是一個不平衡的分類問題,因此準確性不是一個合適的指標。相反,我們將測量接收器工作特性區域曲線(ROC AUC),從0(最差)到1(最佳)的度量,隨機猜測得分為0.5。我們還可以繪製ROC曲線以評估模型性能。


該筆記本包含了決策樹和隨機森林的實現,但在這裡我們只專注於隨機森林。在讀取數據後,我們可以實現並訓練隨機森林如下:

在訓練幾分鐘後,準備好對測試數據進行如下預測:

我們進行類預測(predict)以及predict_proba計算ROC AUC所需的預測概率()。一旦我們進行了預測測試,我們就可以將它們與測試標籤進行比較,以計算出ROC AUC。


結果

最終的ROC AUC是隨機森林為0.87,而單一決策樹是0.67。如果我們查看訓練分數,我們注意到兩個模型都達到了1.0 ROC AUC,因為我們給這些模型提供了訓練答案,並沒有限制最大深度。然而,儘管隨機森林過度擬合,但它能夠比單一決策樹更好地推廣測試數據。

如果我們檢查模型,我們會看到單個決策樹達到最大深度55,總共12327個節點。隨機森林中的平均決策樹的深度為46和13396個節點。即使平均節點數較多,隨機森林也能更好地推廣!

我們還可以繪製單個決策樹(頂部)和隨機森林(底部)的ROC曲線。頂部和左側的曲線是更好的模型:

我們看到隨機森林明顯優於單一決策樹。我們可以採用模型的另一個診斷措施是繪製測試預測的混淆矩陣:


特徵重要性(Feature Importances)

隨機森林中的特徵重要性表示在該特徵上拆分的所有節點上Gini係數減少的總和。我們可以使用這些來嘗試找出隨機森林最重要的預測變量,同時也可以從訓練有素的隨機森林中提取特徵重要性,並將其放入Pandas數據框中,如下所示:

我們還可以通過刪除具有0或低重要性的特徵來使用特徵重要性來選擇特徵。


在森林中可視化樹

最後,我們可以在森林中可視化單個決策樹。這次,我們必須限制樹的深度,否則它將太大而無法轉換為圖像。為了製作我將最大深度限制為6,這仍然導致我們無法完全解析的大樹!


優化決策樹

下一步可能是通過隨機搜索和Scikit-Learn中的RandomizedSearchCV來優化隨機森林。

優化是指在給定數據集上找到模型的最佳超參數。最佳超參數將在數據集之間變化,因此我們必須在每個數據集上單獨執行優化(也稱為模型調整)。我喜歡將模型調整視為尋找機器學習算法的最佳設置。有關隨機森林模型優化的隨機搜索的實現,請參閱Jupyter Notebook。


結論

在本文中,我們不僅在Python中構建和使用了隨機森林,而且還對模型的進行了分析。

我們首先查看了一個單獨的決策樹,一個隨機森林的基本構建塊,然後我們看到了如何在一個集合模型中組合數百個決策樹。當與bagging特徵一起使用和隨機抽樣時,該集合模型被稱為隨機森林。從這篇文章中理解的關鍵概念是:

決策樹:直觀模型,根據詢問有關特徵值的問題流程圖做出決策,通過過度擬合訓練數據表示方差高。

Gini Impurity:衡量決策樹在拆分每個節點時嘗試最小化的度量。表示根據節點中樣本的分布對來自節點的隨機選擇的樣本進行分類的概率。

Bootstrapping:用替換的方式隨機觀察組進行採樣。隨機森林用於訓練每個決策樹的方法。

隨機的特徵子集:在考慮如何在決策樹中分割每個節點時選擇一組隨機特徵。

隨機森林:由數百或數千個決策樹組成的集合模型,使用自舉,隨機特徵子集和平均投票來進行預測。這是一個bagging整體的例子。

偏差-方差權衡:機器學習中的基本問題,描述了高複雜度模型之間的權衡,以採用最好的方式學習訓練數據,代價是無法推廣到測試數據以及簡單的模型(高偏見)甚至無法學習訓練數據。隨機森林減少了單個決策樹的方差,同時還準確地學習了訓練數據,從而更好地預測了測試數據。

希望本文為你提供了開始在項目中使用隨機森林所需的信心和理解。隨機森林是一種強大的機器學習模型,但這不應該阻止我們知道它是如何工作的!

相關焦點

  • python實現隨機森林
    構建:所以綜上:隨機森林用於分類時,即採用n個決策樹分類,將分類結果用簡單投票法得到最終分類,提高分類準確率。簡單來說,隨機森林就是對決策樹的集成,但有兩點不同:(1)採樣的差異性:從含m個樣本的數據集中有放回的採樣,得到含m個樣本的採樣集,用於訓練。這樣能保證每個決策樹的訓練樣本不完全一樣。
  • 隨機森林的原理及Python代碼實現
    隨機森林是Bagging的一個擴展。隨機森林在以決策樹為基學習器構建Bagging集成的基礎上,進一步在決策樹的訓練過程中引入了隨機屬性選擇(即引入隨機特徵選擇)。傳統決策樹在選擇劃分屬性時時在當前節點的屬性集合(假定有d個屬性)中選擇一個最優屬性;而在隨機森林中,對基決策樹的每個節點,先從該節點的屬性集合中隨機選擇一個包含k個屬性的子集,然後再從這個子集中選擇一個最優屬性用於劃分。
  • Python隨機森林 - CodeProject
    隨機森林是一種在集成學習中很受歡迎的算法,可用於分類和回歸。這意味著隨機森林中包括多種決策樹,並將每個決策樹結果的平均值作為隨機森林的最終輸出。決策樹有一些缺點,比如訓練集的過擬合導至很高的差異性,不過這在隨機森林中已經可以通過Bagging(Bootstrap Aggregating)的幫助解決。因為隨機森林實際上是由多種不同的決策樹組成的,所以我們最好先了解一下決策樹算法,然後再學習隨機森林的相關知識。
  • 用Python實現隨機森林算法
    隨機森林算法(Random forest algorithm)是對 bagging 算法的擴展。除了仍然根據從訓練數據樣本建立複合模型之外,隨機森林對用做構建樹(tree)的數據特徵做了一定限制,使得生成的決策樹之間沒有關聯,從而提升算法效果。本文章旨在探討如何用 Python 實現隨機森林算法。
  • 原理+代碼|深入淺出Python隨機森林預測實戰
    能夠理解基本原理並將代碼用於實際的業務案例是本文的目標,本文將詳細介紹如何利用Python實現集成學習中隨機森林這個經典的方法來預測寬帶客戶的流失,主要將分為兩個部分:本文的主角是隨機森林,所以我們將以隨機森林所屬的分支 —— 裝袋法 入手,深入淺出該集成學習方法的原理步驟
  • 隨機森林算法入門(Python)
    隨機森林能夠用於分類和回歸問題,可以處理大量特徵,並能夠幫助估計用於建模數據變量的重要性。這篇文章是關於如何使用Python構建隨機森林模型。隨機森林可以用於幾乎任何一種預測問題(包括非線性問題)。它是一個相對較新的機器學習策略(90年代誕生于貝爾實驗室)可以用在任何方面。它屬於機器學習中的集成學習這一大類。
  • 理解隨機森林:基於Python的實現和解釋
    數據科學家 William Koehrsen 用 Python 實現並解釋了決策樹和隨機森林的工作過程。隨機森林也可以在每個節點考慮所有特徵來進行訓練。(在 Scikit-Learn 隨機森林實現中,這些選項是可調控的。)如果你理解了單個決策樹、bagging 決策樹、特徵的隨機子集,那你就可以很好地理解隨機森林的工作方式了。
  • 自我代碼提升之隨機森林
    然而,隨機森林也並非是萬能的模型,具有一些局限。事實上,隨機森林在某些噪音較大的分類或回歸問題上可能會陷入過擬合;而基於CART數的決策樹在特徵評估時會偏向於取值劃分更多的特徵。而且,在實際應用中,即使實現優化,隨機森林的訓練所花費的資源和時間依舊相對較高。
  • 數學推導+純Python實現機器學習算法20:隨機森林
    Bagging與Boosting圖示如下:    可以清楚的看到,Bagging是並行的框架,而Boosting則是序列框架(但也可以實現並行)。    有了之前多篇關於決策樹的基礎以及前述關於Bagging基本思想的闡述,隨機森林(Random Forest)就沒有太多難以理解的地方了。
  • 獨家 | 一文讀懂隨機森林的解釋和實現(附python代碼)
    本文從單棵決策樹講起,然後逐步解釋了隨機森林的工作原理,並使用sklearn中的隨機森林對某個真實數據集進行預測。如今由於像Scikit-Learn這樣的庫的出現,我們可以很容易地在Python中實現數百種機器學習算法。它們是如此易用,以至於我們通常都不需要任何關於模型底層工作機制的知識就可以使用它們。
  • Python學習第128課——在Python中實現醉漢隨機遊走
    【每天幾分鐘,從零入門python編程的世界!】這節我們在2D平面內實現隨機遊走。我們先把原理搞清楚,用代碼實現這個原理。原理分析:我們想像在2D平面內有一個x軸和y軸組成的坐標系,有一個人他是個醉漢,他以(0,0)為原點,隨機遊走,以x和y表示遊走後的坐標值,剛開始x=0,y=0。他每走一步之前,都需要先做一次選擇,選擇往東南西北哪一個方向去走,這個選擇我們需要先引入一個random庫,這是一個可以用來實現隨機數、隨機選擇的庫,用這個庫來實現隨機方向的選擇。
  • 機器學習之隨機森林算法(Random Forest)及python代碼實現
    隨機森林的名稱中有兩個關鍵詞,一個是「隨機」,一個就是「森林」。「森林」很好理解,一棵叫做樹,那麼成百上千棵就可以叫做森林了,這也是隨機森林的主要思想--集成思想的體現。至於「隨機」也是極其關鍵的一步,具體什麼含義在下面會再做具體介紹。
  • python隨機函數random分配應用,隨機分配8名老師到3個教室中
    羽憶教程最近遇到一個問題,要隨機分配8名老師到3個辦公室中,這時小編想要了python中的隨機函數random來進行分配工作,感覺小編像個月老一樣。python隨機函數python隨機函數在python中,想要生成隨機數,就需要使用到python隨機函數random。
  • Python視頻教程網課編程零基礎入門數據分析網絡爬蟲全套Python...
    特徵衍生 5-13HR表的特徵預處理 5-14 HR表的特徵預處理2 5-15本章小結 6-01機器學習與數據建模 6-02訓練集,驗證集,測試集 6-03分類-KNN 6-04分類-樸素貝葉斯 6-05分類-決策樹 6-06分類-支持向量機 6-07分類-集成-隨機森林
  • 隨機森林入門攻略
    在各種各樣的問題中,隨機森林一次又一次地展示出令人難以置信的強大,而與此同時它又是如此的方便實用。需要大家注意的是,在上文中特別提到的是第一組測試結果,而非所有的結果,這是因為隨機森林方法固然也有自己的局限性。在這篇文章中,我們將向你介紹運用隨機森林構建預測模型時最令人感興趣的幾個方面。隨機森林的發展史談及隨機森林算法的產生與發展,我們必須回溯到20世紀80年代。
  • 大盤點:隨機森林的優缺點以及如何用Python解釋
    全文共1755字,預計學習時長3分鐘本文來自The Learning Machine——一個開放原始碼的新項目,該項目旨在為不同背景的人群創建交互式路線圖,其中包含對概念、方法、算法及其在Python或R中的代碼裡實現所有的解釋。
  • 隨機森林算法
    這是我從第一堂課中學到的東西,這是一個1小時17分鐘的視頻,介紹了隨機森林。課的主題是隨機森林,傑裡米(講師)提供了一些基本信息以及使用Jupyter Notebook的提示和技巧。Jeremy談到的一些重要的事情是,數據科學並不等同於軟體工程。在數據科學中,我們做的是設計模型。雖然軟體工程有自己的一套實踐,但數據科學也有自己的一套最佳實踐。
  • Python代碼實踐|隨機森林是「黑盒子」?不存在的,擼完代碼你就懂了
    但是解釋隨機森林如何得到這個預測,使用哪些特徵或者獨立變量,還是個麻煩事。隨機森林常常被錯誤的解釋為一個「黑盒子」,很難理解。Random Forest Ensemble用Python寫一個隨機森林下面是一個從頭寫隨機森林代碼和優化的練習,可以增進對隨機森林的深入理解。我們還會看看,如何理解給定的特徵的權值是如何給到的,為什麼這麼設置,為什麼不用其他的特徵來預測結果。
  • 那些有趣/用的 Python 庫,15篇 Python 技術熱文
    《Python 爬蟲實踐:《戰狼2》豆瓣影評分析》本文用 Python 實現了簡單的爬蟲爬取了豆瓣的最新電影的影評。主要分為三部分:抓取網頁數據、清理數據、用詞雲進行展示。想學習Python網絡爬蟲的同學可以作為參考。
  • Stata:隨機森林算法簡介與實現
    背景介紹「隨機森林」是利用統計或機器學習算法進行預測的方法。隨著技術的發展,該方法開始被廣泛的應用到社會科學中,並取得了較好預測效果。之所以如此,是因為隨機森林考慮到了數據中的非線性關係。與此同時,隨機森林集成的學習算法也非常適合大型數據集。