监督学习 | ID3 决策树原理及Python实现
文章目錄
- 1. 信息熵 Information Entropy
- 1.1 信息熵公式推導
- 2. 信息增益 Information Gain
- 2.1 信息增益最大化
- 2.1.1 利用離散特征進行分類
- 2.1.2 利用連續特征進行分類
- 2.1.2.1 二分法
- 2.1.2.2 信息熵、信息增益及二分法的Python實現
- 參考資料
相關文章:
機器學習 | 目錄
監督學習 | ID3 決策樹原理及Python實現
監督學習 | ID3 & C4.5 決策樹原理
監督學習 | CART 分類回歸樹原理
監督學習 | 決策樹之Sklearn實現
監督學習 | 決策樹之網絡搜索
1. 信息熵 Information Entropy
信息是個很抽象的概念。人們常常說信息很多,或者信息較少,但卻很難說清楚信息到底有多少。比如一本五十萬字的中文書到底有多少信息量。直到1948年,香農提出了“信息熵”的概念,才解決了對信息的量化度量問題。
信息熵這個詞是香農從熱力學中借用過來的。熱力學中的熱熵是表示分子狀態混亂程度的物理量。香農用信息熵的概念來描述不確定性。
- 隨機變量xxx的信息熵計算公式:H(x)=?∑i=1nP(xi)log2(Pi)H(x)= -\sum_{i=1}^nP(x_i)log_2(P_i)H(x)=?∑i=1n?P(xi?)log2?(Pi?)
- 信息熵越大,則表示不確定性越高。
- 在文本中,當不同的詞匯越多時,其信息熵越大,直觀上來說就是所包含的信息越多
熵:在物理的熱力學中,用熵來表示分子狀態混亂程度。當一個物體溫度越高時,其內部粒子活動越劇烈,也越混亂。因此混亂程度越高,熵越大。
1.1 信息熵公式推導
P(xi)=P(x1)×P(x2)×...×P(xn)(1)P(x_i)=P(x_1)\times P(x_2) \times...\times P(x_n)\tag{1}P(xi?)=P(x1?)×P(x2?)×...×P(xn?)(1)
I(xi)=log2(1P(xi))=?log2(P(xi))(2)I(x_i)=log_2(\frac{1}{P(x_i)})=-log_2(P(x_i))\tag{2}I(xi?)=log2?(P(xi?)1?)=?log2?(P(xi?))(2)
H(x)=E[I(xi)]=?E[log2(P(xi))]=?∑i=1nP(xi)log2(Pi)(3)H(x)=E[I(x_i)]=-E[log_2(P(x_i))]= -\sum_{i=1}^nP(x_i)log_2(P_i)\tag{3}H(x)=E[I(xi?)]=?E[log2?(P(xi?))]=?i=1∑n?P(xi?)log2?(Pi?)(3)
對于樣本集合DDD來說,隨機變量xxx是樣本的類別,即假設樣本有kkk個類別,樣本總數為DDD,則類別iii的概率是ciD\frac{c_i}{D}Dci??。
因此樣本集合DDD的經驗熵為:
H(D)=?∑i=1k∣ci∣∣D∣log2(∣ci∣∣D∣)(4)H(D)=-\sum_{i=1}^k \frac{|c_i|}{|D|}log_2(\frac{|c_i|}{|D|}) \tag{4}H(D)=?i=1∑k?∣D∣∣ci?∣?log2?(∣D∣∣ci?∣?)(4)
例1:假設有四個球,從中隨機放回地抽出四個球,下面計算各個事件的信息熵:
1.紅紅紅紅,則事件xxx的信息熵:
H(x)=?∑i=14P(xi)log2(Pi)=[1×log2(1)+1×log2(1)+1×log2(1)+1×log2(1)]=0H(x)=-\sum_{i=1}^4P(x_i)log_2(P_i) =[1 \times log_2(1)+1 \times log_2(1)+1 \times log_2(1)+1 \times log_2(1)]=0H(x)=?∑i=14?P(xi?)log2?(Pi?)=[1×log2?(1)+1×log2?(1)+1×log2?(1)+1×log2?(1)]=0
2.紅紅紅藍,則事件yyy的信息熵:
H(y)=?∑i=14P(yi)log2(Pi)=[0.75×log2(0.75)+0.75×log2(0.75)+0.75×log2(0.75)+0.25×log2(0.25)]=1.4338H(y)=-\sum_{i=1}^4P(y_i)log_2(P_i) =[0.75 \times log_2(0.75)+0.75 \times log_2(0.75)+0.75 \times log_2(0.75)+0.25 \times log_2(0.25)]=1.4338H(y)=?∑i=14?P(yi?)log2?(Pi?)=[0.75×log2?(0.75)+0.75×log2?(0.75)+0.75×log2?(0.75)+0.25×log2?(0.25)]=1.4338
3.紅紅藍藍,則事件zzz的信息熵:
H(z)=?∑i=14P(zi)log2(Pi)=[0.5×log2(0.5)+0.5×log2(0.5)+0.5×log2(0.5)+0.5×log2(0.5)]=2H(z)=-\sum_{i=1}^4P(z_i)log_2(P_i) =[0.5 \times log_2(0.5)+0.5 \times log_2(0.5)+0.5 \times log_2(0.5)+0.5 \times log_2(0.5)]=2H(z)=?∑i=14?P(zi?)log2?(Pi?)=[0.5×log2?(0.5)+0.5×log2?(0.5)+0.5×log2?(0.5)+0.5×log2?(0.5)]=2
由上面三個例子可以看出,當混亂程度越高時,信息熵越大。
關于各類熵的定義及推導,可參考這篇文章。
2. 信息增益 Information Gain
信息增益:
對于待劃分的數據集DDD,其信息熵大小是固定的,但是劃分后子代熵之和是不定的。子代熵越小說明使用此特征劃分得到的子集不確定性越小(純度越高),因此父代與子代的信息熵之差(信息增益)越大,說明使用當前特征劃分數據集DDD時,其純度上升的更快[1]。
與決策樹關系:
我們在構建最優的決策樹時總希望能夠快速到達村度更高的集合,這一點可以參考優化算法中的梯度下降(每一步沿著負梯度方法最小化損失函數使函數值快速減小)同理,在決策樹構建的過程中我們總是希望集合往最快到達純度更高的子集合方向發展,因此我們總是選擇使得信息增益最大的特征來劃分當前數據集DDD。
使用特征AAA劃分數據集DDD,計算劃分前后各個數據集的信息熵,并計算信息增益:
g(D,A)=H(D)?H(D∣A)(5)g(D,A)=H(D)-H(D|A) \tag{5}g(D,A)=H(D)?H(D∣A)(5)
其中,假設特征AAA將數據集DDD劃分為nnn個子代,則H(D∣A)H(D|A)H(D∣A)為劃分后子代的平均信息熵:
H(D∣A)=∑i=1nP(Ai)H(Ai)(6)H(D|A)= \sum_{i=1}^nP(A_i)H(A_i) \tag{6}H(D∣A)=i=1∑n?P(Ai?)H(Ai?)(6)
例2:假設我們在調查性別與活躍度哪一個對用戶流失影響越大。[2]
樣本如下:
| M | H | 0 |
| F | M | 0 |
| M | L | 1 |
| F | H | 0 |
| M | H | 0 |
| M | M | 0 |
| M | M | 1 |
| F | M | 0 |
| F | L | 1 |
| F | M | 0 |
| F | H | 0 |
| M | L | 1 |
| F | L | 0 |
| M | H | 0 |
| M | H | 0 |
按性別分類:
| Whole | 5 | 10 | 15 |
| Male | 3 | 5 | 8 |
| Female | 2 | 5 | 7 |
整體熵:
E(S)=?[515log2(515)+1015log2(1015)]=0.9182E(S)=-[\frac{5}{15}log_2(\frac{5}{15})+\frac{10}{15}log_2(\frac{10}{15})]=0.9182E(S)=?[155?log2?(155?)+1510?log2?(1510?)]=0.9182
性別熵:
E(g1)=?[38log2(38)+58log2(58)]=0.0.9543E(g_1)=-[\frac{3}{8}log_2(\frac{3}{8})+\frac{5}{8}log_2(\frac{5}{8})]=0.0.9543E(g1?)=?[83?log2?(83?)+85?log2?(85?)]=0.0.9543
E(g2)=?[27log2(27)+27log2(27)]=0.8631E(g_2)=-[\frac{2}{7}log_2(\frac{2}{7})+\frac{2}{7}log_2(\frac{2}{7})]=0.8631E(g2?)=?[72?log2?(72?)+72?log2?(72?)]=0.8631
性別信息增益:
g(S∣g)=E(S)?815E(g1)?715E(g2)=0.0064g(S|g)=E(S)-\frac{8}{15}E(g_1)-\frac{7}{15}E(g_2)=0.0064g(S∣g)=E(S)?158?E(g1?)?157?E(g2?)=0.0064
按活躍度分類
| Whole | 5 | 10 | 15 |
| Hight | 0 | 6 | 6 |
| Mid | 1 | 4 | 5 |
| Low | 4 | 0 | 4 |
活躍度熵:
E(a1)=0E(a_1)=0E(a1?)=0
E(a2)=0.7219E(a_2)=0.7219E(a2?)=0.7219
E(a2)=0E(a_2)=0E(a2?)=0
活躍度信息增益:
g(S∣a)=E(S)?615E(a1)?515E(a2)?415E(a3)=0.0064g(S|a)=E(S)-\frac{6}{15}E(a_1)-\frac{5}{15}E(a_2)-\frac{4}{15}E(a_3)=0.0064g(S∣a)=E(S)?156?E(a1?)?155?E(a2?)?154?E(a3?)=0.0064
活躍度信息增益比性別信息增益大,也就是說,活躍度對用戶流失的影響比性別大。
2.1 信息增益最大化
2.1.1 利用離散特征進行分類
例3:仍以上面的例子為例,之前,我們已經計算出了活躍度對于用戶流失的影響較大,當用戶的活躍度為Hight時,用戶流失為0,當用戶活躍度為Low時,用戶全部流失,因此可以得到:
可以看到,Hight和Low組的信息熵為0,純度已達到最高;但是Mid組純度未達到最高,因此以Mid組的數據作為父代,重復例2的過程,由于例2數據只有兩個特征,因此只能嘗試使用性別分類;若例2數據有2個以上特征,則此時可以重復例2過程,計算其余特征的信息增益,并選取信息增益最大的特征作為分類依據。由此也可以看出,離散特征決策樹的最大深度不超過其特征數(連續特征決策樹的特征可多次使用)。
下面嘗試使用性別分組,Mid組的樣本:
| F | M | 0 |
| M | M | 0 |
| M | M | 1 |
| F | M | 0 |
| F | M | 0 |
對Mid組使用性別分類后的結果:
2.1.2 利用連續特征進行分類
2.1.2.1 二分法
因為連續特征屬性的可取值數目不再有限,因此不能像前面處理離散屬性一樣枚舉離散屬性來對節點進行劃分,因此需要對連續屬性離散化。
常用的離散化策略是二分法:
給定訓練集DDD和連續屬性aaa,假定aaa在DDD上出現了nnn個不同的取值,先把這些值從小到達排序,記為{a1,a2,...,an}\{a^1,a^2,...,a^n\}{a1,a2,...,an},基于劃分點ttt可以將DDD分為子集Dt?D_t^-Dt??和Dt+D_t^+Dt+?,其中Dt?D_t^-Dt??是包含那些屬性aaa上取值不大于ttt的樣本,Dt+D_t^+Dt+?則包含哪些在屬性aaa上取值大于ttt的樣本。顯然,對相鄰的屬性取值aia^iai與ai+1a^{i+1}ai+1來說,ttt在區間[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)中取任意值所產生的劃分結果相同。因此,對連續屬性aaa,我們可考慮包含n?1n-1n?1個元素的候選劃分點集合:
Ta={ai+ai+12}(1≤i≤n?1)(7)T_a=\{ \frac{a^i+a^{i+1}}{2} \} \quad (1 \leq i \leq n-1) \tag{7}Ta?={2ai+ai+1?}(1≤i≤n?1)(7)
即把區間[ai,ai+1)[a^i,a^{i+1})[ai,ai+1)的中位點ai+ai+12\frac{a^i+a^{i+1}}{2}2ai+ai+1?作為候選劃分點,然后就可以像前面處理離散屬性值那樣來考慮這些劃分點,并選擇最后的劃分點進行樣本集合的劃分,使用的公式如下:
g(D,a)=max?t∈Tag(D,a,t)=max?t∈Ta{E(D)?∑λ∈(?,+)∣Dtλ∣∣D∣log2(∣Dtλ∣∣D∣)}(8)g(D,a)=\max \limits_{t\in T_a}g(D,a,t) =\max \limits_{t\in T_a} \{E(D)-\sum_{\lambda \in(-,+)} \frac{|D_t^\lambda|}{|D|}log_2(\frac{|D_t^\lambda|}{|D|})\} \tag{8}g(D,a)=t∈Ta?max?g(D,a,t)=t∈Ta?max?{E(D)?λ∈(?,+)∑?∣D∣∣Dtλ?∣?log2?(∣D∣∣Dtλ?∣?)}(8)
其中g(D,a,t)g(D,a,t)g(D,a,t)是樣本集DDD基于劃分點ttt二分后的信息增益。
劃分的時候,選擇使g(D,a,t)g(D,a,t)g(D,a,t)最大的劃分點。[3]
2.1.2.2 信息熵、信息增益及二分法的Python實現
例4:下面以周志華《機器學習》—西瓜數據集3.0 為例,計算特征“密度”的最佳劃分點以及其信息增益,數據如下:
import pandas as pd import numpy as np df = pd.read_csv("Data/Watermelon_Data.txt") df['好瓜'] = df['好瓜'].map({'是':1, '否':0}) df| 1 | 青綠 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.460 | 1 |
| 2 | 烏黑 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 1 |
| 3 | 烏黑 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 1 |
| 4 | 青綠 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 1 |
| 5 | 淺白 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 1 |
| 6 | 青綠 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 0.403 | 0.237 | 1 |
| 7 | 烏黑 | 稍蜷 | 濁響 | 稍糊 | 稍凹 | 軟粘 | 0.481 | 0.149 | 1 |
| 8 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 硬滑 | 0.437 | 0.211 | 1 |
| 9 | 烏黑 | 稍蜷 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 0.666 | 0.091 | 0 |
| 10 | 青綠 | 硬挺 | 清脆 | 清晰 | 平坦 | 軟粘 | 0.243 | 0.267 | 0 |
| 11 | 淺白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 0.245 | 0.057 | 0 |
| 12 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 軟粘 | 0.343 | 0.099 | 0 |
| 13 | 青綠 | 稍蜷 | 濁響 | 稍糊 | 凹陷 | 硬滑 | 0.639 | 0.161 | 0 |
| 14 | 淺白 | 稍蜷 | 沉悶 | 稍糊 | 凹陷 | 硬滑 | 0.657 | 0.198 | 0 |
| 15 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 0.360 | 0.370 | 0 |
| 16 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 硬滑 | 0.593 | 0.042 | 0 |
| 17 | 青綠 | 蜷縮 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 0.719 | 0.103 | 0 |
| 0.244 | 0.941 | 0.057 |
| 0.294 | 0.880 | 0.118 |
| 0.352 | 0.811 | 0.187 |
| 0.382 | 0.735 | 0.263 |
| 0.420 | 0.904 | 0.094 |
| 0.459 | 0.967 | 0.031 |
| 0.518 | 0.994 | 0.004 |
| 0.575 | 0.995 | 0.003 |
| 0.601 | 0.995 | 0.003 |
| 0.621 | 0.994 | 0.004 |
| 0.637 | 0.967 | 0.031 |
| 0.648 | 0.991 | 0.007 |
| 0.661 | 0.997 | 0.001 |
| 0.681 | 0.973 | 0.025 |
| 0.708 | 0.997 | 0.001 |
| 0.746 | 0.931 | 0.067 |
繼續對其他的特征進行以上步驟,可以得到其他特征的信息增益,因此該連續特征的決策樹的第一個分割點為信息增益最大的特征所對應的分割點。
下面是本數據集中各特征的信息增益值:[4]
g(D∣色澤)=0.109g(D∣根蒂)=0.143g(D|色澤)=0.109 \quad g(D|根蒂)=0.143g(D∣色澤)=0.109g(D∣根蒂)=0.143
g(D∣敲聲)=0.141g(D∣紋理)=0.381g(D|敲聲)=0.141 \quad g(D|紋理)=0.381g(D∣敲聲)=0.141g(D∣紋理)=0.381
g(D∣臍部)=0.289g(D∣觸感)=0.006g(D|臍部)=0.289 \quad g(D|觸感)=0.006g(D∣臍部)=0.289g(D∣觸感)=0.006
g(D∣密度)=0.262g(D∣含糖率)=0.349g(D|密度)=0.262 \quad g(D|含糖率)=0.349g(D∣密度)=0.262g(D∣含糖率)=0.349
由此可見,“紋理”的信息增益量值最大,因此”紋理“被選作根節點劃分屬性。只要重復以上過程,就能構造出一顆決策樹:
需要注意的是:與離散屬性不同,若當前節點劃分屬性為連續屬性,該屬性還可以作為其后代節點的劃分屬性。如下圖的一顆決策樹,“含糖率”這個屬性在根節點用了一次,后代節點也用了一次,只是兩次劃分點取值不同。
參考資料
[1] Tomcater321.決策樹–信息增益,信息增益比,Geni指數的理解
[EB/OL].https://blog.csdn.net/Tomcater321/article/details/80699044, 2018-06-14.
[2] It_BeeCoder.機器學習中信息增益的計算方法 [EB/OL].https://blog.csdn.net/it_beecoder/article/details/79554388, 2018-03-14.
[3] 天澤28.決策樹(decision tree)(三)——連續值處理 [EB/OL].https://blog.csdn.net/u012328159/article/details/79396893, 2018-02-28.
[4] 天澤28.決策樹(decision tree)(一)——構造決策樹方法 [EB/OL].https://blog.csdn.net/u012328159/article/details/70184415, 2017-04-18.
總結
以上是生活随笔為你收集整理的监督学习 | ID3 决策树原理及Python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 最小二乘支持向量机的分析与改进及Pyth
- 下一篇: CUDA编程