分類演算法之決策樹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演算法在選擇根節點和各內部節點中的分支屬性時,採用資訊增益作為評價標準。資訊增益的缺點是傾向於選擇取值較多的屬性,在有些情況下這類屬性可能不會提供太多有價值的資訊。