文本分類,字面意思來說就是對文本進行分類。其實就是這樣,文本分類是根據文本所具有的一些特徵和屬性來將其判別爲事先確定的幾個類別的過程。常用的分類方法有樸素貝葉斯方法,K近鄰方法(KNN),支持向量機(SVM),決策樹方法,神經網絡方法等等。本文主要來介紹決策樹的一種實現。
通俗來說,決策樹分類的思想類似於找對象。現想象一個女孩的母親要給這個女孩介紹男朋友,於是有了下面的對話:
女兒:多大年紀了?
母親:26。
女兒:長的帥不帥?
母親:挺帥的。
女兒:收入高不?
母親:不算很高,中等情況。
女兒:是公務員不?
母親:是,在稅務局上班呢。
女兒:那好,我去見見。
這個女孩的決策過程就是典型的分類樹決策。相當於通過年齡、長相、收入和是否公務員對將男人分爲兩個類別:見和不見。假設這個女孩對男人的要求是:30歲以下、長相中等以上並且是高收入者或中等以上收入的公務員,那麼這個可以用下圖表示女孩的決策邏輯(聲明:此決策樹純屬爲了寫文章而YY的產物,沒有任何根據,也不代表任何女孩的擇偶傾向,請各位女同胞莫質問我^_^):
上圖完整表達了這個女孩決定是否見一個約會對象的策略,其中綠色節點表示判斷條件,橙色節點表示決策結果,箭頭表示在一個判斷條件在不同情況下的決策路徑,圖中紅色箭頭表示了上面例子中女孩的決策過程。
這幅圖基本可以算是一顆決策樹,說它“基本可以算”是因爲圖中的判定條件沒有量化,如收入高中低等等,還不能算是嚴格意義上的決策樹,如果將所有條件量化,則就變成真正的決策樹了。
決策樹方法的起源是概念學習系統CLS,然後發展到ID3方法,最後又演化爲能處理連續屬性的C5.0.有名的決策樹方法還有CART和Assistant。這裏我的實現方法是ID3。
ID3算法的思想是採用貪心的策略選取分類能力最好的一個屬性來,然後對於這個最佳屬性的每一個取值產生一個分支,對於每一個分支都將有屬於它的訓練樣例,重複前邊的過程來完成建樹。
ID3算法的僞代碼實現如下(摘自《機器學習》 米歇爾(Mitchell,T.M.) ):
ID3(Examples, Target_attribute, Attributes)
Examples即訓練樣例集。Target_attribute是這棵樹要預測的目標屬性。Attributes是除目標屬性外供學習到得決策樹測試的屬性列表。
返回一棵能正確分類給定Examples的決策樹
創建樹的Root節點
如果Examples 都爲正,那麼返回label = 的單節點樹Root
如果Examples 都爲反,那麼返回label = - 的單節點樹Root
如果Attributes爲空,那麼返回單節點樹Root, label=Examples中最普遍的Target_attributes值
否則開始
A <- Attributes中分類Examples能力最好的屬性
Root的決策屬性 <- A
對於A的每個可能值vi
在Root下加一個新的分支對應測試A = vi
令Examples vi爲Examples中滿足A屬性值爲vi的子集
如果Examples vi爲空
在這個新分支下加一個葉子結點,結點的label=Examples中最普遍的Target_attribute值
否則在這個新分支下加一個子樹ID3(Examples vi, Target_attribute, Attributes - {A})
結束
返回Root
看起來這個算法還是很簡單的,但是還有一個問題,如何選擇分類能力最好的一個屬性,這也是ID3算法要解決的核心問題。ID3算法使用統計學來實現的。
用一個例子來說明分類能力最好的屬性是如何產生的。
現在有一組數據,數據中包括天氣情況和某事是否去打網球的情況,如下。
outlook | temperature | humidity | windy | play |
sunny | hot | high | weak | no |
sunny | hot | high | strong | no |
overcast | hot | high | weak | yes |
rainy | mild | high | weak | yes |
rainy | cool | normal | weak | yes |
rainy | cool | normal | strong | no |
overcast | cool | normal | strong | yes |
sunny | mild | high | weak | no |
sunny | cool | normal | weak | yes |
rainy | mild | normal | weak | yes |
sunny | mild | normal | strong | yes |
overcast | mild | high | strong | yes |
overcast | hot | normal | weak | yes |
rainy | mild | high | strong |
no |
現在先來介紹一下熵,熵是信息論中廣泛使用的一個度量標準,它是來衡量一個隨機變量出現的數學期望,刻畫了任意樣例集的純度。給定包含關於某個目標概念的正反樣例的樣例集S,那麼S相對這個布爾型分類的熵爲:
比如上述數據的計算式爲:
Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940
已經有了熵作爲衡量訓練樣例集合純度的標準,現在可以定義屬性分類訓練數據的效力的度量標準。這個標準被稱爲信息增益。簡單的說,一個屬性的信息增益就是由於使用這個屬性分割樣例而導致的期望熵降低(或者說,樣本按照某屬性劃分時造成熵減少的期望)。更精確地講,一個屬性A相對樣例集合S的信息增益Gain(S,A)被定義爲:
其中 Values(A)是屬性A所有可能值的集合,是S中屬性A的值爲v的子集。換句話來講,Gain(S,A)是由於給定屬性A的值而得到的關於目標函數值的信息。當對S的一個任意成員的目標值編碼時,Gain(S,A)的值是在知道屬性A的值後可以節省的二進制位數。
爲什麼是二進制,很簡單,計算機中的數據就是以二進制的形式存儲的,信息量爲n的數據就可以用log2 (n) 位的二進制數來表示。
以上述信息中的wind屬性爲例,可以得到它的信息增益:
ID3算法基本上就已經介紹完了,對於上述數據我寫了一個實現,由於水平有限,可能有些地方還有錯誤或不足,如果有人發現,請留言,謝謝。
由於在這裏貼代碼效果不是很好,所以我放在的別的網站上, 鏈接:
①. http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html