1. 程式人生 > >【Python】決策樹的python實現

【Python】決策樹的python實現

uia bmp say 不知道 times otto outlook lru bgm

【Python】決策樹的python實現

2016-12-08 數據分析師Nieson

1. 決策樹是什麽?

簡單地理解,就是根據一些 feature 進行分類,每個節點提一個問題,通過判斷,將數據分為幾類,再繼續提問。這些問題是根據已有數據學習出來的,再投入新數據的時候,就可以根據這棵樹上的問題,將數據劃分到合適的葉子上。

技術分享

2. 決策樹有什麽算法?

常用的幾種決策樹算法有ID3、C4.5、CART:

ID3:選擇信息熵增益最大的feature作為node,實現對數據的歸納分類。

C4.5:是ID3的一個改進,比ID3準確率高且快,可以處理連續值和有缺失值的feature。

CART:使用基尼指數的劃分準則,通過在每個步驟最大限度降低不純潔度,CART能夠處理孤立點以及能夠對空缺值進行處理。

3. 數學原理?

ID3: Iterative Dichotomiser 3

技術分享

下面這個數據集,可以同時被上面兩顆樹表示,結果是一樣的,而我們更傾向於選擇簡單的樹。

那麽怎樣做才能使得學習到的樹是最簡單的呢?

技術分享

下面是 ID3( Iterative Dichotomiser 3 )的算法:

技術分享

例如下面數據集,哪個是最好的 Attribute?

技術分享

用熵Entropy來衡量:

E(S) 是數據集S的熵

i 指每個結果,即 No,Yes的概率

技術分享

E越大意味著信息越混亂,我們的目標是要讓E最小。

E在0-1之間,如果P+的概率在0.5, 此時E最大,這時候說明信息對我們沒有明確的意義,對分類沒有幫助。

技術分享

但是我們不僅僅想要變量的E最小,還想要這棵樹是 well organized。

所以用到 Gain:信息增益

技術分享

意思是如果我後面要用這個變量的話,它的E會減少多少。

技術分享

例如下面的數據集:

技術分享

先計算四個feature的熵E,及其分支的熵,然後用Gain的公式計算信息增益。

技術分享

再選擇Gain最大的特征是 outlook。

第一層選擇出來後,各個分支再繼續選擇下一層,計算Gain最大的,例如分支 sunny 的下一層節點是 humidity。

技術分享

C4.5

ID3有個局限是對於有大量數據的feature過於敏感,C4.5是它的一個改進,通過選擇最大的信息增益率 gain ratio 來選擇節點。而且它可以處理連續的和有缺失值的數據。

技術分享

例如 outlook 作為第一層節點後,它有 3 個分支,分別有 5,4,5 條數據,則 SplitInfo(5,4,5) = -5/14log(5,14)-4/14log(4,14)-5/14(5,14) ,其中 log(5,14) 即為 log2(5/14)。

下面是一個有連續值和缺失值的例子:

技術分享

連續值

第一步計算 Gain,除了連續值的 humudity,其他步驟和前文一樣。

要計算 humudity 的 Gain 的話,先把所有值升序排列:

{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}

然後把重復的去掉:

{65, 70, 75, 78, 80, 85, 90, 95, 96}

如下圖所示,按區間計算 Gain,然後選擇最大的 Gain (S, Humidity) = 0.102

技術分享

因為 Gain(S, Outlook) = 0 .246,所以root還是outlook:

技術分享

缺失值

處理有缺失值的數據時候,用下圖的公式:

技術分享

例如 D12 是不知道的。

計算全集和 outlook 的 info,

技術分享

其中幾個分支的熵如下,再計算出 outlook 的 Gain:

技術分享

比較一下 ID3 和 C4.5 的準確率和時間:

accuracy :

技術分享

execution time:

技術分享

4. 編碼實現算法?

接下來以 C4.5 的代碼為例:

1. 定義數據:

技術分享

2. 計算熵:

技術分享

3. 選擇最大的gain ratio對應的feature:

技術分享

4. 劃分數據,為下一層計算準備:

技術分享

5. 多重字典構建樹:

技術分享

6. 可視化決策樹的結果:

技術分享
技術分享

技術分享

微信掃一掃
關註該公眾號

【Python】決策樹的python實現