基於資訊增益的ID3決策樹介紹。
這篇文章介紹一下一種常見的機器學習演算法:決策樹。這篇文章的主要是根據《機器學習》中的知識點彙總的,其中使用了《機器學習實戰》的程式碼。關於決策樹中基本資訊以及公式更加推薦看一看《機器學習》這本書,書中不僅僅介紹了ID3決策樹,而且還包含了C4.5以及CART決策樹的介紹。所以本篇文章將使用西瓜書(也就是《機器學習》,以後都用西瓜書代替)中的資料集來進行測試。
決策樹的介紹。
顧名思義,決策樹這個名字可以分為兩部分:決策和樹。樹的意思就是這個演算法模型是以樹狀的形態進行表示的。而樹的生成是和“決策”這一過程有關的。
那麼決策是什麼呢?
我們以二分類任務為例,以西瓜書資料集2.0作為測試資料,該資料最終會有兩種不同的分類:好瓜和壞瓜。我們如果想要對一個西瓜進行分類,按照日常的思維就是買瓜的時候就會看看這個西瓜的外形是否正常,敲擊西瓜聽聲音等等手段來判斷這個瓜好不好,其實我們在判斷的過程中就是一個“決策”的過程。
假如以資料集中的特徵為例,來判斷某個西瓜是不是好瓜我們該怎麼做呢?
我們先看“它是什麼顏色的?”,如果是“青綠色”,則我們再看“它的根蒂是什麼形態的?”,如果是“蜷縮”,我們再判斷“它敲起來是什麼聲音?”,最後,我們得出最終決策:這是個好瓜。
在這個過程中,我們在觀察西瓜顏色、根蒂、敲擊聲的時候就已經在做“決策”了,但是這個決策只會在判斷西瓜的過程中起到一部分的作用,所以這個時候的決策稱為“子決策”,而我們通過這多個“子決策”共同決定出一個最終決策:這是個好瓜。
將上述過程圖形話就如下所示:
可以從圖中能夠大概看出是一個樹狀的圖形,其中沒有繪出的節點就是一些其他的情況,比如色澤等於淺白、烏黑等。
顯然,決策過程的最終結論對應了我們所希望的判定結果,例如“是”或者“不是”好瓜;決策過程中提出的每個判定問題都是對某個屬性的“測試”,例如“色澤=?”“根蒂=?”;每個測試的結果或是匯出最終結論,或是匯出進一步的判定問題,其考慮範圍都是在上次決策結果的限定範圍之內,例如若在“色澤=青綠”之後再判斷“根蒂=?”,則僅再考慮青色瓜的根蒂,而不再考慮其他顏色的西瓜。
所以一個決策樹可以分為以下幾點進行表示:
- 一般的,一顆決策樹包含一個根節點、若干個內部節點和若干個葉節點;
- 葉節點對應決策結果(比如說好瓜或者壞瓜);其他每個節點則對應於一個屬性測試(也就是根據某個特徵做出的判斷,比如“根蒂=?”就是在資料集上對根蒂進行判斷測試);
- 每個節點包含的樣本集合根據屬性測試的結果被劃分到子節點中(也就是說如果某個特徵相同的特徵值劃分到同一個子節點中,比如“根蒂=蜷縮”,我們就把根蒂這個特徵中特徵值等於蜷縮的全部劃分到一起(當然,需要滿足上面一個特徵的測試,也就是當前的色澤=青綠))
- 根節點包含樣本全集,根節點的時候還沒有進行劃分,所以包含樣本全集。
劃分選擇。
我們從上面就能夠看出,決策樹的整個流程主要就是依賴根據特徵所做出的“決策”,從而將樣本及劃分到下一個節點中去。
那麼毫無疑問,決策樹的關鍵點就是如何選擇最優劃分屬性,也就是說西瓜中共有:色澤、根蒂、敲聲、紋理、臍部、觸感這麼多的特徵屬性,我們優先根據哪一個特徵去進行劃分呢?
一般而言,隨著劃分過程的不斷進行,我們希望決策樹的分支節點所包含的樣本儘可能屬於同一類別,即節點的“純度”越來越高。
假設,按照色澤來劃分的話,劃分完成之後整個西瓜樣本集正好被分為兩類了,一類全部都是好瓜,另一類全部都是壞瓜,那麼在兩個分支的純度都是百分之百了。
但是,如果我們按照根蒂來劃分的話,劃分完成之後,兩個分支裡面好瓜和壞瓜都是各佔50%,那麼這兩個分支的純度就是百分之五十,那麼我們就需要繼續選取特徵繼續劃分。
很顯然,上述中選取“色澤”這個特徵來劃分更好一點,因為這樣劃分完的純度最高(純度的計算並不是這樣的,這裡只是為了能夠更好的理解“純度”這個概念才這樣計算的)。
那麼究竟如何在眾多特徵中,選取一個特徵來進行劃分使得各個分支的純度最大呢?
注:
根據不同的劃分方法,決策樹就被分為好幾種型別,如果使用”資訊增益“的方法進行劃分,這樣的決策樹稱為ID3決策樹,如果使用”增益率“來劃分,這樣的決策樹稱為C4.5決策樹,如果使用“基尼指數”來劃分,這樣的決策樹稱為CART決策樹,下面介紹一下“資訊增益”的劃分方法。
資訊熵。
那麼問題就來到了“純度”的計算,通過什麼樣的演算法得到的各個分支純度最大是現在的問題所在。
這裡就引入了“資訊熵”這個概念,資訊熵是度量樣本集合純度最常用的一種指標。(這裡的資訊熵是克勞德·艾爾伍德·夏農提出的,在《數學之美》中有過這段內容:記得有個國外的學者說過,人們通常把夏農與愛因斯坦,牛頓相提並論,這是不公平的—-對夏農是不公平的。夏農為現代資訊革命打下了理論基礎)
下面就進入到了如何計算“資訊熵”的階段,首先資訊熵的定義為如下:
假定當前樣本集合D中第k類樣本所佔的比例為
注:在Word中按下[Alt]+[=]即可編輯公式。
而且
我們來根據西瓜資料集2.0(資料集可見:西瓜資料集)計算一下資訊熵:
在該資料集中,一共包含17個訓練樣例,因為資料集中的分類結果只有好瓜和壞瓜兩種。所以與上述的資訊熵描述對應的就是:這17個訓練樣例就是樣本集合D,集合中共有好瓜和壞瓜,那麼集合一共只有兩類,所以|
所以在決策樹開始之前,根節點是包含所有的樣本集也就是17個樣本,其中好瓜的比例為:
這樣就能夠算出根節點的資訊熵了,顯然這個資訊熵很大,所以這個時候根節點的純度並不高(再次提醒,
同時,計算資訊熵時約定:若
並且
這個也很好證明:
最小值證明:
當樣本中只有一種分類,那麼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=−log2y−1=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)
一般而言,資訊增益越大,則意味著使用屬性
道理其實也很簡單:從上述的資訊增益計算公式中能夠看出,
所以我們的最終目標就已經明確了,計算各個屬性的資訊增益,找出資訊增益最大的那個屬性作為我們的劃分點,這樣決策樹的分支節點的純度就會越來越高。
計算資訊增益 。
如果將上述的“資訊增益”應用到西瓜資料集中,我們選取“色澤”這個屬性講解,那麼對應的內容應該是這樣的:
全部的西瓜資料集
其中
其中
其中
(所佔的比例對應的就是上述中的權重
按照“資訊增益”的公式,我們需要知道
即:
其次,我們也已經計算出了各個分支的權重
即:
那麼我們就只需要計算各個分支的
首先來計算
編號 | 色澤 | 根蒂 | 敲聲 | 紋理 | 臍部 | 觸感 | 好瓜 |
---|---|---|---|---|---|---|---|
1 | 青綠 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
4 | 青綠 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
6 | 青綠 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 是 |
10 | 青綠 | 硬挺 | 清脆 | 清晰 | 平坦 | 軟粘 | 否 |
13 | 青綠 | 稍蜷 | 濁響 | 稍糊 | 凹陷 | 硬滑 | 否 |
17 | 青綠 | 蜷縮 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
按照資訊熵的公式:
從資料表中可知共有兩種分類,其中好瓜的比例為
繼續計算
編號 | 色澤 | 根蒂 | 敲聲 | 紋理 | 臍部 | 觸感 | 好瓜 |
---|---|---|---|---|---|---|---|
5 | 淺白 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
11 | 淺白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 否 |
12 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 軟粘 | 否 |
14 | 淺白 | 稍蜷 | 沉悶 | 稍糊 | 凹陷 | 硬滑 | 否 |
16 | 淺白 | 蜷縮 | 濁響 | 模糊 | 平坦 | 硬滑 | 否 |
從資料表中得到
最後計算
編號 | 色澤 | 根蒂 | 敲聲 | 紋理 | 臍部 | 觸感 | 好瓜 |
---|---|---|---|---|---|---|---|
2 | 烏黑 | 蜷縮 | 沉悶 | 清晰 | 凹陷 | 硬滑 | 是 |
3 | 烏黑 | 蜷縮 | 濁響 | 清晰 | 凹陷 | 硬滑 | 是 |
7 | 烏黑 | 稍蜷 | 濁響 | 稍糊 | 稍凹 | 軟粘 | 是 |
8 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 硬滑 | 是 |
9 | 烏黑 | 稍蜷 | 沉悶 | 稍糊 | 稍凹 | 硬滑 | 否 |
15 | 烏黑 | 稍蜷 | 濁響 | 清晰 | 稍凹 | 軟粘 | 否 |
從資料表中得
那麼我們得到了所有想要的數值,將它們全部帶入到”資訊增益“的公式中:
這樣我們就計算出了”色澤“的資訊增益,我們可以使用同樣的方法計算出其他屬性的資訊增益值:
顯然,屬性”紋理“的資訊增益量最大,說明如何按照”紋理“這個屬性進行劃分的話,分支節點的純度比較高,於是它被選為劃分屬性。如果按照”紋理“這一屬性對根節點進行劃分的話,各分支節點包含的樣本子集如下圖所示,其中數字代表樣本編號:
這樣,我們就完成了第一次劃分,按照紋理劃分之後我們還需要繼續劃分,以圖中的第一個子節點,即 {”紋理“ = ”清晰“}為例,該節點包含的樣例
在這裡根蒂、臍部、觸感三個屬性均取得了最大的資訊增益,可任取其中之一作為劃分屬性,再次劃分得到子分支。
就這樣不斷的劃分,直到遇到終止條件:
- 當前節點包含的樣本全屬於同一類別,無需劃分;
- 當前屬性集為空,或是所有樣本再所有屬性上取值相同,無法劃分;
- 當前節點集合包含的樣本集合為空,不能劃分。
在第2種情形下,我們把當前節點標記為葉節點,並將其類別設定為該節點所含樣本最多的類別;
在第3種情形下,同樣把當前節點標記為葉節點,但將其類別設定為其父節點所含樣本最多的類別。
注意這兩種情形的處理實質不同:情形2實在利用當前節點的後驗分佈,而情形3是把父節點的樣本作為當前節點的先驗分佈。
總結。
決策樹基本知識都進行了介紹,這裡選取資訊增益作為劃分特徵的選擇,當然也如文中所提到的”增益率“、”基尼指數“等,還有其它方法能夠使用。
決策樹使用起來效率不錯,而且實現起來也不太難,演算法的原理也比較理解,可謂是一個經久不衰的模型了。
在本文中並沒有提及程式碼的實現,但是相關的程式碼已經實現,可以在本人的github中進行檢視,傳送門:西瓜書決策樹實現
程式碼繪圖結果:
相關文章
- 基於資訊增益和基尼指數的二叉決策樹
- 決策樹中資訊增益、ID3以及C4.5的實現與總結
- ML《決策樹(一)ID3》
- 決策樹模型(1)總體介紹模型
- 通俗地說決策樹演算法(一)基礎概念介紹演算法
- 機器學習之決策樹ID3(python實現)機器學習Python
- 關於決策樹的理解
- 鵝廠優文 | 決策樹及ID3演算法學習演算法
- 機器學習實戰(三)決策樹ID3:樹的構建和簡單分類機器學習
- 資訊增益
- 決策樹模型(3)決策樹的生成與剪枝模型
- python中如何實現資訊增益和資訊增益率Python
- 【面試考】【入門】決策樹演算法ID3,C4.5和CART面試演算法
- 決策樹
- 《機器學習Python實現_09_01_決策樹_ID3與C4.5》機器學習Python
- 決策樹示例
- 大資料————決策樹(decision tree)大資料
- 介紹基於事件的架構事件架構
- 4. 決策樹
- Decision tree——決策樹
- 決策樹(Decision Tree)
- 基於可靠訊息方案的分散式事務:Lottor介紹分散式
- 如何建立用於根本原因分析的決策樹
- Python機器學習:決策樹001什麼是決策樹Python機器學習
- 機器學習 Day 9 | 決策樹基礎機器學習
- 機器學習演算法(五):基於企鵝資料集的決策樹分類預測機器學習演算法
- 分類——決策樹模型模型
- 決策樹演算法演算法
- ML《決策樹(三)CART》
- 自動駕駛系統的決策規劃模組介紹自動駕駛
- 基於DataX的資料同步(上)-DataX介紹以及安裝
- 關於mysql基礎知識的介紹MySql
- 基於隱私保護技術的DNS通訊協議介紹DNS協議
- 【Python機器學習實戰】決策樹和整合學習(二)——決策樹的實現Python機器學習
- 基於C#的機器學習--我應該接受這份工作嗎-使用決策樹C#機器學習
- 決策樹在sklearn中的實現
- 機器學習:決策樹機器學習
- 決策樹和隨機森林隨機森林