決策樹ID3詳解(西瓜案例)

一、決策樹

決策樹(decision tree)是一種基本的分類與迴歸方法。一般情況下,迴歸方法可以轉換爲分類方法,因此,本文主要討論用於分類的決策樹。
首先如果是小白,推薦一個比較好的視頻講解,簡單易懂。

機器學習經典算法——決策樹與隨機森林

建議先看這個視頻,然後看懂如下案例

決策樹主要算法有:ID3、C4.5、CART。以及進化後的C4.5算法C5.0、分類有極大提升的Tsallis等算法。這些算法的區別就在於選擇最優特徵的方式。但C5.0的核心原理與C4.5是相同的,它對於C4.5的改進在於計算速率,尤其是對於大數據,C4.5的速度非常慢,而C5.0對大數據運算效率極高。但C5.0一直是商用算法,之前一直未開源,但官方提供了可將C5.0構建的分類器嵌入到自己組織中的C源碼。

二、決策樹的構建策略

那麼決策樹的構建策略是什麼的?
一句話:
隨着樹的深度增加,節點的熵迅速降低。熵降低的速度越快越好,這樣我們有希望得到一顆高度最矮的決策樹。

三、決策樹之ID3生成算法

輸入:訓練數據集D和特徵A
輸出:特徵A對訓練數據集D的信息增益g(D,A)

(1)經驗熵
經驗熵公式
(2)經驗條件熵
在這裏插入圖片描述
看不懂公式沒關係,待會有例子直接秒懂!建議看了例子再回來回味下公式的含義哦。
(3)信息增益

info_gain(D,A) = H (X) - H (D | A)
簡單來說就是我如果把A特徵作爲本次的根節點,那麼熵則變化多少。

四、案例

(數據集在文章尾部給出)

import numpy as np
import pandas as pd
import math
data = pd.read_csv('./西瓜數據.txt')
data
# ID3

# 定義一個函數專門求解每一個特徵的一種情況的熵
def info(x,y):
    if x != y and x != 0:
        # 計算當前情況的熵
        return -(x/y)*math.log2(x/y) - ((y-x)/y)*math.log2((y-x)/y)
    if x == y or x == 0:
        # 純度最大,熵值爲0
        return 0
info_D = info(8,17)
info_D

這裏求得最開始的系統熵:0.9975025463691153

1.計算色澤的信息熵


# # 計算色澤的信息熵色澤信息增益: 
#      - 烏黑6 好瓜4   
#      - 青綠6 好瓜3
#      - 淺白5 好瓜1

# 計算每種情況的熵
seze_black_entropy = -(4/6)*math.log2(4/6)-(2/6)*math.log2(2/6)
seze_green_entropy = -(3/6)*math.log2(3/6)*2
seze_white_entropy = -(1/5)*math.log2(1/5)-(4/5)*math.log2(4/5)

# 計算色澤特徵色信息熵
seze_entropy = (6/17)*seze_black_entropy+(6/17)*seze_green_entropy+(5/17)*seze_white_entropy
print(seze_entropy)
# 計算信息增益
info_D - seze_entropy

色澤的信息熵:0.88937738110375
選擇色澤的信息增益:0.10812516526536531

2.計算根蒂的信息熵

# 查看根蒂的值得情況
data.根蒂.value_counts()
# 查看每種根蒂中好壞瓜情況的分佈情況
print(data[data.根蒂=='蜷縮'])
print(data[data.根蒂=='稍蜷'])
print(data[data.根蒂=='硬挺'])
gendi_entropy = (8/17)*info(5,8)+(7/17)*info(3,7)+(2/17)*info(0,2)
gain_col = info_D - gendi_entropy
gain_col

選擇根蒂的信息增益:0.14267495956679277

3.計算敲聲的信息熵

# 查看敲聲的值得情況
data.敲聲.value_counts()
# 查看每種敲聲中好壞瓜情況的分佈情況
print(data[data.敲聲=='濁響'])
print(data[data.敲聲=='沉悶'])
print(data[data.敲聲=='清脆'])
qiaosheng_entropy = (10/17)*info(6,10)+(5/17)*info(2,5)+(2/17)*info(0,2)
info_gain = info_D - qiaosheng_entropy
info_gain

選擇敲聲的信息增益:0.14078143361499584

4.計算紋理的信息熵

# 查看紋理的值得情況
data.紋理.value_counts()
# 查看每種紋理中好壞瓜情況的分佈情況
print(data[data.紋理=="清晰"])
print(data[data.紋理=="稍糊"])
print(data[data.紋理=="模糊"])
wenli_entropy = (9/17)*info(7,9)+(5/17)*info(1,5)+(3/17)*info(0,3)
info_gain = info_D - wenli_entropy
info_gain

