決策樹之構造生成

決策樹之構造生成


參考說明

    本文參考如下兩個來源,在下面的文章中沒有一個完整的生成示例,在本人學習過程當中帶來了不少的困惑,這篇文檔展現一個完整的決策樹的生成過程,但願對學習過程當中的咱們有所幫助:算法

  • 極客時間:《數據分析實戰45講》:1七、1八、19講
  • 周志華:《機器學習》:第四章 決策樹

示例數據表格

    文章所使用的數據集以下,來源於《數據分析實戰45講》17講中機器學習

天氣 溫度 溼度 颳風 是否打籃球
小雨
小雨
晴天
陰天

相關概念闡述

決策樹

    以上面的表格數據爲例,好比咱們考慮要不要去打籃球,先看天氣是否是陰天,是陰天的話,外面颳風沒,沒颳風咱們就去,颳風就不去。決策樹就是把上面咱們判斷背後的邏輯整理成一個結構圖,也就是一個樹狀結構。學習

ID三、C4.五、CART

    在決策樹構造中有三個著名算法:ID三、C4.五、CART,ID3算法計算的是信息增益,C4.5計算使用的是增益率、CART計算使用的是基尼係數,下面簡單介紹下其算法,這裏也不要求徹底看懂,掃一眼有個印象就行,在後面的例子中有計算示例,回過頭結合看應該就懂了。code

信息熵

    在信息論中,隨機離散事件的出現的機率存在不肯定性,爲了衡量這種信息的不肯定性,信息學之父香農引入了信息熵的概念,並給出了計算信息熵的數學公式。接口

Entopy(t)=-Σp(i|t)log2p(i|t)

信息增益

    信息增益指的是劃分能夠帶來純度的提升,信息熵的降低。它的計算公式是父親節點的信息熵減去全部子節點的信息熵。信息增益的公式能夠表示爲:事件

Gain(D,a)=Entropy(D)- Σ|Di|/|D|Entropy(Di)

信息增益率

    信息增益率 = 信息增益 / 屬性熵。屬性熵,就是每種屬性的信息熵,好比天氣的屬性熵的計算以下,天氣有晴陰雨,各佔3/7,2/7,2/7:ip

H(天氣)= -(3/7 * log2(3/7) + 2/7 * log2(2/7) + 2/7 * log2(2/7))

基尼係數

    基尼係數在經濟學中用來衡量一個國家收入差距的經常使用指標.當基尼指數大於0.4的時候,說明財富差別懸殊.基尼係數在0.2-0.4之間說明分配合理,財富差距不大.擴展閱讀下基尼係數文檔

    基尼係數自己反應了樣本的不肯定度.當基尼係數越小的時候,說明樣本之間的差別性小,不肯定程度低.get

    CART算法在構造分類樹的時候,會選擇基尼係數最小的屬性做爲屬性的劃分.數據分析

    基尼係數的計算公式以下:

Gini = 1 – Σ (Pi)2 for i=1 to number of classes

舉例說明

    下面是一個完整的決策樹的構造生成過程,已完整開頭所給的數據爲例

根節點的選擇

    在上面的列表中有四個屬性:天氣,溫度,溼度,颳風.須要先計算出這四個屬性的信息增益、信息增益率、基尼係數

    數據集中有7條數據,3個打籃球,4個不打籃球,不打籃球的機率爲4/7,打籃球的機率爲3/7,則根據信息熵的計算公式能夠獲得根節點的信息熵爲:

Ent(D)=-(4/7 * log2(4/7) + 3/7 * log2(3/7))=0.985

天氣

    其數據表格以下:

天氣狀態 打籃球數量 不打籃球數量 總數
1 2 3
1 1 2
小雨 1 1 2
信息增益計算

    若是將天氣做爲屬性劃分,分別會有三個葉節點:晴天、陰天、小雨,其中晴天2個不打籃球,1個打籃球;陰天1個打籃球,1個不打籃球;小雨1個打籃球,1個不打籃球,其對應相應的信息熵以下:

D(晴天)=-(1/3 * log2(1/3) + 2/3 * log2(2/3)) = 0.981
D(陰天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
D(雨天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0

    在數據集中晴天有3條數據,陰天有2條數據,雨天有2條數據,對應的機率爲3/七、2/七、2/7,那麼做爲子節點的歸一化信息熵爲:

3/7 * 0.918 + 2/7 * 1.0 * 2/7 * 1.0 = 0.965

    其信息增益爲:

Gain(天氣)=0.985 - 0.965 = 0.020
信息增益率計算

    天氣有三個選擇,晴天有3條數據,陰天有2條數據,雨天有2條數據,對應的機率爲3/七、2/七、2/7,其對應的屬性熵爲:

H(天氣)=-(3/7 * log2(3/7) + 2/7 * log2(2/7) + 2/7 * log2(2/7)) = 1.556

    則其信息增益率爲:

Gain_ratio(天氣)=0.020/1.556=0.012
基尼係數計算
  • Gini(天氣=晴)=1 - (1/3)^2 - (2/3)^2 = 1 - 1/9 - 4/9 = 4/9
  • Gini(天氣=陰)=1 - (1/2)^2 - (1/2)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(天氣=小雨)=1 - (1/2)^2 - (1/2)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(天氣)=(3/7) * 4/9 + (2/7) * 0.5 + (2/7) * 0.5 = 4/21 + 1/7 + 1/7 = 10/21

溫度

    其數據表格以下:

溫度狀態 打籃球數量 不打籃球數量 總數
2 2 4
1 1 2
0 1 1
信息增益計算

    各狀況的信息熵以下:

D(高)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0
D(中)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
D(低)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0

    做爲子節點的歸一化信息熵爲:

4/7 * 1.0 + 2/7 * 1.0 * 1/7 * 0.0 = 0.857

    其信息增益爲:

Gain(溫度)=0.985 - 0.857 = 0.128
信息增益率計算

    屬性熵爲:

H(溫度)=-(4/7 * log2(4/7) + 2/7 * log2(2/7) + 1/7 * log2(1/7)) = 1.378

    則其信息增益率爲:

Gain_ratio(溫度)=0.128/1.378=0.0928
基尼係數計算
  • Gini(溫度=高)=1 - (2/4)^2 - (2/4)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(溫度=中)=1 - (1/2)^2 - (1/2)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(溫度=低)=1 - (0/1)^2 - (1/1)^2 = 1 - 0 - 1 = 0
  • Gini(溫度)=4/7 * 0.5 + 2/7 * 0.5 + 1/7 * 0 = 3/7

溼度的基尼係數計算

    其數據表格以下:

溼度狀態 打籃球數量 不打籃球數量 總數
2 2 4
2 1 3
信息增益計算

    各狀況的信息熵以下:

D(高)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0
D(中)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918

    做爲子節點的歸一化信息熵爲:

4/7 * 1.0 + 3/7 * 0.918 = 0.964

    其信息增益爲:

Gain(溼度)=0.985 - 0.964 = 0.021
信息增益率計算

    屬性熵爲:

H(溼度)=-(4/7 * log2(4/7) + 3/7 * log2(3/7) = 0.985

    則其信息增益率爲:

Gain_ratio(溼度)=0.021/0.985=0.021
基尼係數計算
  • Gini(溼度=高)=1 - (2/4)^2 - (2/4)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(溼度=中)=1 - (2/3)^2 - (1/3)^2 = 1 - 4/9 - 1/9 = 4/9
  • Gini(溼度)=(4/7) * 0.5 + (3/7) * 4/9 = 2/7 + 4/21 = 10/21 ~ 0.47619

颳風的基尼係數計算

    其數據表格以下:

颳風狀態 打籃球數量 不打籃球數量 總數
1 2 3
2 2 4
信息增益計算

    各狀況的信息熵以下:

D(是)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918
D(否)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0

    做爲子節點的歸一化信息熵爲:

3/7 * 1.0 + 4/7 * 0.918 = 0.964

    其信息增益爲:

Gain(颳風)=0.985 - 0.964 = 0.021
信息增益率計算

    屬性熵爲:

H(颳風)=-(4/7 * log2(4/7) + 3/7 * log2(3/7) = 0.985

    則其信息增益率爲:

Gain_ratio(颳風)=0.021/0.985=0.021
基尼係數計算
  • Gini(颳風=是)=1 - (2/3)^2 - (1/3)^2 = 1 - 4/9 - 1/9 = 4/9
  • Gini(颳風=否)=1 - (2/4)^2 - (2/4)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(颳風)=(4/7) * 0.5 + (3/7) * 4/9 = 2/7 + 4/21 = 10/21 ~ 0.47619

根節點的選擇

    以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得選擇爲:溫度

  • Gain(天氣)=0.985 - 0.965 = 0.020
  • Gain(溫度)=0.985 - 0.857 = 0.128
  • Gain(溼度)=0.985 - 0.964 = 0.021
  • Gain(颳風)=0.985 - 0.964 = 0.021

  • Gain_ratio(天氣)=0.020/1.556=0.012
  • Gain_ratio(溫度)=0.128/1.378=0.0928
  • Gain_ratio(溼度)=0.021/0.985=0.021
  • Gain_ratio(颳風)=0.021/0.985=0.021

  • Gini(天氣)=(3/7) * 4/9 + (2/7) * 0.5 + (2/7) * 0.5 = 0.47619
  • Gini(溫度)=4/7 * 0.5 + 2/7 * 0.5 + 1/7 * 0 = 0.42857
  • Gini(溼度)=(4/7) * 0.5 + (3/7) * 4/9 = 2/7 + 4/21 = 10/21 ~ 0.47619
  • Gini(颳風)=(4/7) * 0.5 + (3/7) * 4/9 = 2/7 + 4/21 = 10/21 ~ 0.47619

    肯定跟節點之後,大體的樹結構以下,溫度低能肯定結果,高和中須要進一步的進行分裂,從剩下的數據中再次進行屬性選擇:

  • 根節點
    • 子節點溫度高:(待進一步進行選擇)
    • 子節點溫度中:(待進一步進行選擇)
    • 葉節點溫度低:不打籃球(能直接肯定爲不打籃球)

子節點溫度高的選擇

    其剩下的數據集以下,溫度再也不進行下面的節點選擇參與:

天氣 溫度(不參與這次分裂) 溼度 颳風 是否打籃球
小雨

    根據信息熵的計算公式能夠獲得子節點溫度高的信息熵爲:

Ent(D)=-(2/4 * log2(2/4) + 2/4 * log2(2/4)) = 1.0

天氣

    其數據表格以下:

天氣狀態 打籃球數量 不打籃球數量 總數
1 1 2
1 0 1
小雨 1 0 1
信息增益計算

    相應的信息熵以下:

D(晴天)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0
D(陰天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0
D(雨天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0

    歸一化信息熵爲:

2/4 * 1.0 + 1/4 * 0.0 * 1/4 * 0.0 = 0.5

    其信息增益爲:

Gain(天氣)=1.0 - 0.5 = 0.5
信息增益率計算

    對應的屬性熵爲:

H(天氣)=-(2/4 * log2(2/4) + 1/4 * log2(1/4) + 1/4 * log2(1/4)) = 1.5

    則其信息增益率爲:

Gain_ratio(天氣)=0.5/1.5=0.33333
基尼係數計算
  • Gini(天氣=晴)=1 - (1/2)^2 - (1/2)^2 = 1 - 1/4 - 1/4 = 0.5
  • Gini(天氣=陰)=1 - (1/1)^2 - (0/1)^2 = 0
  • Gini(天氣=小雨)=1 - (1/1)^2 - (0/1)^2 = 0
  • Gini(天氣)=2/4 * 0.5 + 1/4 * 0 + 1/4 * 0 = 0.25

溼度的基尼係數計算

    其數據表格以下:

溼度狀態 打籃球數量 不打籃球數量 總數
2 0 2
0 2 2
信息增益計算

    各狀況的信息熵以下:

D(高)=-(2/2 * log2(2/2) + 0/2 * log2(0/2)) = 0.0
D(中)=-(0/2 * log2(0/2) + 2/2 * log2(2/2)) = 0.0

    做爲子節點的歸一化信息熵爲:

2/4 * 0.0 + 2/4 * 0.0 = 0.0

    其信息增益爲:

Gain(溼度)=1.0 - 0.0 = 1.0
信息增益率計算

    屬性熵爲:

H(溼度)=-(2/4 * log2(2/4) + 2/4 * log2(2/4) = 1.0

    則其信息增益率爲:

Gain_ratio(溼度)=1.0/1.0=1.0
基尼係數計算
  • Gini(溼度=高)=1 - (2/2)^2 - (0/2)^2 = 0
  • Gini(溼度=中)=1 - (0/2)^2 - (2/2)^2 = 0
  • Gini(溼度)=(2/4) * 0 + (2/4) * 0 = 0

颳風計算

    其數據表格以下:

颳風狀態 打籃球數量 不打籃球數量 總數
0 1 1
2 1 3
信息增益計算

    各狀況的信息熵以下:

D(是)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0
D(否)=-(2/3 * log2(2/3) + 1/3 * log2(1/3)) = 0.918

    做爲子節點的歸一化信息熵爲:

1/4 * 0.0 + 3/4 * 0.918 = 0.688

    其信息增益爲:

Gain(颳風)=1.0 - 0.688 = 0.312
信息增益率計算

    屬性熵爲:

H(颳風)=-(1/3 * log2(1/3) + 2/3 * log2(2/3) = 0.918

    則其信息增益率爲:

Gain_ratio(颳風)=0.312/0.918=0.349
基尼係數計算
  • Gini(颳風=是)=1 - (0/1)^2 - (1/1)^2 = 0
  • Gini(颳風=否)=1 - (2/3)^2 - (1/3)^2 = 1 - 4/9 - 1/9 = 4/9
  • Gini(颳風)=(1/4) * 0 + (3/4) * 4/9 = 1/3 = 0.333333

子節點溫度高的選擇

    以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得選擇爲:溼度

  • Gain(天氣)=1.0 - 0.5 = 0.5
  • Gain(溼度)=1.0 - 0.0 = 1.0
  • Gain(颳風)=1.0 - 0.688 = 0.312

  • Gain_ratio(天氣)=0.5/1.5=0.33333
  • Gain_ratio(溼度)=1.0/1.0=1.0
  • Gain_ratio(颳風)=0.312/0.918=0.349

  • Gini(天氣)=2/4 * 0.5 + 1/4 * 0 + 1/4 * 0 = 0.25
  • Gini(溼度)=(2/4) * 0 + (2/4) * 0 = 0
  • Gini(颳風)=(1/4) * 0 + (3/4) * 4/9 = 1/3 = 0.333333

    肯定跟節點之後,大體的樹結構以下,選擇溼度做爲分裂屬性後能直接肯定結果:

  • 根節點
    • 子節點溫度高
      • 葉節點溼度高:打籃球
      • 葉節點溼度中:不打籃球
    • 子節點溫度中:(待進一步進行選擇)
    • 葉節點溫度低:不打籃球(能直接肯定爲不打籃球)

子節點溫度中的選擇

    其剩下的數據集以下,溫度再也不進行下面的節點選擇參與:

天氣 溫度(不參與這次分裂) 溼度 颳風 是否打籃球
晴天
陰天

    根據信息熵的計算公式能夠獲得子節點溫度高的信息熵爲:

Ent(D)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0

天氣

    其數據表格以下:

天氣狀態 打籃球數量 不打籃球數量 總數
1 0 1
0 1 1
信息增益計算

    相應的信息熵以下:

D(晴天)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0
D(陰天)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0

    歸一化信息熵爲:

1/2 * 0.0 + 1/2 * 0.0 = 0

    其信息增益爲:

Gain(天氣)=1.0 - 0 = 1.0
信息增益率計算

    對應的屬性熵爲:

H(天氣)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0

    則其信息增益率爲:

Gain_ratio(天氣)=1.0/1.0=1.0
基尼係數計算
  • Gini(天氣=晴)=1 - (1/1)^2 - (0/1)^2 = 0
  • Gini(天氣=陰)=1 - (0/1)^2 - (1/1)^2 = 0
  • Gini(天氣)=1/2 * 0.0 + 1/2 * 0.0 = 0

溼度的基尼係數計算

    其數據表格以下:

溼度狀態 打籃球數量 不打籃球數量 總數
0 1 1
1 0 1
信息增益計算

    各狀況的信息熵以下:

D(高)=-(0/1 * log2(0/1) + 1/1 * log2(1/1)) = 0.0
D(中)=-(1/1 * log2(1/1) + 0/1 * log2(0/1)) = 0.0

    做爲子節點的歸一化信息熵爲:

1/2 * 0.0 + 1/2 * 0.0 = 0

    其信息增益爲:

Gain(溼度)=1.0 - 0.0 = 1.0
信息增益率計算

    屬性熵爲:

H(溼度)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0

    則其信息增益率爲:

Gain_ratio(溼度)=1.0/1.0=1.0
基尼係數計算
  • Gini(溼度=高)=1 - (0/1)^2 - (1/1)^2 = 0
  • Gini(溼度=中)=1 - (1/1)^2 - (0/1)^2 = 0
  • Gini(溼度)=1/2 * 0.0 + 1/2 * 0.0 = 0

颳風計算

    其數據表格以下:

颳風狀態 打籃球數量 不打籃球數量 總數
1 1 2
信息增益計算

    各狀況的信息熵以下:

D(是)=-(1/2 * log2(1/2) + 1/2 * log2(1/2)) = 1.0

    做爲子節點的歸一化信息熵爲:

1/1 * 1.0 = 1.0

    其信息增益爲:

Gain(颳風)=1.0 - 1.0 = 0
信息增益率計算

    屬性熵爲:

H(颳風)=-(2/2 * log2(2/2) = 0.0

    則其信息增益率爲:

Gain_ratio(颳風)=0/0 = 0
基尼係數計算
  • Gini(颳風=是)=1 - (1/2)^2 - (1/2)^2 = 0.5
  • Gini(颳風)=2/2 * 0.5 = 0.5

子節點溫度中的選擇

    以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得天氣和溼度是同樣好的,咱們隨機選天氣吧

  • Gain(天氣)=1.0 - 0 = 1.0
  • Gain(溼度)=1.0 - 0.0 = 1.0
  • Gain(颳風)=1.0 - 1.0 = 0

  • Gain_ratio(天氣)=1.0/1.0=1.0
  • Gain_ratio(溼度)=1.0/1.0=1.0
  • Gain_ratio(颳風)=0/0 = 0

  • Gini(天氣)=1/2 * 0.0 + 1/2 * 0.0 = 0
  • Gini(溼度)=1/2 * 0.0 + 1/2 * 0.0 = 0
  • Gini(颳風)=2/2 * 0.5 = 0.5

    肯定跟節點之後,大體的樹結構以下,選擇天氣做爲分裂屬性後能直接肯定結果:

  • 根節點
    • 子節點溫度高
      • 葉節點溼度高:打籃球
      • 葉節點溼度中:不打籃球
    • 子節點溫度中
      • 葉節點天氣晴:打籃球
      • 葉節點天氣陰:不打籃球
    • 葉節點溫度低:不打籃球(能直接肯定爲不打籃球)

最終的決策樹

    在上面的步驟已經進行完整的演示,獲得當前數據一個完整的決策樹:

  • 根節點
    • 子節點溫度高
      • 葉節點溼度高:打籃球
      • 葉節點溼度中:不打籃球
    • 子節點溫度中
      • 葉節點天氣晴:打籃球
      • 葉節點天氣陰:不打籃球
    • 葉節點溫度低:不打籃球(能直接肯定爲不打籃球)

思考

    在構造的過程當中咱們能夠發現,有可能同一個屬性在同一級會被選中兩次,好比上面的決策樹中子節點溫度高中都能選中溫度做爲分裂屬性,這樣是否合理?

    完整的構造整個決策樹後,發現整個決策樹的高度大於等於屬性數量,感受決策樹應該是構造時間較長,但用於決策的時候很快,時間複雜度也就是O(n)

話外

    周志華的《機器學習》是本好書,極客專欄感興趣的能夠去看看

相關文章
相關標籤/搜索