基於資訊增益的ID3決策樹介紹。

繁城落葉發表於2018-03-17

這篇文章介紹一下一種常見的機器學習演算法:決策樹。這篇文章的主要是根據《機器學習》中的知識點彙總的,其中使用了《機器學習實戰》的程式碼。關於決策樹中基本資訊以及公式更加推薦看一看《機器學習》這本書,書中不僅僅介紹了ID3決策樹,而且還包含了C4.5以及CART決策樹的介紹。所以本篇文章將使用西瓜書(也就是《機器學習》,以後都用西瓜書代替)中的資料集來進行測試。


決策樹的介紹。

顧名思義,決策樹這個名字可以分為兩部分:決策和樹。樹的意思就是這個演算法模型是以樹狀的形態進行表示的。而樹的生成是和“決策”這一過程有關的。

那麼決策是什麼呢?

我們以二分類任務為例,以西瓜書資料集2.0作為測試資料,該資料最終會有兩種不同的分類:好瓜和壞瓜。我們如果想要對一個西瓜進行分類,按照日常的思維就是買瓜的時候就會看看這個西瓜的外形是否正常,敲擊西瓜聽聲音等等手段來判斷這個瓜好不好,其實我們在判斷的過程中就是一個“決策”的過程。

假如以資料集中的特徵為例,來判斷某個西瓜是不是好瓜我們該怎麼做呢?

我們先看“它是什麼顏色的?”,如果是“青綠色”,則我們再看“它的根蒂是什麼形態的?”,如果是“蜷縮”,我們再判斷“它敲起來是什麼聲音?”,最後,我們得出最終決策:這是個好瓜。

在這個過程中,我們在觀察西瓜顏色、根蒂、敲擊聲的時候就已經在做“決策”了,但是這個決策只會在判斷西瓜的過程中起到一部分的作用,所以這個時候的決策稱為“子決策”,而我們通過這多個“子決策”共同決定出一個最終決策:這是個好瓜。

將上述過程圖形話就如下所示:

這裡寫圖片描述

可以從圖中能夠大概看出是一個樹狀的圖形,其中沒有繪出的節點就是一些其他的情況,比如色澤等於淺白、烏黑等。

顯然,決策過程的最終結論對應了我們所希望的判定結果,例如“是”或者“不是”好瓜;決策過程中提出的每個判定問題都是對某個屬性的“測試”,例如“色澤=?”“根蒂=?”;每個測試的結果或是匯出最終結論,或是匯出進一步的判定問題,其考慮範圍都是在上次決策結果的限定範圍之內,例如若在“色澤=青綠”之後再判斷“根蒂=?”,則僅再考慮青色瓜的根蒂,而不再考慮其他顏色的西瓜。

所以一個決策樹可以分為以下幾點進行表示:

  • 一般的,一顆決策樹包含一個根節點、若干個內部節點和若干個葉節點;
  • 葉節點對應決策結果(比如說好瓜或者壞瓜);其他每個節點則對應於一個屬性測試(也就是根據某個特徵做出的判斷,比如“根蒂=?”就是在資料集上對根蒂進行判斷測試);
  • 每個節點包含的樣本集合根據屬性測試的結果被劃分到子節點中(也就是說如果某個特徵相同的特徵值劃分到同一個子節點中,比如“根蒂=蜷縮”,我們就把根蒂這個特徵中特徵值等於蜷縮的全部劃分到一起(當然,需要滿足上面一個特徵的測試,也就是當前的色澤=青綠))
  • 根節點包含樣本全集,根節點的時候還沒有進行劃分,所以包含樣本全集。

劃分選擇。

我們從上面就能夠看出,決策樹的整個流程主要就是依賴根據特徵所做出的“決策”,從而將樣本及劃分到下一個節點中去。

那麼毫無疑問,決策樹的關鍵點就是如何選擇最優劃分屬性,也就是說西瓜中共有:色澤、根蒂、敲聲、紋理、臍部、觸感這麼多的特徵屬性,我們優先根據哪一個特徵去進行劃分呢?

一般而言,隨著劃分過程的不斷進行,我們希望決策樹的分支節點所包含的樣本儘可能屬於同一類別,即節點的“純度”越來越高。

