Python隨機森林 - CodeProject
點選上方“中興開發者社群”,關注我們
每天讀一篇一線開發者原創好文
譯者:XTH
英文原文:https://www.codeproject.com/Articles/1197167/Random-Forest-Python
隨機森林介紹
隨機森林是一種在整合學習中很受歡迎的演算法,可用於分類和迴歸。這意味著隨機森林中包括多種決策樹,並將每個決策樹結果的平均值作為隨機森林的最終輸出。決策樹有一些缺點,比如訓練集的過擬合導至很高的差異性,不過這在隨機森林中已經可以通過Bagging(Bootstrap Aggregating)的幫助解決。因為隨機森林實際上是由多種不同的決策樹組成的,所以我們最好先了解一下決策樹演算法,然後再學習隨機森林的相關知識。
決策樹:
決策樹用樹形圖來檢視各元素之間的關係,以儘可能的做出最好的決定。舉個例子,現在我們知道有一個網球運動員,他會根據不同的天氣條件來選擇是否進行比賽。於是現在我們想知道:在第15天的時候他是否會進行比賽呢?
尋找“純淨”分支
這裡有15天的資料,其中有9天他進行了比賽,5天沒有比賽。你需要仔細觀察表中提供的訓練資料,其中包括多種特徵及各不相同的特徵值。我們需要找到哪些特徵的特徵值對結果的影響是相同的(在該特徵值出現時,所有的PLAY = Yes/PLAY = No),或者換句話說,哪個值在表中始終與Play值的顏色相同。
“純淨”分支選擇過程:
(Humidity = High For all days: (Play = Yes) | (Play = No)) No
(Humidity = Normal For all days: (Play = Yes) | (Play = No)) No
(Wind = Weak For all days: (Play = Yes) | (Play = No)) No
(Wind = Strong For all days: (Play = Yes) | (Play = No)) No
(Outlook = Rain For all days: (Play = Yes) | (Play = No)) No
(Outlook = Sunny For all days: (Play = Yes) | (Play = No)) No
(Outlook = Overcast For all days: (Play = Yes) | (Play = No)) Yes √
所以我們的運動員總是在"outlook = overcast"(D3,D7,D12,D13)時參加比賽,所以我們應該將"outlook"這個特徵作為我們的根節點,並從其開始繼續尋找分支。接下來我們尋找特徵"Outlook = Sunny"(D1,D2,D8,D9,D11)條件下的“純淨”分支,檢視"humidity"和"wind"的哪個特徵值對應的play值全部相同,然後將其作為接下來的分支。通過觀察,只有"Humidity = High"滿足了條件。
1. Sunny: D1, D2, D8 & (Humidity = High) (Play = No)
2. Sunny: D9, D11 & (Humidity = Normal) (Play = Yes)
所以我們通過尋找“純淨”值,確定了下一個分支是"Humidity",接下來我們再來確定"Outlook = Rain"(D4,D5,D6,D10,D14)情況下的分支。
1. Rain: D4, D5, D10 & (Wind = Weak) (Play = Yes)
2. Rain: D6, D14 & (Wind = Strong) (Play = no)
由此,我們可以得到決策樹:
現在,我們可以清楚的看到圖表和決策樹的對比:
所以,為了推測D15他是否出戰比賽,我們首先考慮"Outlook = Rain",下一步通過右側分支,檢查"Wind = Weak"的情況,於是我們到達了最底層,並得到了“Yes”的答案,他將會在D15出戰比賽。
(補充:過擬合的定義;在下面的圖中,正如你所看到的,我們在每個節點不斷選擇,直到得到“純淨”的結果。舉個例子來說,在所有的葉子節點上,“Play”的值只能全部是yes或no。如果將一個“純淨”的資料集完美的分割,則通過決策樹選擇的準確率將達到100%。這意味著每一個葉節點只有一個特定值。越多的分割會會使我們得到更精確地結果和更大的決策樹,因為在分割的過程中決策樹會不斷地增長。當決策樹增大到與資料集相同時,就發生了“過擬合”。過擬合意味著演算法只能適應特殊的資料,而不能應用到更多的測試資料。可通過對決策樹進行剪枝以避免或解決過擬合問題,以某種方式將不太適合未來測試資料的分支移除,然後檢視移除操作對結果產生的影響。)
選擇過程:
[ If (“outlook = Sunny” & “Humidity = Normal” all of “Play = Yes”) ]
[ If (“outlook = Rain” & “wind = weak” all of “Play = Yes”) ]
D15: “Outlook = Rain” & “Humidity=High” & “Wind=Weak”
隨機森林:
隨機森林是一種整合學習方法,非常適合用於分類、迴歸等監督學習。在隨機森林中,我們將資料集劃分成多個小部分,然後將每部分作為獨立的樹,其結果對自身之外的其他樹沒有影響。隨機森林獲得訓練資料並通過"Bagging = Bootstrap Aggregating"演算法將其分割,該演算法可通過避免過擬合和降低差異性來提高準確率。它一開始將資料集的60%劃分為獨立的決策樹,30%作為重疊資料集。
它將訓練集分為不同的平衡決策樹(60%用不同的資料,30%用重複資料),然後再計算每個決策樹的結果,將其進行分解直至合適的情況(足以處理測試資料),在下面你可以看到,從決策樹中我們得到了2個"NO"以及3個"YES",所以根據平均值,最後的答案是"YES"。
隨機森林中的誤差計算:有許多方案可以用來對隨機森林進行優化。交叉驗證可評估預測模型的結果對另外的獨立測試資料實用性。如下圖中的訓練集,被分為輸出"Y"與特徵“X”:
Bootstrapping:
隨機建立T樹,每生成一個資料集隨機抽樣N次,生成T={T1,T2,T3,T4,T5}。
Out of Bag Error: 隨機指定一個值,比如 j =(Xi,Yi),然後在所有樹中查詢j,會發現有些樹不包含這個值(因為取樣時沒有包含全部資料),這些樹的集合就是out-of-bag樣例。
程式設計
我已經準好備了訓練用的資料集及測試集,以便通過python來練習隨機森林。訓練集是與病人相關的資料,其中我們可以知道他們的年齡、性別、醫院等級、以及是否被治癒。在測試集中我們不知道病人是否被治癒,所以我們需要用隨機森林來測試它,最後將結果寫入result.csv,一個空的Excel檔案。我將他們全部儲存為csv格式,以便於使用python進行處理。
下載python:
如果你想輕鬆地使用舒適的IDE和專業的編輯器,而且省去複雜的庫安裝環節,你可以選擇Anaconda&Spyder.
然後開啟 Anaconda Navigator,選擇"Spyder".
開始程式設計前,先了解一些要點:
-
python是物件導向的
-
動態型別
-
有豐富的庫資源
-
易讀性
-
python是大小寫敏感的
-
縮排對python很重要
使用python實現隨機森林
第一步:匯入重要的庫,比如numpy、csv for I/O、sklearn
第二步:訓練測試準備,讀取資料並儲存到陣列
(注意,根據你的儲存路徑修改程式裡的path.)
第三步:刪除與"PatientID"相關的第一列,因為在我們的演算法中不需要它
第四步:手動調整資料,將性別資訊用整數值(0/1)來表示
第五步:調整資料
因為治癒的病人都與年齡有直接的關係,所在在年齡還有一缺失實的資料,所以通過了解病人情況,比如“他/她年齡多大?”或者“她/他採用哪種稱呼?”又或者是“他們曾經在哪種等級的醫院治療過?”。因此,首先提取他們的稱呼(比如Miss/Mrs),再以此為根據,獲取其它缺失資訊。
第六步:刪除無用的列
第七步:使用Grid Search對演算法進行優化
max_depth:該引數決定了隨機森林中每個決策樹的最大深度,它從陣列中獲取不同的值,通過對最佳數值的考慮,我新增了兩個值[3.4]
n_estimators : 該引數決定了應該建立多少決策樹(為了更好的預測)
max_features : 在之前舉例的訓練集當中有四個特徵值(1.Hospital Class, 2.name, 3.Sex, 4.Age),當我們想分隔節點時,需要選擇對結果準確率有影響的一個或多個特徵值。當該引數的值為auto時,意味著所有特徵值都被選擇。
min_samples_split : 該參數列示在建立新節點時有多少分支。
min_samples_leaf : 葉節點是沒有孩子的最終節點,在每個決策樹的最底部。
第八步:隨機森林分類
第九步:分數計算
第十步:將結果寫入result.csv
總結
現在隨機森林在資料科學家中非常受歡迎,它有良好的精確度及優化措施。它包括充足的用於資料導航的多種決策樹。隨機森林已經解決了決策樹的過擬合問題。過擬合是因為在對資料集進行訓練時為了儘可能完全的適應訓練集,而導致的不能應用於其他訓練資料的情況。隨機森林使用 bagging 或 bootstrap aggregating 來將訓練集分為不同的獨立決策樹,單獨計算這些決策樹的結果(不會互相影響),然後求平均值作為最終結果。最後,其對訓練集中不同子集的決策樹數量進行元估計的能力,可以提高預測的準確度以及更好的控制過擬合。
相關文章
- 隨機森林演算法原理與Python實現隨機森林演算法Python
- R:microtable包隨機森林隨機森林
- 隨機森林演算法隨機森林演算法
- 隨機森林的祕密隨機森林
- 隨機森林、EM、HMM、LDA隨機森林HMMLDA
- 隨機森林和機器學習隨機森林機器學習
- 決策樹和隨機森林隨機森林
- 隨機森林演算法梳理隨機森林演算法
- 【python3】基於隨機森林的氣溫預測Python隨機森林
- 6. 整合學習&隨機森林隨機森林
- 隨機森林R語言預測工具隨機森林R語言
- 隨機森林演算法深入淺出隨機森林演算法
- 一句話總結隨機森林隨機森林
- Bagging(Bootstrap aggregating)、隨機森林(random forests)、AdaBoostboot隨機森林randomREST
- 隨機森林RF模型超引數的最佳化:Python實現隨機森林模型Python
- 【機器學習】--決策樹和隨機森林機器學習隨機森林
- 聊聊基於Alink庫的隨機森林模型隨機森林模型
- 隨機森林n_estimators 學習曲線隨機森林
- 【機器學習】整合學習——Bagging與隨機森林機器學習隨機森林
- Python實現隨機森林RF並對比自變數的重要性Python隨機森林變數
- 隨機森林VS神經網路:哪個更好?隨機森林神經網路
- 特徵重要性評估的隨機森林演算法與Python實現(三)特徵隨機森林演算法Python
- Bagging與隨機森林(RF)演算法原理總結隨機森林演算法
- 【小白學AI】隨機森林 全解 (從bagging到variance)AI隨機森林
- python生成隨機數、隨機字串Python隨機字串
- 基於隨機森林演算法進行硬碟故障預測隨機森林演算法硬碟
- RandomForest 隨機森林演算法與模型引數的調優randomREST隨機森林演算法模型
- 一文讀懂隨機森林的解釋和實現隨機森林
- 01整合學習-概述、Bagging-隨機森林、袋外錯誤率隨機森林
- ENVI新機器學習:隨機森林遙感分類工具操作手冊機器學習隨機森林
- Python如何隨機生成1到100的隨機數?Python隨機
- python中如何隨機分配Python隨機
- 機器學習演算法系列(十八)-隨機森林演算法(Random Forest Algorithm)機器學習演算法隨機森林randomRESTGo
- MATLAB實現隨機森林(RF)迴歸與自變數影響程度分析Matlab隨機森林變數
- 機器學習(五):通俗易懂決策樹與隨機森林及程式碼實踐機器學習隨機森林
- Python中如何生成隨機數?Python隨機
- 怎麼用Python生成隨機數Python隨機
- Python生成隨機數random模組Python隨機random
- Python 實現隨機打亂字串Python隨機字串