决策树的构造——一个手工例子
決策樹的構造——一個手工例子
這個數據集來自Mitchell的機器學習,叫做是否去打網球play-tennis,以下數據仍然是從帶逗號分割的文本文件,復制到紀事本,把后綴直接改為.csv就可以拿Excel打開:
*play-tennis data,其中6個變量依次為:編號、天氣{Sunny、Overcast、Rain}、溫度{熱、冷、適中}、濕度{高、正常}、風力{強、弱}以及最后是否去玩的決策{是、否}。一個建議是把這些數據導入Excel后,另復制一份去掉變量的數據到另外一個工作簿,即只保留14個觀測值。這樣可以方便地使用Excel的排序功能,隨時查看每個變量的取值到底有多少。*/
NO. , Outlook , Temperature , Humidity , Wind , Play
1 , Sunny , Hot , High , Weak , No
2 , Sunny , Hot , High , Strong , No
3 , Overcast , Hot , High , Weak , Yes
4 , Rain , Mild , High , Weak , Yes
5 , Rain , Cool , Normal , Weak , Yes
6 , Rain , Cool , Normal , Strong , No
7 , Overcast , Cool , Normal , Strong , Yes
8 , Sunny , Mild , High , Weak , No
9 , Sunny , Cool , Normal , Weak , Yes
10 , Rain , Mild , Normal , Weak , Yes
11 , Sunny , Mild , Normal , Strong , Yes
12 , Overcast , Mild , High , Strong , Yes
13 , Overcast , Hot , Normal , Weak , Yes
14 , Rain , Mild , High , Strong , No
這里我們先不討論算法(這里用的是ID3/C4.5),把一棵決策樹建立起來再說。我們要建立的決策樹的形式類似于“如果天氣怎么樣,去玩;否則,怎么著怎么著”的樹形分叉。那么問題是用哪個屬性(即變量,如天氣、溫度、濕度和風力)最適合充當這顆樹的根節點,在它上面沒有其他節點,其他的屬性都是它的后續節點。借用信息論的概念,我們用一個統計量,“信息增益”(Information Gain)來衡量一個屬性區分以上數據樣本的能力。信息增益量越大,這個屬性作為一棵樹的根節點就能使這棵樹更簡潔,比如說一棵樹可以這么讀成,如果風力弱,就去玩;風力強,再按天氣、溫度等分情況討論,此時用風力作為這棵樹的根節點就很有價值。如果說,風力弱,再又天氣晴朗,就去玩;如果風力強,再又怎么怎么分情況討論,這棵樹相比就不夠簡潔了。計算信息增益的公式需要用到“熵”(Entropy)。名詞越來越多,讓我們通過手工計算記住它們的計算方法,把Excel打開:
1 計算熵
我們檢查的屬性是是否出去玩。用Excel對上面數據的play變量的各個取值排個序(這個工作簿里把“play”這個詞去掉),一共是14條記錄,你能數出取值為yes的記錄有9個,取值為no的有5個,我們說這個樣本里有9個正例,5 個負例,記為S(9+,5-),S是樣本的意思(Sample)。這里熵記為Entropy(S),計算公式為:
Entropy(S)= -(9/14)*log(9/14)-(5/14)*log(5/14)
解釋一下,9/14是正例的個數與總記錄之比,同樣5/14是負例占總記錄的比例。log(.)是以2為底的對數(我們知道以e為底的對數稱為自然對數,記為ln(.),lg(.)表示以10為底的對數 )。在Excel里我們可以隨便找一個空白的單元格,鍵入以下公式即得0.940:
=-(9/14)*LOG(9/14,2)-(5/14)*LOG(5/14,2)
這里LOG(9/14,2)中的“2”表示以2為底。類似地,如果你習慣用Matlab做數學運算本,公式為
-(9/14)*log2(9/14)-(5/14)*log2(5/14)
其中“2”的含義與上同。
總結:在這個例子中,我們的輸出屬性(我們要檢查的屬性)“play”只有兩個取值,同樣地,如果輸出屬性的取值大于2,公式是對成的,一樣的形式,連加就是,找到各個取值的個數,求出各自的比例。如果樣本具有二元輸出屬性,其熵的公式為
Entropy(S) =-(p+)*log(p+)-(p-)*log(p-)
其中,p+、p-分別為正例和負例占總記錄的比例。輸出屬性取值大于2的情況,公式是對稱的。
2 分別以Wind、Humidity、Outlook和Temperature作為根節點,計算其信息增益
可以數得,屬性Wind中取值為Weak的記錄有Normal的記錄有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
現在就可以計算出相應的信息增益了:
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為根節點。子節點重復上面的步驟。這顆樹可以是這樣的,它讀起來就跟你認為的那樣:
參考資料:
1.王厚峰,“機器學習‘課程講義,2007年春季學期,北京大學軟件與微電子學院
2.Mitchell,《機器學習》,曾華軍等譯,北京:機械工業出版社,2003
轉載: http://johnthu.spaces.live.com/blog/cns!2053CD511E6D5B1E!130.entry總結
以上是生活随笔為你收集整理的决策树的构造——一个手工例子的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据挖掘——我们能从股市数据得出什么,以
- 下一篇: PageRank行将过时 搜索引擎遭遇范