假設,按照色澤來劃分的話,劃分完成之後整個西瓜樣本集正好被分為兩類了,一類全部都是好瓜,另一類全部都是壞瓜,那麼在兩個分支的純度都是百分之百了。

這裡寫圖片描述

但是,如果我們按照根蒂來劃分的話,劃分完成之後,兩個分支裡面好瓜和壞瓜都是各佔50%,那麼這兩個分支的純度就是百分之五十,那麼我們就需要繼續選取特徵繼續劃分。

這裡寫圖片描述

很顯然,上述中選取“色澤”這個特徵來劃分更好一點,因為這樣劃分完的純度最高(純度的計算並不是這樣的,這裡只是為了能夠更好的理解“純度”這個概念才這樣計算的)。

那麼究竟如何在眾多特徵中,選取一個特徵來進行劃分使得各個分支的純度最大呢?

注:
根據不同的劃分方法,決策樹就被分為好幾種型別,如果使用”資訊增益“的方法進行劃分,這樣的決策樹稱為ID3決策樹,如果使用”增益率“來劃分,這樣的決策樹稱為C4.5決策樹,如果使用“基尼指數”來劃分,這樣的決策樹稱為CART決策樹,下面介紹一下“資訊增益”的劃分方法。


資訊熵。

那麼問題就來到了“純度”的計算,通過什麼樣的演算法得到的各個分支純度最大是現在的問題所在。

這裡就引入了“資訊熵”這個概念,資訊熵是度量樣本集合純度最常用的一種指標。(這裡的資訊熵是克勞德·艾爾伍德·夏農提出的,在《數學之美》中有過這段內容:記得有個國外的學者說過,人們通常把夏農與愛因斯坦,牛頓相提並論,這是不公平的—-對夏農是不公平的。夏農為現代資訊革命打下了理論基礎)

下面就進入到了如何計算“資訊熵”的階段,首先資訊熵的定義為如下:

假定當前樣本集合D中第k類樣本所佔的比例為pk

pk
k
k
=1,2,…,|y
y
|(注意這裡的k為下標)),則D的資訊熵定義為:

這裡寫圖片描述

注:在Word中按下[Alt]+[=]即可編輯公式。

而且Ent(D)

Ent(D)
的值越小,則D的純度越高。

我們來根據西瓜資料集2.0(資料集可見:西瓜資料集)計算一下資訊熵:

在該資料集中,一共包含17個訓練樣例,因為資料集中的分類結果只有好瓜和壞瓜兩種。所以與上述的資訊熵描述對應的就是:這17個訓練樣例就是樣本集合D,集合中共有好瓜和壞瓜,那麼集合一共只有兩類,所以|y

y
|=2,自然k的取值為1和2。

所以在決策樹開始之前,根節點是包含所有的樣本集也就是17個樣本,其中好瓜的比例為:p1=817

p1= \frac{8}{17}
,那麼壞瓜的比例為:p2=917
p2=\frac{9}{17}
,那麼套入資訊熵公式中:

這裡寫圖片描述

這樣就能夠算出根節點的資訊熵了,顯然這個資訊熵很大,所以這個時候根節點的純度並不高(再次提醒,Ent(D)

Ent(D)
越小,D 的純度越高。)

同時,計算資訊熵時約定:若p

p
=0,則plog2p=0
p\log_2 p=0

並且Ent(D)

Ent(D)
的最小值為0,最大值為log2|y|
\log_2|y|

這個也很好證明:

最小值證明:
當樣本中只有一種分類,那麼p1=1

p1=1
,帶入公式中log21=0
\log_2 1 = 0
,所以計算得到的Ent(D)=0
Ent(D) = 0
,此時純度最高,即樣本集中只有一個分類。

最大值證明:
當集合中D

D
共有y
y
個分類,並且樣本的分類所佔的比重都一樣,那麼p1=p2=...=py=1y
p1=p2=...=py=\frac{1}{y}
,那麼可推出Ent(D)=log21y=log2y1=log2y
Ent(D) = -log_2 \frac{1}{y} = -\log_2 y^-1 = \log_2 y
。這裡的y
y
顯然為正,所以多一個絕對值符號也無妨。而此時顯然純度最低,畢竟每個分類所佔的比重都一樣,比較混雜。

