A级片三级毛片中文字幕|97人人干人人爱|aaaaa毛片亚洲av资源网|超碰97在线播放|日本一a级毛片欧美一区黄|日韩专区潮吹亚洲AV无码片|人人香蕉视频免费|中文字幕欧美激情极品|日本高清一级免费不卡|国模大胆在线国产啪视频

AQF
首頁 備考指南 精品課程 名師團隊 職業(yè)前景
您現在的位置:首頁備考必備AQF資料 理解隨機森林:基于Python的實現和解釋

理解隨機森林:基于Python的實現和解釋

發(fā)表時間: 2019-08-12 10:02:02 編輯:tansy

本文將介紹如何使用 Python 構建和使用隨機森林。我們不只是簡單地展示代碼,而會盡力解釋模型的工作方式。我們將從一個解決簡單問題的單個決策樹開始,然后逐漸深入,最終完成一個針對某個真實世界數據科學問題的隨機森林。

  

隨機森林

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

  引言

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

  本文將介紹如何使用 Python 構建和使用隨機森林。我們不只是簡單地展示代碼,而會盡力解釋模型的工作方式。我們將從一個解決簡單問題的單個決策樹開始,然后逐漸深入,最終完成一個針對某個真實世界數據科學問題的隨機森林。

  理解決策樹

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

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

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

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

  一個簡單問題的決策樹

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

  隨機森林

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

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

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

from sklearn.tree import DecisionTreeClassifier

# Make a decision tree and train

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

  這就是全部了!

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

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

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

Model Accuracy: 1.0

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

  可視化決策樹

  所以我們在構建決策樹時究竟發(fā)生了什么?我發(fā)現最有幫助的理解決策樹的方法是可視化,我們可以使用 Scikit-Learn 實用程序來做這件事。

  隨機森林

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

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

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

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

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

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

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

  基尼不純度(Gini Impurity)

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

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

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

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

  隨機森林

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

  隨機森林

  在這非常簡單的數學運算中,一個非常強大的機器學習模型誕生了!

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

  隨機森林

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

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

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

  我們知道出現這種情況的原因是我們已經為其提供過答案。而機器學習模型的關鍵在于能很好地泛化用于測試數據。不幸的是,當我們不限制決策樹的深度時,它往往都會與訓練數據過擬合。

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

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

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

  隨機森林

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

  1.隨機采樣數據點

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

  隨機采樣

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

  特征的隨機子集

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

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

  隨機森林實踐

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

  數據集

  我們要解決的問題是一個二元分類任務。特征是個體的社會經濟和生活方式屬性,標簽 0 表示健康狀況差,標簽 1 表示身體健康。這是一個不平衡分類問題,因此準確度并不是合適的度量標準。我們將衡量曲線下受試者工作特性曲線(ROC AUC),該度量的取值范圍為 0(最差)到 1(較好),隨機猜測的分數為 0.5。我們還可以繪制 ROC 曲線來評估模型的表現。

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

  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)

  經過幾分鐘的訓練之后,可以通過以下代碼讓該模型基于測試數據進行預測:

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

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

  from sklearn.metrics import roc_auc_score

# Calculate roc auc

roc_value = roc_auc_score(test_labels, rf_probs)

  

結果

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

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

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

  隨機森林

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

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

  隨機森林

  特征重要度

  隨機森林中的特征重要度是指在依據該特征分割的所有節(jié)點上基尼不純度降低的總和。我們可以使用這一指標確定隨機森林認為最重要的預測變量是什么。特征重要度可從訓練后的隨機森林中提取出來,并表示成 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 或較低的特征。

  可視化森林中的樹

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

  隨機森林

  接下來的步驟

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

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

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

  總結

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

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

  決策樹:基于有關特征值的問題的流程圖進行決策的直觀模型。因為過擬合訓練數據而有很高的方差。

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

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

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

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

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

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

量化金融分析師(簡稱AQF ,Analyst of Quantitative Finance)由量化金融標準委員會(Standard Committee of Quantitative Finance,SCQF)主考并頒證,是代表量化金融領域的專業(yè)水平證書。 >>>點擊咨詢AQF證書含金量

  AQF證書

課程適合人群:

  金融工程/數學專業(yè)背景的同學/工作人士,希望進一步學習Python編程以及在量化投資的實戰(zhàn)應用;

  非金融工程專業(yè)背景的同學/工作人士,希望迅速成為寬客;

  金融相關人員,希望學習如何系統(tǒng)的做量化策略;

  個人投資者,希望系統(tǒng)學習掌握量化投資相關的實務技能,從模型開發(fā),回測,策略改進,搭建穩(wěn)定的量化交易系統(tǒng)。>>>點擊咨詢AQF課程相關問題

量化金融分析師AQF實訓項目

(點擊上圖了解課程詳情)

  量化金融分析師AQF核心課程體系:

  1、《量化投資基礎》

  主要涵蓋了量化投資領域的必備知識,包括:基本面分析、技術分析、數量分析、固定收益、資產組合管理、權益、另類投資等內容。

  2、《Python語言編程基礎》

  包含了Python環(huán)境搭建、基礎語法、變量類型、基本函數、基本語句、第三方庫、金融財務實例等內容。旨在為金融財經人提供最需要的編程方法。

  3、《基于Python的經典量化投資策略》

  包含了最富盛名,最基本的量化交易思想和交易策略。例如:海龜交易模型、Logistics模型、配對交易模型、波動擴張模型、Alpha模型、機器學習(隨機森林模型、主成分分析)、深度學習(人工神經網絡)等內容。

  4、《量化交易系統(tǒng)設計》

  旨在學習量化交易系統(tǒng)的具體知識,包括過濾器,進入信號,退出信號,倉位管理等詳細內容,并指導學員設計涵蓋個人交易哲學的量化交易系統(tǒng)。

  5、《量化實盤交易》

  旨在為解決實際量化交易策略搭建過程中的一些問題提供較優(yōu)解決方案。 >>>點擊咨詢AQF相關問題

  

  掌握Python及量化投資技能,我們能做什么?

1、熟悉中國主要金融市場及交易產品的交易機制;

2、熟知國內外期貨交易、股市交易的異同點和內在運行機制;

3、掌握經典量化交易策略細節(jié)及其背后的交易哲學;

4、掌握金融、編程和建模知識基礎,擁有量化交易實盤操作能力;

5、具備獨立自主地研發(fā)新量化交易策略的能力;

6、掌握量化交易模型設計的基本框架,以及風險管理和資產組合理論的實際運用;

7、掌握從策略思想——策略編寫——策略實現餓完整量化投資決策過程;具備量化投資實戰(zhàn)交易能力。

  

  AQF試聽課

金程推薦: AQF培訓 AQF培訓機構 AQF是什么意思

咨詢電話:400-700-9596

AQF考友群:760229148

  金融寬客交流群:801860357

  微信公眾號:量化金融分析師

  >>>返回首頁

吐槽

對不起!讓你吐槽了

/500

上傳圖片

    可上傳3張圖片

    2001-2026 上海金程教育科技有限公司 All Rights Reserved. 信息系統(tǒng)安全等級:三級
    中央網信辦舉報中心 上海市互聯網舉報中心 不良信息舉報郵箱:law@gfedu.net
    滬ICP備14042082號 滬B2-20240743 通過ISO9001:2015 國際質量管理體系認證 滬公網安備31010902103762號 出版物經營許可證 電子營業(yè)執(zhí)照

    掃描二維碼登錄金程網校

    請使用新版 金程網校APP 掃碼完成登錄

    登錄即同意金程網校協(xié)議及《隱私政策》