日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > python >内容正文

python

理解随机森林:基于Python的实现和解释

發(fā)布時間:2025/6/17 python 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 理解随机森林:基于Python的实现和解释 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

選自enlight.nyc

作者:WILLIAM KOEHRSEN

機器之心編譯

參與:Panda


隨機森林是一種強大的機器學(xué)習(xí)模型,得益于各種強大的庫,現(xiàn)在人們可以很輕松地調(diào)用它,但并不是每一個會使用該模型的人都理解它的工作方式。數(shù)據(jù)科學(xué)家 William Koehrsen 用 Python 實現(xiàn)并解釋了決策樹和隨機森林的工作過程。


引言


感謝 Scikit-Learn 這樣的庫,讓我們現(xiàn)在可以非常輕松地使用 Python 實現(xiàn)任何機器學(xué)習(xí)算法。事實上操作起來很簡單,我們往往無需了解任何有關(guān)模型內(nèi)部工作方式的任何知識就能使用它。盡管我們并不需要理解所有細節(jié),但了解一些有關(guān)模型訓(xùn)練和預(yù)測方式的思路仍然會有很大的幫助。這使得我們可以在模型表現(xiàn)不如預(yù)期時對模型進行診斷,或解釋我們的模型做決策的方式——這能幫助我們說服他人使用我們的模型。


本文將介紹如何使用 Python 構(gòu)建和使用隨機森林。我們不只是簡單地展示代碼,而會盡力解釋模型的工作方式。我們將從一個解決簡單問題的單個決策樹開始,然后逐漸深入,最終完成一個針對某個真實世界數(shù)據(jù)科學(xué)問題的隨機森林。本文所涉及的完整代碼可參閱這個 GitHub 上的 Jupyter Notebook:https://github.com/TryEnlight/Machine-Learning-Projects/blob/master/Random%20Forest%20Tutorial.ipynb


理解決策樹


決策樹是隨機森林的構(gòu)建模塊,本身是一種相當(dāng)直觀的模型。我們可以將決策樹看作是詢問有關(guān)數(shù)據(jù)的問題的流程圖,并最終導(dǎo)向一個預(yù)測類別(在回歸任務(wù)上則是連續(xù)值)。這是一種可解釋的模型,因為其決策方式類似于我們在現(xiàn)實生活中做法:我們詢問一系列有關(guān)數(shù)據(jù)的問題,直到我們最終達成決策。


決策樹的主要技術(shù)細節(jié)在于如何構(gòu)建有關(guān)數(shù)據(jù)的問題。決策樹的構(gòu)建方式是構(gòu)建能最大限度降低基尼不純度(Gini Impurity)的問題。


我們稍后一點會談到基尼不純度,現(xiàn)在你只需要知道,這意味著決策樹會盡力構(gòu)建盡可能純的節(jié)點,其中有很高比例的樣本(數(shù)據(jù)點)都來自同一個類別。


基尼不純度和決策樹構(gòu)建可能有些難以理解,所以首先我們構(gòu)建一個決策樹,然后我們通過一些簡單的數(shù)學(xué)來進行解釋。


一個簡單問題的決策樹


我們先從一個如下所示的非常簡單的二元分類任務(wù)開始:



我們的數(shù)據(jù)僅有兩個特征(預(yù)測變量)。這里共有 6 個數(shù)據(jù)點,2 種不同的標簽。


盡管這個問題很簡單,但卻無法實現(xiàn)線性分割,也就是說我們不能在這些數(shù)據(jù)之間用一條直線將各個點劃分到對應(yīng)的類別。但是,我們可以畫出一系列直線來分開這兩個類別,這實際上就是決策樹在構(gòu)建系列問題時的做法。


為了創(chuàng)建決策樹,并在數(shù)據(jù)上進行訓(xùn)練(擬合),我們可以使用 Scikit-Learn:


from?sklearn.tree?import?DecisionTreeClassifier
#?Make?a?decision?tree?and?train

tree?=?DecisionTreeClassifier(random_state=RSEED)?
tree.fit(X,?y)?


這就是全部了!


在訓(xùn)練過程中,我們會向模型提供特征和標簽,使其能夠?qū)W習(xí)基于這些特征對數(shù)據(jù)點進行分類。我們沒有針對這個簡單問題的測試集,但在進行測試時,我們只向模型提供特征,然后讓其給出對標簽的預(yù)測。


我們可以在訓(xùn)練數(shù)據(jù)上測試模型的準確度:


print(f'Model?Accuracy:?{tree.score(X,?y)}')

Model?Accuracy:?1.0?


可以看到正確率為 100%,這符合預(yù)期,因為我們在訓(xùn)練過程中已經(jīng)提供過答案(y)。


可視化決策樹


所以我們在構(gòu)建決策樹時究竟發(fā)生了什么?我發(fā)現(xiàn)最有幫助的理解決策樹的方法是可視化,我們可以使用 Scikit-Learn 實用程序來做這件事(詳情可參考 https://goo.gl/BYVyQJ 或 https://goo.gl/P98VjQ)。



這展現(xiàn)了上述決策樹的整體結(jié)構(gòu)。除葉節(jié)點(終端節(jié)點)之外的所有節(jié)點都有 5 部分:


  • 基于一個特征的值的有關(guān)數(shù)據(jù)的問題。每個問題的答案要么是 True,要么就是 False。數(shù)據(jù)點會根據(jù)該問題的答案在該決策樹中移動。

  • gini:節(jié)點的基尼不純度。當(dāng)沿著樹向下移動時,平均加權(quán)的基尼不純度必須降低。

  • samples:節(jié)點中觀察的數(shù)量。

  • value:每一類別中樣本的數(shù)量。比如,頂部節(jié)點中有 2 個樣本屬于類別 0,有 4 個樣本屬于類別 1。

  • class:節(jié)點中大多數(shù)點的類別(持平時默認為 0)。在葉節(jié)點中,這是該節(jié)點中所有樣本的預(yù)測結(jié)果。


  • 葉節(jié)點沒有問題,因為這些節(jié)點是得出最終預(yù)測結(jié)果的地方。要分類一個新的數(shù)據(jù)點,只需沿樹向下,使用該數(shù)據(jù)點的特征來回答問題,直到到達一個葉節(jié)點即可,此處的類別即為該樹的預(yù)測結(jié)果。你可以使用上述的點進行嘗試或測試 Notebook 中不同的預(yù)測。


    基尼不純度(Gini Impurity)


    現(xiàn)在我們應(yīng)該去理解什么是基尼不純度了。簡單來說,基尼不純度就是節(jié)點中隨機選出的樣本如果根據(jù)該節(jié)點的樣本分布標注而因此標注不正確的概率。比如,在頂部(根)節(jié)點中,有 44.4% 的可能性將一個隨機選擇的數(shù)據(jù)點基于該節(jié)點的樣本標簽分布不正確地分類。


    基尼不純度是決策樹決定用于分割節(jié)點(有關(guān)數(shù)據(jù)的問題)的特征值的方式。樹會通過所有用于分割的特征來進行搜索,以最大化地降低不純度。


    基尼不純度為 0 時最完美,因為這意味著隨機選出的樣本不可能被錯誤標注,只有當(dāng)一個節(jié)點中的所有樣本都屬于同一類別時才會出現(xiàn)這種情況!在樹的每一層級,加權(quán)的平均基尼不純度都會降低,表明節(jié)點變得更純(另一種分割節(jié)點的方法是使用信息增益,這是一個相關(guān)的概念)。


    一個節(jié)點的基尼不純度的公式為:



    其中 p_i 是該節(jié)點中類別 i 中數(shù)據(jù)點的比例。我們來計算一下根(頂部)節(jié)點的基尼不純度:



    在這非常簡單的數(shù)學(xué)運算中,一個非常強大的機器學(xué)習(xí)模型誕生了!


    這是該決策樹頂層的總基尼不純度,因為這里僅有根節(jié)點。在這個決策樹的第二層,最左邊的節(jié)點的基尼不純度為 0.5,這似乎表明不純度增大了。但是,每一層應(yīng)該降低的是基尼不純度的加權(quán)平均。每個節(jié)點都會根據(jù)其樣本占父節(jié)點樣本的比例進行加權(quán)。所以整體而言,第二層的基尼不純度為:



    隨著我們繼續(xù)沿決策樹向下,節(jié)點最終會越來越純;在最后一層,每個節(jié)點的基尼不純度都會達到 0.0,這說明每個節(jié)點都只包含單一類別的樣本。這符合我們的預(yù)期,因為我們并沒有限制決策樹的深度,讓其可以按需要創(chuàng)建足夠多的層以能分類所有數(shù)據(jù)點。盡管我們的模型能正確分類所有的訓(xùn)練數(shù)據(jù)點,但這并不意味著它就是完美的,因為它與訓(xùn)練數(shù)據(jù)可能過擬合了。


    過擬合:森林比樹更優(yōu)的原因


    你可能會問為什么不直接使用一個決策樹?這種分類器堪稱完美,因為根本不會犯任何錯誤!但要記住一個重點:決策樹只是不會在訓(xùn)練數(shù)據(jù)上犯錯。


    我們知道出現(xiàn)這種情況的原因是我們已經(jīng)為其提供過答案。而機器學(xué)習(xí)模型的關(guān)鍵在于能很好地泛化用于測試數(shù)據(jù)。不幸的是,當(dāng)我們不限制決策樹的深度時,它往往都會與訓(xùn)練數(shù)據(jù)過擬合。


    過擬合是指我們的模型有很高的方差并且本質(zhì)上記憶了訓(xùn)練數(shù)據(jù)的情況。這意味著其在訓(xùn)練數(shù)據(jù)上表現(xiàn)非常好,甚至能達到完美的程度,但這樣它將無法在測試數(shù)據(jù)上做出準確的預(yù)測,因為測試數(shù)據(jù)是不同的!我們想要的是既能在訓(xùn)練數(shù)據(jù)上表現(xiàn)優(yōu)良,也能很好地分析測試數(shù)據(jù)的模型。為什么當(dāng)我們不限制決策樹的最大深度時會使其容易過擬合呢?因為此時決策樹有不受限制的復(fù)雜度,這意味著它會不斷生長,直到針對每個觀察都有一個葉節(jié)點,從而完美地分類所有數(shù)據(jù)點。


    要理解決策樹高方差的原因,我們可以將其看作是一個人。想象一下,你必須分析明日蘋果股票是否上漲,然后你決定去詢問幾位分析師。任何一位分析師都可能有很大的差異,并且非常依賴他們各自能獲取的數(shù)據(jù)——一位分析師可能僅閱讀支持蘋果公司的新聞,因此她可能認為價格會上漲,而另一位分析師最近聽朋友說蘋果產(chǎn)品質(zhì)量開始下降了,所以她認為應(yīng)當(dāng)下跌。這些分析師個體之間有很高的方差,因為他們的答案嚴重依賴于他們見過的數(shù)據(jù)。


    我們也可以不詢問單個分析師,而是綜合大量專家的意見,并基于最常見的答案給出最終決策。因為每位分析師都會看到不同的數(shù)據(jù),所以可以預(yù)期個體差異會很大,但整個集體的總體方差應(yīng)該會減小。使用許多個體正是隨機森林方法背后的本質(zhì)思路:不是使用單個決策樹,而是使用數(shù)百或數(shù)千個決策樹來組成一個強大的模型。則該模型的最終預(yù)測結(jié)果即為集體中所有樹的預(yù)測的平均。(過擬合問題也被稱為「偏差-方差權(quán)衡」問題,是機器學(xué)習(xí)領(lǐng)域內(nèi)一大基本研究主題。)


    隨機森林


    隨機森林是由許多決策樹構(gòu)成的模型。這不僅僅是森林,而且是隨機的,這涉及到兩個概念:


    1.隨機采樣數(shù)據(jù)點

    2.基于特征的子集分割節(jié)點


    隨機采樣


    隨機森林的一大關(guān)鍵是每個樹都在隨機的數(shù)據(jù)點樣本上進行訓(xùn)練。這些樣本是可重復(fù)地抽取出來的(稱為 bootstrapping),也就是說某些樣本會多次用于單個樹的訓(xùn)練(如果有需要,也可以禁止這種做法)。其思路是,通過在不同樣本上訓(xùn)練每個樹,盡管每個樹依據(jù)訓(xùn)練數(shù)據(jù)的某個特定子集而可能有較高方差,但整體而言整個森林的方差會很低。這種在數(shù)據(jù)的不同子集上訓(xùn)練每個單個學(xué)習(xí)器然后再求預(yù)測結(jié)果的平均的流程被稱為 bagging,這是 bootstrap aggregating 的縮寫。


    特征的隨機子集


    隨機森林背后的另一個概念是:在每個決策樹中,分割每個節(jié)點時都只會考慮所有特征中的一個子集。通常設(shè)定為 sqrt(n_features),意思是在每個節(jié)點,決策樹會基于一部分特征來考慮分割,這部分特征的數(shù)量為總特征數(shù)量的平方根。隨機森林也可以在每個節(jié)點考慮所有特征來進行訓(xùn)練。(在 Scikit-Learn 隨機森林實現(xiàn)中,這些選項是可調(diào)控的。)


    如果你理解了單個決策樹、bagging 決策樹、特征的隨機子集,那你就可以很好地理解隨機森林的工作方式了。隨機森林組合了數(shù)百或數(shù)千個決策樹,并會在稍有不同的觀察集上訓(xùn)練每個決策樹(數(shù)據(jù)點是可重復(fù)地抽取出來的),并且會根據(jù)限定數(shù)量的特征分割每個樹中的節(jié)點。隨機森林的最終預(yù)測結(jié)果是每個單個樹的預(yù)測結(jié)果的平均。


    隨機森林實踐


    非常類似于其它 Scikit-Learn 模型,通過 Python 使用隨機森林僅需要幾行代碼。我們將會構(gòu)建一個隨機森林,但不是針對上述的簡單問題。為了比較隨機森林與單個決策樹的能力,我們將使用一個真實數(shù)據(jù)集,并將其分成了訓(xùn)練集和測試集。


    數(shù)據(jù)集


    我們要解決的問題是一個二元分類任務(wù)。特征是個體的社會經(jīng)濟和生活方式屬性,標簽 0 表示健康狀況差,標簽 1 表示身體健康。該數(shù)據(jù)集是由美國疾病預(yù)防控制中心收集的,可在這里獲取:https://www.kaggle.com/cdc/behavioral-risk-factor-surveillance-system。這是一個不平衡分類問題,因此準確度并不是合適的度量標準。我們將衡量曲線下受試者工作特性曲線(ROC AUC),該度量的取值范圍為 0(最差)到 1(最好),隨機猜測的分數(shù)為 0.5。我們還可以繪制 ROC 曲線來評估模型的表現(xiàn)。


    引言提到的 Jupyter Notebook 包含了針對該任務(wù)的決策樹和隨機森林實現(xiàn),但這里我們只關(guān)注隨機森林。在讀取了數(shù)據(jù)之后,我們可以用以下代碼實例化并訓(xùn)練一個隨機森林:


    from?sklearn.ensemble?import?RandomForestClassifier

    #?Create?the?model?with?100?trees

    model?=?RandomForestClassifier(n_estimators=100,?
    random_state=RSEED,?
    max_features?=?'sqrt',?
    n_jobs=-1,?verbose?=?1)

    #?Fit?on?training?data

    model.fit(train,?train_labels)?


    經(jīng)過幾分鐘的訓(xùn)練之后,可以通過以下代碼讓該模型基于測試數(shù)據(jù)進行預(yù)測:


    rf_predictions?=?model.predict(test)?rf_probs?=?model.predict_proba(test)[:,?1]


    我們既有類別預(yù)測結(jié)果(predict),也有預(yù)測概率(predict_proba),都是計算 ROC AUC 所需的。有了測試預(yù)測結(jié)果之后,我們可以將它們與測試標簽進行比較,以計算出 ROC AUC。


    from?sklearn.metrics?import?roc_auc_score

    #?Calculate?roc?auc

    roc_value?=?roc_auc_score(test_labels,?rf_probs)?


    結(jié)果


    隨機森林的最終 ROC AUC 結(jié)果是 0.87,而單個決策樹的結(jié)果是 0.67。如果我們看看訓(xùn)練分數(shù),可以看到這兩個模型都得到了 1.0 的 ROC AUC,同樣這符合預(yù)期,因為我們已經(jīng)為這些模型提供過訓(xùn)練數(shù)據(jù)的答案并且沒有限制最大深度。但是,盡管隨機森林過擬合了,但比起單個決策樹,它仍能遠遠更好地泛化到測試數(shù)據(jù)上。


    檢視模型內(nèi)部,可以看到單個決策樹的最大深度為 55,共有 12327 個節(jié)點。隨機森林中決策樹的平均深度為 46,平均節(jié)點數(shù)為 13396。即使隨機森林的平均節(jié)點數(shù)更大,它也能更好地泛化!


    我們還可以繪制單個決策樹(上)和隨機森林(下)的 ROC 曲線。曲線越靠近左上角,則模型越好:



    可以看到隨機森林明顯優(yōu)于單個決策樹。


    我們還可以使用另一種模型診斷方法,即繪制測試預(yù)測結(jié)果的混淆矩陣(詳見 Jupyter Notebook):



    特征重要度


    隨機森林中的特征重要度是指在依據(jù)該特征分割的所有節(jié)點上基尼不純度降低的總和。我們可以使用這一指標確定隨機森林認為最重要的預(yù)測變量是什么。特征重要度可從訓(xùn)練后的隨機森林中提取出來,并表示成 Pandas dataframe 的形式:


    import?pandas?as?pd

    fi?=?pd.DataFrame({'feature':?list(train.columns),?
    'importance':?model.feature*importances*}).?
    sort_values('importance',?ascending?=?False)

    fi.head()

    feature?importance?
    tDIFFWALKt0.036200?
    tQLACTLM2t0.030694?
    tEMPLOY1t?0.024156?
    tDIFFALONt0.022699?
    tUSEEQUIPt0.016922?
    tDECIDEt?0.016271?
    t_LMTSCL1t0.013424?
    tINCOME2t?0.011929?
    tCHCCOPD1t0.011506?
    t_BMI5t?0.011497?


    我們還可以使用特征重要度來進行特征選擇,即移除重要度為 0 或較低的特征。


    可視化森林中的樹


    最后,我們可以可視化森林中的單個決策樹。這時候我們就必須限定樹的深度了,因為整個樹非常大,難以轉(zhuǎn)換成單張圖像。我將最大深度設(shè)定為 6,得到了下面的圖像。這仍然是一副很大的圖!



    接下來的步驟


    下一步可以對隨機森林進行優(yōu)化,可以通過隨機搜索和 Scikit-Learn 中的 RandomizedSearchCV 來做。


    優(yōu)化是指為給定數(shù)據(jù)集上的模型尋找最佳的超參數(shù)。數(shù)據(jù)集不同,最佳的超參數(shù)也會各有不同,所以我們必須分別在每個數(shù)據(jù)集上執(zhí)行優(yōu)化(也被稱為模型調(diào)節(jié))。我喜歡將模型調(diào)節(jié)看作是尋找機器學(xué)習(xí)算法的最佳設(shè)置。


    引言中提到的 Jupyter Notebook 提供了一個用于隨機森林的模型優(yōu)化的隨機搜索的實現(xiàn)。


    總結(jié)


    盡管我們無需理解機器學(xué)習(xí)模型內(nèi)部的任何情況也能構(gòu)建出強大的機器學(xué)習(xí)模型,但了解一些模型工作方式的相關(guān)知識將大有裨益。在本文中,我們不僅用 Python 構(gòu)建和使用了一個隨機森林,而且還對該模型進行了理解。


    我們首先了解了單個決策樹,這是隨機森林的基本構(gòu)建模塊;然后我們看到了可以如何將數(shù)百或數(shù)千個決策樹組合成一個集合模型。當(dāng)這種集合模型與 bagging 和隨機的特征采樣一起使用時,就被稱為隨機森林。本文中涉及的關(guān)鍵概念有:


  • 決策樹:基于有關(guān)特征值的問題的流程圖進行決策的直觀模型。因為過擬合訓(xùn)練數(shù)據(jù)而有很高的方差。

  • 基尼不純度:決策樹在分割每個節(jié)點時所要最小化的指標。表示從一個節(jié)點隨機選出的一個樣本依據(jù)該節(jié)點的樣本分布而錯誤分類的概率。

  • bootstrapping:可重復(fù)地采樣隨機觀察集。隨機森林用于訓(xùn)練每個決策樹的方法。

  • 隨機特征子集:在考慮如何分割決策樹中的每個節(jié)點時,選擇一個隨機的特征集。

  • 隨機森林:由數(shù)百或數(shù)千個使用 bootstrapping、隨機特征子集和平均投票來做預(yù)測的決策樹構(gòu)成的集合模型。這是 bagging 集成的一個示例。

  • 偏差-方差權(quán)衡:機器學(xué)習(xí)領(lǐng)域內(nèi)的一個基本問題,描述了高復(fù)雜度的模型和簡單模型之間的權(quán)衡。高復(fù)雜度模型可以很好地學(xué)習(xí)訓(xùn)練數(shù)據(jù),但代價是不能很好地泛化到測試數(shù)據(jù)(高方差);而簡單模型(高偏差)甚至無法學(xué)習(xí)訓(xùn)練數(shù)據(jù)。隨機森林能在降低單個決策樹的方差的同時準確地學(xué)習(xí)訓(xùn)練數(shù)據(jù),從而在測試數(shù)據(jù)上得到更好的預(yù)測結(jié)果。


  • 希望這篇文章能為你提供信心,幫助你理解隨機森林并開始在你自己的項目中使用它。隨機森林是一種強大的機器學(xué)習(xí)模型,但這不應(yīng)該妨礙我們理解它的工作方式!我們對一個模型的了解越多,我們就能越好地使用它以及解釋它做預(yù)測的方式,這樣其他人才會信任它!現(xiàn)在行動起來,用隨機森林解決一些問題吧。


    原文鏈接:https://enlight.nyc/projects/random-forest/



    本文為機器之心編譯,轉(zhuǎn)載請聯(lián)系本公眾號獲得授權(quán)

    ?------------------------------------------------

    加入機器之心(全職記者 / 實習(xí)生):hr@jiqizhixin.com

    投稿或?qū)で髨蟮?#xff1a;content@jiqizhixin.com

    廣告 & 商務(wù)合作:bd@jiqizhixin.com

    總結(jié)

    以上是生活随笔為你收集整理的理解随机森林:基于Python的实现和解释的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。