中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

理解隨機(jī)森林:基于Python的實現(xiàn)和解釋

2018-12-24    來源:raincent

容器云強(qiáng)勢上線!快速搭建集群,上萬Linux鏡像隨意使用

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

引言

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

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

理解決策樹

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

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

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

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

一個簡單問題的決策樹

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

 

 

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

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

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

 

 

這就是全部了!

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

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

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é)點(diǎn)(終端節(jié)點(diǎn))之外的所有節(jié)點(diǎn)都有 5 部分:

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

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

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

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

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

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

基尼不純度(Gini Impurity)

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

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

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

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

 

 

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

 

 

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

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

 

 

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

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

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

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

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

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

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

隨機(jī)森林

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

1.隨機(jī)采樣數(shù)據(jù)點(diǎn)

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

隨機(jī)采樣

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

特征的隨機(jī)子集

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

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

隨機(jī)森林實踐

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

數(shù)據(jù)集

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

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

 

 

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

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

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

 

 

結(jié)果

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

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

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

 

 

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

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

 

 

特征重要度

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

 

 

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

可視化森林中的樹

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

 

 

接下來的步驟

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

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

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

總結(jié)

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

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

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

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

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

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

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

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

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

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

標(biāo)簽: 代碼 搜索

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請與原作者聯(lián)系。

上一篇:年度回顧:2018年的人工智能/機(jī)器學(xué)習(xí)驚喜及預(yù)測19年的走勢

下一篇:FacebooK被正式起訴,涉與150多家科技公司“數(shù)據(jù)共享”