一、決策樹
決策樹(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上寫的。
可能寫的不太好,希望大家能提提意見,共同進步!