這樣我們就能夠通過計算資訊熵的方法,將當前節點樣本中的“純度”計算出來。既然資訊熵越小純度越高,那麼我們的目標就是通過屬性的劃分,讓子類中的資訊熵變得越來越小。


資訊增益。

如何選取特徵進行劃分,從而讓子類中的資訊熵變得越來越小呢?這裡就引入了“資訊增益”這個概念。

首先看一下“資訊增益”的概念和計算過程:

假定離散屬性a

a
V
V
個可能取的值{a1,a2,...,aV
a^1,a^2,...,a^V
},若使用a
a
來對樣本集D
D
進行劃分,則會產生V
V
個分支節點,其中第v
v
個分支節點包含了D
D
中所有在屬性a
a
上取值為av
a^v
的樣本,記為Dv
D^v
。我們可以根據上述的資訊熵計算公式,計算出Dv
D^v
的資訊熵,再考慮到不同的分支節點所包含的樣本數不同,給分支賦予權重|Dv||D|
\frac{|D^v|}{|D|}
,即樣本數越多分支節點的影響值越大,於是可計算出屬性a
a
對樣本集D
D
進行劃分所獲得的“資訊增益”。

資訊增益計算公式: Gain(D,a)=Ent(D)Vv=1|Dv||D|Ent(Dv)

Gain(D,a) = Ent(D) - \sum_{v=1}^{V} \frac{|D^v|}{|D|}Ent(D^v)

般而言,資訊增益越大,則意味著使用屬性a

a
來進行劃分所獲得的“純度提升”越大。這是為什麼呢?

道理其實也很簡單:從上述的資訊增益計算公式中能夠看出,Ent(D)

Ent(D)
的值在當前節點中是一個固定值,比如我們剛才計算出來的0.998。那麼Gain(D,a)
Gain(D,a)
的值就跟後面的Vv=1|Dv||D|Ent(Dv)
\sum_{v=1}^{V} \frac{|D^v|}{|D|}Ent(D^v)
有關,這個值越小,資訊增益最後計算得到的值就越大。而這個值越小,就代表著其中的Ent(Dv)
Ent(D^v)
越小就說明分支中的資訊熵越小(這裡的權重僅代表著分支節點的影響,所以我們可以先假設各個分支影響值一樣,那麼就只跟Ent(Dv)
Ent(D^v)
有關了),資訊熵越小也就代表著“純度”越高,那麼這顯然就是我們想要的結果。

所以我們的最終目標就已經明確了,計算各個屬性的資訊增益,找出資訊增益最大的那個屬性作為我們的劃分點,這樣決策樹的分支節點的純度就會越來越高。


計算資訊增益 。

如果將上述的“資訊增益”應用到西瓜資料集中,我們選取“色澤”這個屬性講解,那麼對應的內容應該是這樣的:

全部的西瓜資料集D

D
一共有17個樣本,其中有色澤這個屬性(對應上述的a
a
),在色澤中一共有三種(對應上述的V
V
)可能取的值 {青綠,淺白,烏黑},如果我們使用色澤這一屬性對全部的樣本集D
D
進行劃分的話,那麼一共會產生三個分支(這三個分支在上述中對應的就是v
v
),分別是{DDD
D^{青綠},D^{淺白},D^{烏黑}
}。

其中D

D^{青綠}
共有6個樣本,這6個樣本的色澤全部為青綠,所佔總樣本的比例為:617
\frac{6}{17}

其中D
D^{淺白}
共有5個樣本,這5個樣本的色澤全部為淺白,所佔總樣本的比例為:517
\frac{5}{17}

其中D
D^{烏黑}
共有6個樣本,這6個樣本的色澤全部為烏黑,所佔總樣本的比例為:617
\frac{6}{17}

