machine learning下的Decision Tree實作和Random Forest(觀念)(使用python)

yuwei
Jacky’s blog
Published in
Oct 13, 2018

好的, 相信大家都已經等待我的文章許久了, 今天我主要來介紹關於決策樹(decision tree)和隨機森林(random forest), 在這部分,我主要向各位進行介紹在sklearn下這些演算法如何使用,介紹觀點, 我會直接在演算法下面,貼上code實作給大家看

首先我要先介紹各種演算法的決策過程,在這邊, 觀念上我不特別去區分是classifier或regressor的使用, 因為在這些演算法當中, scikit learn都給予了兩種操作的套件可以讓你依據你要預測的問題種類去做使用

  1. Decision Tree

這就是鼎鼎大名的決策樹,你在你的日常生活中幾乎每天都會使用到它,只是你不曾知道可以用決策樹來形容這個思考的過程而已, 好比說你今天要預測明天氣溫, 你會想明天的時節是夏天還是秋天, 如果是夏天, 代表你的決策過程往左, 你心中也會有一個預想的溫度(台灣夏天約為25~34度),之後你就會想,那去年同一天的溫度是多少呢?經過確認後是(25.7~33.6度), 再來你會藉由觀看歷史20年這一天的平均溫度是多少?假設是(27~32度),這就是決策樹,代表的也就是你的決策過程,不僅僅只能用在分類, 也可以用在回歸分析上

主要是藉由正確的決策分界,來針對每個feature做出不同程度的區別, 以求出最大的資訊增益, 資訊增益就是藉由這次的分類(ex. Lebron得分超過30分的時候能為贏球這件事對來更多的可能性), 解釋為定義為一個特徵能夠為決策樹帶來多少信息,帶來的信息越多,該features代表越重要,

上面為ㄧ典型的Decision tree 圖表 ,大概告知如何針對binary target去做決策樹的分析,而相信你會好奇, 資訊增益是怎麼被計算的呢? 它主要是透過熵(entropy)還有Gini不純度(Gini Impurity)

source
source

關於資訊增益的例子部分,很推薦大家去看James大神的文章,寫的真的很棒

那接下來我就開始實踐decision tree了,首先我會先從處理分類問題開始,

DecisionTreeClassifier

藉由分類問題讓tree 學習分類features,並得出你最後想要的category target,在這次的例子中, 我依舊會使用之前使用過的iris資料集作為示範, 因為你到時候在真實世界的資料中不可能會碰到如此簡單的資料集, 所以我之後會再示範碰到資料量稍大的資料應該如何處理,並用正確的方法進行分析

scikit learn針對machine learning的問題就是處理的如此簡單和暴力,再來,我相信你會想看到,在這過程中,決策樹是怎麼運作的呢?是不是很單純很’黑箱’的分類呢,告訴你,不是的,我也將展現給你看

你在使用畫出剛剛測試的model樹狀圖的步驟為

  1. 建立模型
  2. 將tree export出為.dot檔
  3. 用命令字元將.dot轉為.png圖檔
  4. 展現圖表在Jupyter notebook裡

各位可以看到三個不同顏色並分別有不同class的node(節點),有著不同的target,對這就是分類結果,你也可注意到value的部分,在’setosa’的部分有value(50,0,0)表示依據這樣分類, 50個都會被正確分類到了’setosa’,而你可以看到’versicolor’,value為(0,49,5)表示依據這樣的決策樹,會有5個應該為’virginica’的target會被誤認為’versicolor’, 關於如何調整decision tree的超參數的部分,以後的文章會再向各位依依作說明, 現在,我們來看用圖表的方法來看資料是怎麼被分類的,其實會有點像logisitic regression最後的圖一樣去做劃分

接下來是要介紹DecisionTreeRegressor,同樣的,它也依舊是透過不斷分出節點來判斷最終預測的結果,

DecisionTreeRegressor

先簡單導入features(x),target(y)的資料

x=np.random.rand(200,1)
y=4*(x-0.5)**2+np.random.randn(200,1)/10

接下來仍就是無腦的把x,y丟進scikit learn的DecisionTreeRegressor裡去fit,並跟上面一樣,直接畫出圖來

基本上這邊就跟做classifier的時候差不多,而讓我們隨便找個x預測一下,在做之前,我先假設x=0.7,根據這張圖,最後的value應該為多少,應該為0.0973沒錯(請自己走過一遍決策樹),

model.predict(np.array([0.7]).reshape(-1,1))

真的為0.973沒錯,這樣各位應該理解決策樹了吧!

接下來,我會使用兩種max_depth,分別為3,4,來讓各位看看有什麼不同,是否可以得出overfitting的結論

各位可以很明顯的看到,在max_depth=4的時候, 決策樹fit的情形明顯產生了在圖的右邊產生了overfit的現象, 接下來, 我會介紹Random Forest演算法,其實很簡單,但我就簡單地向各位介紹觀念

2.Random Forest

Random forest和其他之後會介紹的演算法都是來自一個統一名詞,就是ensemble(集群)演算法, 簡單來說, 也就是很多個弱的機器學習器放在一起來建構一個強穩的機器學習器, 有點像是眾人投票,選出一個最好的模型的感覺

當一群人在討論個案時, 每個人都會從自己的觀點來解析這個個案,ex.當一間公司發生虧損的時候,如果是你,你第一時間會去哪邊著手, 是不是你有可能會認為行銷部門出了問題,或公司財務部們對公司的資產理解錯誤產生了問題,就因為這些不同的分析對問題產生了不同的決策樹,這些決策樹加在一起就構成了一個Random Forest(隨機森林), 而在隨機森林中, 如果是你,你會怎麼選擇在眾多不同觀點下的決策樹中做出最佳選擇?我相信你心裡會有一個答案, 對,就近乎是將它們全部平均起來取最平均解

但依照不同的機器學習問題random forest對最佳解的解決方法, 分類方法是指當今天的結果有可能是’贏球’或’輸球’, 隨機森林就會取出最主要會看在分類時,對該分類下哪個target獲得最多的票數, 而處理回歸分類時,就是將其取平均,以確保以最正確的方式來預測

結論

在這裡,我簡單的介紹了decision tree和random forest的使用方法和觀念,而關於我在random forest所提到的集成(ensemble)演算法,其實還有很多,之後我也會依依介紹這些我現在還沒有提到的演算法

同樣的,我歡迎你跟我一起討論你我的問題,我在這條路上依舊是初心者等級,所以歡迎你寄信來一起討論,我的信箱是jacky308082@gmail.com

--

--

yuwei
Jacky’s blog

Curious Data scientist. Strong Lebron James’s fan. #StriveForGreatness #JustAKidFromTaiwan https://www.linkedin.com/in/yu-wei-chung/