本文參考如下兩個來源,在下面的文章中沒有一個完整的生成示例,在本人學習過程當中帶來了不少的困惑,這篇文檔展現一個完整的決策樹的生成過程,但願對學習過程當中的咱們有所幫助:算法
文章所使用的數據集以下,來源於《數據分析實戰45講》17講中機器學習
天氣 | 溫度 | 溼度 | 颳風 | 是否打籃球 |
---|---|---|---|---|
晴 | 高 | 中 | 否 | 否 |
晴 | 高 | 中 | 是 | 否 |
陰 | 高 | 高 | 否 | 是 |
小雨 | 高 | 高 | 否 | 是 |
小雨 | 低 | 高 | 否 | 否 |
晴天 | 中 | 中 | 是 | 是 |
陰天 | 中 | 高 | 是 | 否 |
以上面的表格數據爲例,好比咱們考慮要不要去打籃球,先看天氣是否是陰天,是陰天的話,外面颳風沒,沒颳風咱們就去,颳風就不去。決策樹就是把上面咱們判斷背後的邏輯整理成一個結構圖,也就是一個樹狀結構。學習
在決策樹構造中有三個著名算法: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
其數據表格以下:
溫度狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
高 | 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
其數據表格以下:
溼度狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
高 | 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
其數據表格以下:
颳風狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
是 | 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
以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得選擇爲:溫度
Gain(颳風)=0.985 - 0.964 = 0.021
Gain_ratio(颳風)=0.021/0.985=0.021
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
其數據表格以下:
溼度狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
高 | 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
其數據表格以下:
颳風狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
是 | 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
以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得選擇爲:溼度
Gain(颳風)=1.0 - 0.688 = 0.312
Gain_ratio(颳風)=0.312/0.918=0.349
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
其數據表格以下:
溼度狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
高 | 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
其數據表格以下:
颳風狀態 | 打籃球數量 | 不打籃球數量 | 總數 |
---|---|---|---|
是 | 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
以下彙總全部接口,第一個爲信息增益的,第二個爲信息增益率的,第三個爲基尼係數的。其中信息增益和信息增益率選擇最大的,基尼係數選擇最小的。從下面的結果能夠獲得天氣和溼度是同樣好的,咱們隨機選天氣吧
Gain(颳風)=1.0 - 1.0 = 0
Gain_ratio(颳風)=0/0 = 0
Gini(颳風)=2/2 * 0.5 = 0.5
肯定跟節點之後,大體的樹結構以下,選擇天氣做爲分裂屬性後能直接肯定結果:
在上面的步驟已經進行完整的演示,獲得當前數據一個完整的決策樹:
在構造的過程當中咱們能夠發現,有可能同一個屬性在同一級會被選中兩次,好比上面的決策樹中子節點溫度高中都能選中溫度做爲分裂屬性,這樣是否合理?
完整的構造整個決策樹後,發現整個決策樹的高度大於等於屬性數量,感受決策樹應該是構造時間較長,但用於決策的時候很快,時間複雜度也就是O(n)
周志華的《機器學習》是本好書,極客專欄感興趣的能夠去看看