(所佔的比例對應的就是上述中的權重|Dv||D|
\frac{|D^v|}{|D|}

按照“資訊增益”的公式,我們需要知道Ent(D)

Ent(D)
的值,這個值在上述已經計算過:

即: Ent(D)=0.998

Ent(D) = 0.998

其次,我們也已經計算出了各個分支的權重|Dv||D|

\frac{|D^v|}{|D|}

即:D=617

D^{青綠} = \frac{6}{17}
D=517
D^{淺白} =\frac{5}{17}
D=617
D^{烏黑} = \frac{6}{17}

那麼我們就只需要計算各個分支的Ent(Dv)

Ent(D^v)

首先來計算Ent(D)

Ent(D^{青綠})
,在分支樣本集D
D^{青綠}
共有6條資料,其資料如下:

編號 色澤 根蒂 敲聲 紋理 臍部 觸感 好瓜
1 青綠 蜷縮 濁響 清晰 凹陷 硬滑
4 青綠 蜷縮 沉悶 清晰 凹陷 硬滑
6 青綠 稍蜷 濁響 清晰 稍凹 軟粘
10 青綠 硬挺 清脆 清晰 平坦 軟粘
13 青綠 稍蜷 濁響 稍糊 凹陷 硬滑
17 青綠 蜷縮 沉悶 稍糊 稍凹 硬滑

按照資訊熵的公式:Ent(D)=|y|k=1pklog2pk

Ent(D) = - \sum_{k=1}^{|y|}p_klog_2p_k

從資料表中可知共有兩種分類,其中好瓜的比例為36

\frac{3}{6}
,壞瓜的比例也為36
\frac{3}{6}
,可以使用p1
p_1
來標記好瓜的比例,使用p2
p_2
來標記壞瓜的比例,所以p1=p2=36
p_1 = p_2 = \frac{3}{6}
,帶入公式中得到:Ent(D)=(36log236+36log236)=1.000
Ent(D^{青綠}) = - (\frac{3}{6}log_2\frac{3}{6} + \frac{3}{6}log_2\frac{3}{6}) = 1.000
,其實這個就是當前Ent(D)
Ent(D)
的最大值了,說明此時純度最低,各個分類所佔比重一樣,無法做出更好的判斷。

繼續計算Ent(D)

Ent(D^{淺白})
,在分支樣本集D
D^{淺白}
共有5條資料,其資料如下:

編號 色澤 根蒂 敲聲 紋理 臍部 觸感 好瓜
5 淺白 蜷縮 濁響 清晰 凹陷 硬滑
11 淺白 硬挺 清脆 模糊 平坦 硬滑
12 淺白 蜷縮 濁響 模糊 平坦 軟粘
14 淺白 稍蜷 沉悶 稍糊 凹陷 硬滑
16 淺白 蜷縮 濁響 模糊 平坦 硬滑

從資料表中得到p1=15

p_1 = \frac{1}{5}
p2=45
p_2 = \frac{4}{5}
,帶入公式得:Ent(D)=(15log215+45log245)=0.722
Ent(D^{淺白}) = - (\frac{1}{5}log_2\frac{1}{5} + \frac{4}{5}log_2\frac{4}{5}) = 0.722
,可以看出這個值就小一點,對應的“純度”就高,從表中也能夠看出”純度“高,因為此時大多出都為壞瓜,也算比較”純“了。

最後計算Ent(D)

Ent(D^{烏黑})
,在分支樣本集D
D^{烏黑}
共有6條資料,其資料如下:

編號 色澤 根蒂 敲聲 紋理 臍部 觸感 好瓜
2 烏黑 蜷縮 沉悶 清晰 凹陷 硬滑
3 烏黑 蜷縮 濁響 清晰 凹陷 硬滑
7 烏黑 稍蜷 濁響 稍糊 稍凹 軟粘
8 烏黑 稍蜷 濁響 清晰 稍凹 硬滑
9 烏黑 稍蜷 沉悶 稍糊 稍凹 硬滑
15 烏黑 稍蜷 濁響 清晰 稍凹 軟粘

從資料表中得p1=46

p_1 = \frac{4}{6}
p2=26
p_2 = \frac{2}{6}
,帶入公式得:Ent(D)=(46log246+26log226)=0.918
Ent(D^{青綠}) = - (\frac{4}{6}log_2\frac{4}{6} + \frac{2}{6}log_2\frac{2}{6}) = 0.918
,這個”純度“也是比較低的,能夠從表中看出各個類別所佔比例差得不太多。

那麼我們得到了所有想要的數值,將它們全部帶入到”資訊增益“的公式中:

Gain(D,)=Ent(D)3v=1|Dv||D|Ent(Dv)=0.998(DD×Ent(D)+DD×Ent(D)+DD×Ent(D))=0.998(617×1.000+517×0.722+617×0.918)=0.109

Gain(D,色澤) = Ent(D) - \sum_{v=1}^{3} \frac{|D^v|}{|D|}Ent(D^v) = 0.998 - (\frac{D^{青綠}}{D} \times Ent(D^{青綠}) + \frac{D^{淺白}}{D} \times Ent(D^{淺白}) + \frac{D^{烏黑}}{D} \times Ent(D^{烏黑})) = 0.998 - (\frac{6}{17} \times 1.000 + \frac{5}{17} \times 0.722 + \frac{6}{17} \times 0.918) = 0.109

這樣我們就計算出了”色澤“的資訊增益,我們可以使用同樣的方法計算出其他屬性的資訊增益值:

Gain(D,)=0.143

Gain(D,根蒂) = 0.143
Gain(D,)=0.141
Gain(D,敲聲) = 0.141
Gain(D,)=0.381
Gain(D,紋理) = 0.381
Gain(D,)=0.289
Gain(D,臍部) = 0.289
Gain(D,)=0.006
Gain(D,觸感) = 0.006

顯然,屬性”紋理“的資訊增益量最大,說明如何按照”紋理“這個屬性進行劃分的話,分支節點的純度比較高,於是它被選為劃分屬性。如果按照”紋理“這一屬性對根節點進行劃分的話,各分支節點包含的樣本子集如下圖所示,其中數字代表樣本編號:

這裡寫圖片描述

這樣,我們就完成了第一次劃分,按照紋理劃分之後我們還需要繼續劃分,以圖中的第一個子節點,即 {”紋理“ = ”清晰“}為例,該節點包含的樣例D1

D^1
一共有9個樣例,此時可用的屬性集合為{色澤,根蒂,敲聲,臍部,觸感},因為”紋理“的屬性已經使用過了,所以不能夠再次使用了,然後我們即可根據上述條件基於D1
D^1
再次計算出各個屬性的資訊資訊增益:

Gain(D,)=0.458

Gain(D,根蒂) = 0.458
Gain(D,)=0.331
Gain(D,敲聲) = 0.331
Gain(D,)=0.458
Gain(D,臍部) = 0.458
Gain(D,)=458
Gain(D,觸感) = 458

在這裡根蒂、臍部、觸感三個屬性均取得了最大的資訊增益,可任取其中之一作為劃分屬性,再次劃分得到子分支。

就這樣不斷的劃分,直到遇到終止條件:

  1. 當前節點包含的樣本全屬於同一類別,無需劃分;
  2. 當前屬性集為空,或是所有樣本再所有屬性上取值相同,無法劃分;
  3. 當前節點集合包含的樣本集合為空,不能劃分。

在第2種情形下,我們把當前節點標記為葉節點,並將其類別設定為該節點所含樣本最多的類別;
在第3種情形下,同樣把當前節點標記為葉節點,但將其類別設定為其父節點所含樣本最多的類別。
注意這兩種情形的處理實質不同:情形2實在利用當前節點的後驗分佈,而情形3是把父節點的樣本作為當前節點的先驗分佈。


總結。

決策樹基本知識都進行了介紹,這裡選取資訊增益作為劃分特徵的選擇,當然也如文中所提到的”增益率“、”基尼指數“等,還有其它方法能夠使用。

決策樹使用起來效率不錯,而且實現起來也不太難,演算法的原理也比較理解,可謂是一個經久不衰的模型了。

在本文中並沒有提及程式碼的實現,但是相關的程式碼已經實現,可以在本人的github中進行檢視,傳送門:西瓜書決策樹實現

程式碼繪圖結果:

這裡寫圖片描述

相關文章