1. 程式人生 > >分類演算法之決策樹ID3詳解

分類演算法之決策樹ID3詳解

回顧決策樹的基本知識,其構建過程主要有下述三個重要的問題:

     (1)資料是怎麼分裂的

     (2)如何選擇分類的屬性

     (3)什麼時候停止分裂

     從上述三個問題出發,以實際的例子對ID3演算法進行闡述。

先上問題吧,我們統計了14天的氣象資料(指標包括outlook,temperature,humidity,windy),並已知這些天氣是否打球(play)。如果給出新一天的氣象指標資料:sunny,cool,high,TRUE,判斷一下會不會去打球。

table 1

outlook temperature humidity windy play
sunny hot high FALSE no
sunny hot high TRUE no
overcast hot high FALSE yes
rainy mild high FALSE yes
rainy cool normal FALSE yes
rainy cool normal TRUE no
overcast cool normal TRUE yes
sunny mild high FALSE no
sunny cool normal FALSE yes
rainy mild normal FALSE yes
sunny mild normal TRUE yes
overcast mild high TRUE yes
overcast hot normal FALSE yes
rainy mild high TRUE no

這個問題當然可以用樸素貝葉斯法求解,分別計算在給定天氣條件下打球和不打球的概率,選概率大者作為推測結果。

現在我們使用ID3歸納決策樹的方法來求解該問題。

預備知識:

(1)資訊熵


補充兩個對數去處公式:

(2) 資訊增益

用決策樹來預測:

決策樹的形式類似於“如果天氣怎麼樣,去玩;否則,怎麼著怎麼著”的樹形分叉。那麼問題是用哪個屬性(即變數,如天氣、溫度、溼度和風力)最適合充當這顆樹的根節點,在它上面沒有其他節點,其他的屬性都是它的後續節點。

那麼借用上面所述的能夠衡量一個屬性區分以上資料樣本的能力的“資訊增益”(Information Gain)理論。

如果一個屬性的資訊增益量越大,這個屬性作為一棵樹的根節點就能使這棵樹更簡潔,比如說一棵樹可以這麼讀成,如果風力弱,就去玩;風力強,再按天氣、溫度等分情況討論,此時用風力作為這棵樹的根節點就很有價值。如果說,風力弱,再又天氣晴朗,就去玩;如果風力強,再又怎麼怎麼分情況討論,這棵樹相比就不夠簡潔了。

用熵來計算資訊增益:

複製程式碼
1 計算分類系統熵
類別是 是否出去玩。取值為yes的記錄有9個,取值為no的有5個,即說這個樣本里有9個正例,5 個負例,記為S(9+,5-),S是樣本的意思(Sample)。那麼P(c1) = 9/14, P(c2) = 5/14
這裡熵記為Entropy(S),計算公式為:
Entropy(S)= -(9/14)*log2(9/14)-(5/14)*log2(5/14)
2 分別以Wind、Humidity、Outlook和Temperature作為根節點,計算其資訊增益

我們來計算Wind的資訊增益
當Wind固定為Weak時:記錄有8條,其中正例6個,負例2個;
同樣,取值為Strong的記錄6個,正例負例個3個。我們可以計算相應的熵為:
Entropy(Weak)=-(6/8)*log(6/8)-(2/8)*log(2/8)=0.811
Entropy(Strong)=-(3/6)*log(3/6)-(3/6)*log(3/6)=1.0
現在就可以計算出相應的資訊增益了:
所以,對於一個Wind屬性固定的分類系統的資訊量為 (8/14)*Entropy(Weak)+(6/14)*Entropy(Strong)
Gain(Wind)=Entropy(S)-(8/14)*Entropy(Weak)-(6/14)*Entropy(Strong)=0.940-(8/14)*0.811-(6/14)*1.0=0.048
這個公式的奧祕在於,8/14是屬性Wind取值為Weak的個數佔總記錄的比例,同樣6/14是其取值為Strong的記錄個數與總記錄數之比。

同理,如果以Humidity作為根節點:
Entropy(High)=0.985 ; Entropy(Normal)=0.592
Gain(Humidity)=0.940-(7/14)*Entropy(High)-(7/14)*Entropy(Normal)=0.151
以Outlook作為根節點:
Entropy(Sunny)=0.971 ; Entropy(Overcast)=0.0 ; Entropy(Rain)=0.971
Gain(Outlook)=0.940-(5/14)*Entropy(Sunny)-(4/14)*Entropy(Overcast)-(5/14)*Entropy(Rain)=0.247
以Temperature作為根節點:
Entropy(Cool)=0.811 ; Entropy(Hot)=1.0 ; Entropy(Mild)=0.918
Gain(Temperature)=0.940-(4/14)*Entropy(Cool)-(4/14)*Entropy(Hot)-(6/14)*Entropy(Mild)=0.029
這樣我們就得到了以上四個屬性相應的資訊增益值:
Gain(Wind)=0.048 ;Gain(Humidity)=0.151 ; Gain(Outlook)=0.247 ;Gain(Temperature)=0.029
最後按照資訊增益最大的原則選Outlook為根節點。子節點重複上面的步驟。這顆樹可以是這樣的,它讀起來就跟你認為的那樣:

ID3優點是理論清晰、方法簡單、學習能力較強,但也存在一些缺點:

(1)只能處理分類屬性的資料,不能處理連續的資料;

(2)劃分過程會由於子集規模過小而造成統計特徵不充分而停止;

(3)ID3演算法在選擇根節點和各內部節點中的分支屬性時,採用資訊增益作為評價標準。資訊增益的缺點是傾向於選擇取值較多的屬性,在有些情況下這類屬性可能不會提供太多有價值的資訊。