選擇紋理的信息增益:0.3805918973682686

5.計算臍部的信息熵

# 查看臍部的值得情況
data.臍部.value_counts()
# 查看每種臍部中好壞瓜情況的分佈情況
print(data[data.臍部=="凹陷"])
print(data[data.臍部=="稍凹"])
print(data[data.臍部=="平坦"])
qidai_entropy = (7/17)*info(5,7)+(6/17)*info(3,6)+(4/17)*info(0,4)
info_gain = info_D - qidai_entropy
info_gain

選擇臍部的信息增益:0.28915878284167895

6.計算觸感的信息熵

# 查看觸感的值得情況
data.觸感.value_counts()
# 查看每種臍部中好壞瓜情況的分佈情況
print(data[data.觸感=="硬滑"])
print(data[data.觸感=="軟粘"])
chugna_entropy = (12/17)*info(6,12)+(5/17)*info(2,5)
info_D - chugna_entropy

選擇臍部的信息增益:0.006046489176565584

7. 結果分析

起始熵(前面已經計算過):0.9975025463691153

特徵 信息熵 信息增益
色澤 0.88937738110375 0.10812516526536531
根蒂 0.8548275868023225 0.14267495956679277
敲聲 0.8567211127541194 0.14078143361499584
紋理 0.6169106490008467 0.3805918973682686
臍部 0.7083437635274363 0.28915878284167895
觸感 0.9914560571925497 0.006046489176565584

可以看到信息增益最大的特徵是紋理這個特徵,也就是說本次最優選擇紋理作爲根節點進行分類

然後繼續上面的操作,遍歷剩餘的特徵。

編號,色澤,根蒂,敲聲,紋理,臍部,觸感,密度,含糖率,好瓜
1,青綠,蜷縮,濁響,清晰,凹陷,硬滑,0.697,0.46,2,烏黑,蜷縮,沉悶,清晰,凹陷,硬滑,0.774,0.376,3,烏黑,蜷縮,濁響,清晰,凹陷,硬滑,0.634,0.264,4,青綠,蜷縮,沉悶,清晰,凹陷,硬滑,0.608,0.318,5,淺白,蜷縮,濁響,清晰,凹陷,硬滑,0.556,0.215,6,青綠,稍蜷,濁響,清晰,稍凹,軟粘,0.403,0.237,7,烏黑,稍蜷,濁響,稍糊,稍凹,軟粘,0.481,0.149,8,烏黑,稍蜷,濁響,清晰,稍凹,硬滑,0.437,0.211,9,烏黑,稍蜷,沉悶,稍糊,稍凹,硬滑,0.666,0.091,10,青綠,硬挺,清脆,清晰,平坦,軟粘,0.243,0.267,11,淺白,硬挺,清脆,模糊,平坦,硬滑,0.245,0.057,12,淺白,蜷縮,濁響,模糊,平坦,軟粘,0.343,0.099,13,青綠,稍蜷,濁響,稍糊,凹陷,硬滑,0.639,0.161,14,淺白,稍蜷,沉悶,稍糊,凹陷,硬滑,0.657,0.198,15,烏黑,稍蜷,濁響,清晰,稍凹,軟粘,0.36,0.37,16,淺白,蜷縮,濁響,模糊,平坦,硬滑,0.593,0.042,17,青綠,蜷縮,沉悶,稍糊,稍凹,硬滑,0.719,0.103,

五、C4.5

1.ID3算法的缺陷

對於ID3算法,它存在以下問題:

  • 取值多的屬性,更容易使數據更純,其信息增益更大;
  • 訓練得到的是一棵龐大且深度淺的樹,這樣的樹是不合理的。

C4.5算法可以抑制ID3的上述缺點。

2.C4.5算法

C4.5算法改進了信息增益,它選用信息增益比來選擇最優特徵。
特徵A對訓練數據集D的信息增益比gR(D,A)定義爲其信息增益g(D,A)與訓練數據集D關於特徵A的值的熵HA(D)之比,即
在這裏插入圖片描述
其中g( D, A)爲本特徵計算的信息增益
在這裏插入圖片描述
是訓練數據集D關於特徵A的值的熵

  • n是特徵A取值的個
  • 其他部分與ID3算法完全相同。

最好是自己打一遍代碼,能更好的體會決策樹的構建過程。

需要代碼可以評論留言我,代碼是我在jupyter上寫的。

可能寫的不太好,希望大家能提提意見,共同進步!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章