Python隨機森林 - CodeProject

中興開發者社群發表於2017-11-15

點選上方“中興開發者社群”,關注我們

每天讀一篇一線開發者原創好文640?wx_fmt=png

譯者:XTH

英文原文:https://www.codeproject.com/Articles/1197167/Random-Forest-Python 

隨機森林介紹

隨機森林是一種在整合學習中很受歡迎的演算法,可用於分類和迴歸。這意味著隨機森林中包括多種決策樹,並將每個決策樹結果的平均值作為隨機森林的最終輸出。決策樹有一些缺點,比如訓練集的過擬合導至很高的差異性,不過這在隨機森林中已經可以通過Bagging(Bootstrap Aggregating)的幫助解決。因為隨機森林實際上是由多種不同的決策樹組成的,所以我們最好先了解一下決策樹演算法,然後再學習隨機森林的相關知識。


決策樹:

決策樹用樹形圖來檢視各元素之間的關係,以儘可能的做出最好的決定。舉個例子,現在我們知道有一個網球運動員,他會根據不同的天氣條件來選擇是否進行比賽。於是現在我們想知道:在第15天的時候他是否會進行比賽呢?

640?wx_fmt=jpeg

尋找“純淨”分支

這裡有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)


由此,我們可以得到決策樹:

640?wx_fmt=jpeg

現在,我們可以清楚的看到圖表和決策樹的對比:

640?wx_fmt=jpeg

所以,為了推測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”

640?wx_fmt=jpeg

隨機森林:

隨機森林是一種整合學習方法,非常適合用於分類、迴歸等監督學習。在隨機森林中,我們將資料集劃分成多個小部分,然後將每部分作為獨立的樹,其結果對自身之外的其他樹沒有影響。隨機森林獲得訓練資料並通過"Bagging = Bootstrap Aggregating"演算法將其分割,該演算法可通過避免過擬合和降低差異性來提高準確率。它一開始將資料集的60%劃分為獨立的決策樹,30%作為重疊資料集。

640?wx_fmt=jpeg

它將訓練集分為不同的平衡決策樹(60%用不同的資料,30%用重複資料),然後再計算每個決策樹的結果,將其進行分解直至合適的情況(足以處理測試資料),在下面你可以看到,從決策樹中我們得到了2個"NO"以及3個"YES",所以根據平均值,最後的答案是"YES"。

640?wx_fmt=jpeg

隨機森林中的誤差計算:有許多方案可以用來對隨機森林進行優化。交叉驗證可評估預測模型的結果對另外的獨立測試資料實用性。如下圖中的訓練集,被分為輸出"Y"與特徵“X”:

640?wx_fmt=jpeg

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進行處理。

640?wx_fmt=jpeg


下載python:

如果你想輕鬆地使用舒適的IDE和專業的編輯器,而且省去複雜的庫安裝環節,你可以選擇Anaconda&Spyder.

640?wx_fmt=jpeg

然後開啟 Anaconda Navigator,選擇"Spyder".

640?wx_fmt=jpeg

開始程式設計前,先了解一些要點:

  1. python是物件導向的

  2. 動態型別

  3. 有豐富的庫資源

  4. 易讀性

  5. python是大小寫敏感的

  6. 縮排對python很重要


使用python實現隨機森林

第一步:匯入重要的庫,比如numpy、csv for I/O、sklearn

640?wx_fmt=png

第二步:訓練測試準備,讀取資料並儲存到陣列

(注意,根據你的儲存路徑修改程式裡的path.)

640?wx_fmt=png第三步:刪除與"PatientID"相關的第一列,因為在我們的演算法中不需要它

640?wx_fmt=png第四步:手動調整資料,將性別資訊用整數值(0/1)來表示

640?wx_fmt=png第五步:調整資料

因為治癒的病人都與年齡有直接的關係,所在在年齡還有一缺失實的資料,所以通過了解病人情況,比如“他/她年齡多大?”或者“她/他採用哪種稱呼?”又或者是“他們曾經在哪種等級的醫院治療過?”。因此,首先提取他們的稱呼(比如Miss/Mrs),再以此為根據,獲取其它缺失資訊。

640?wx_fmt=png

640?wx_fmt=png第六步:刪除無用的列

640?wx_fmt=png

第七步:使用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 : 葉節點是沒有孩子的最終節點,在每個決策樹的最底部。

640?wx_fmt=png第八步:隨機森林分類

640?wx_fmt=png第九步:分數計算

640?wx_fmt=png第十步:將結果寫入result.csv

640?wx_fmt=png

總結

現在隨機森林在資料科學家中非常受歡迎,它有良好的精確度及優化措施。它包括充足的用於資料導航的多種決策樹。隨機森林已經解決了決策樹的過擬合問題。過擬合是因為在對資料集進行訓練時為了儘可能完全的適應訓練集,而導致的不能應用於其他訓練資料的情況。隨機森林使用 bagging 或 bootstrap aggregating 來將訓練集分為不同的獨立決策樹,單獨計算這些決策樹的結果(不會互相影響),然後求平均值作為最終結果。最後,其對訓練集中不同子集的決策樹數量進行元估計的能力,可以提高預測的準確度以及更好的控制過擬合。

640?wx_fmt=jpeg

相關文章