參考:《機器學習》Tom版 以及http://blog.csdn.net/v_july_v/article/details/7577684
一、簡介
決策樹是一個預測模型;他代表的是對象屬性與對象值之間的一種映射關係。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該分葉節點所經曆的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。 資料採礦中決策樹是一種經常要用到的技術,可以用於分析資料,同樣也可以用來作預測(就像上面的銀行官員用他來預測貸款風險)。
從資料產生決策樹的機器學習技術叫做決策樹學習, 通俗說就是決策樹。
一個決策樹包含三種類型的節點: 1.決策節點——通常用矩形框來表式 2.機會節點——通常用圓圈來表式 3.終結點——通常用三角形來表示
決策樹學習也是資料探勘中一個普通的方法。在這裡,每個決策樹都表述了一種樹型結構,它由它的分支來對該類型的對象依靠屬性進行分類。每個決策樹可以依靠對來源資料庫的分割進行資料測試。這個過程可以遞迴式的對樹進行修剪。 當不能再進行分割或一個單獨的類可以被應用於某一分支時,遞迴過程就完成了。另外,隨機森林分類器將許多決策樹結合起來以提升分類的正確率。
二、決策樹演算法
1.ID3演算法
ID3演算法是一個由Ross Quinlan發明的用於決策樹的演算法。這個演算法便是建立在上述所介紹的奧卡姆剃刀的基礎上:越是小型的決策樹越優於大的決策樹(be simple簡單理論)。儘管如此,該演算法也不是總是產生最小的樹形結構,而是一個啟發學習法演算法。
湯姆.米歇爾《機器學習》中對ID3演算法的描述:
ID3演算法思想描述:(個人總結 僅供參考)
a.對當前例子集合,計算屬性的資訊增益;
b.選擇資訊增益最大的屬性Ai(關於資訊增益後面會有詳細敘述)
c.把在Ai處取值相同的例子歸於同於子集,Ai取幾個值就得幾個子集
d.對依次對每種取值情況下的子集,遞迴調用建樹演算法,即返回a,
e.若子集只含有單個屬性,則分支為葉子節點,判斷其屬性值並標上相應的符號,然後返回調用處。
2.最佳分類屬性
判斷測試哪個屬性為最佳的分類屬性是ID3演算法的核心問題,那麼這裡就要介紹兩個比較重要的概念:資訊增益的度量標準:熵和資訊增益Gain(S,A)
以下為《機器學習》和援引處的內容 有修改
1)資訊增益的度量標準:熵
為了精確地定義資訊增益,我們先定義資訊理論中廣泛使用的一個度量標準,稱為熵(entropy),它刻畫了任意範例集的純度(purity)。給定包含關於某個目標概念的正反範例的範例集S,那麼S相對這個布爾型分類的熵為:
上述公式中,p+代表正範例,比如在本文開頭第二個例子中p+則意味著去打羽毛球,而p-則代表反範例,不去打球(在有關熵的所有計算中我們定義0log0為0)。
相關代碼實現:(代碼有些晦澀難懂,如欲詳加瞭解 請看:http://blog.csdn.net/yangliuy/article/details/7322015 裡面有ID3完整的代碼)
//根據具體屬性和值來計算熵 double ComputeEntropy(vector <vector <string> > remain_state, string attribute, string value,bool ifparent){ vector<int> count (2,0); unsigned int i,j; bool done_flag = false;//哨兵值 for(j = 1; j < MAXLEN; j++){ if(done_flag) break; if(!attribute_row[j].compare(attribute)){ for(i = 1; i < remain_state.size(); i++){ if((!ifparent&&!remain_state[i][j].compare(value)) || ifparent){//ifparent記錄是否算父節點 if(!remain_state[i][MAXLEN - 1].compare(yes)){ count[0]++; } else count[1]++; } } done_flag = true; } } if(count[0] == 0 || count[1] == 0 ) return 0;//全部是正執行個體或者負執行個體 //具體計算熵 根據[+count[0],-count[1]],log2為底通過換底公式換成自然數底數 double sum = count[0] + count[1]; double entropy = -count[0]/sum*log(count[0]/sum)/log(2.0) - count[1]/sum*log(count[1]/sum)/log(2.0); return entropy; }
舉例來說,假設S是一個關於布爾概念的有14個範例的集合,它包括9個正例和5個反例(我們採用記號[9+,5-]來概括這樣的資料範例),那麼S相對於這個布爾範例的熵為:
Entropy([9+,5-])=-(9/14)log2(9/14)-(5/14)log2(5/14)=0.940。
注意,如果S的所有成員屬於同一類,Entropy(S)=0,例如,如果所有的成員是正的(p+=1),那麼p-就是0,於是Entropy(S)=-1*log2(1)-(0)log2(0)=0; 另外S的正反範例數量相等,Entropy(S)=1;S的正反範例數量不等,熵介於0,1之間,如所示: 資訊理論中對熵的一種解釋,熵確定了要編碼集合S中任意成員的分類所需要的最少二進位位元。更一般地,如果目標屬性具有c個不同的值,那麼S相對於c個狀態的分類的熵定義為: 其中pi是S屬於類別i的比例,需要注意的是底數仍然為2,原因熵是以二進位位的個數來度量編碼長度,同時注意,如果目標屬性具有c個可能值,那麼熵最大可能為log2(c)。
2)資訊增益Gain(S,A)定義和資訊增益度量期望的熵降低 已經有了熵作為衡量訓練範例集合純度的標準,現在可以定義屬性分類訓練資料的效力的度量標準。這個標準被稱為“資訊增益(information gain)”。簡單的說,一個屬性的資訊增益就是由於使用這個屬性分割範例而導致的期望熵降低(或者說,樣本按照某屬性劃分時造成熵減少的期望,個人結合前面理解,總結為用來衡量給定的屬性區分訓練範例的能力)。更精確地講,一個屬性A相對範例集合S的資訊增益Gain(S,A)被定義為:其中 Values(A)是屬性A所有可能值的集合,Sv是S中屬性A的值為v的子集,注意上式第一項就是原集合S的熵,第二項是用A分類S後的熵的期望值,第二項描述的期望熵就是每個子集的熵的加權和,權值為屬性Sv的範例占原始範例S的比例|Sv|/|S|,所以Gain(S,A)是由於知道屬性A的值而導致的期望熵減少,換句話來講,Gain(S,A)是由於給定屬性A的值而得到的關於目標函數值的資訊。當對S的一個任意成員的目標值編碼時,Gain(S,A)的值是在知道屬性A的值後可以節省的二進位位元。 那麼綜上,我們就可以得出兩個基本公式:從中可以看出第一個Entropy(S)是熵定義,第二個則是資訊增益Gain(S,A)的定義,而Gain(S,A)由第一個Entropy(S)計算出下面仍然以《機器學習》一書中敘述的內容舉例 假定S是一套有關天氣的訓練範例,描述它的屬性包括可能是具有Weak和Strong兩個值的Wind。像前面一樣,假定S包含14個範例,[9+,5-]。在這14個範例中,假定正例中的6個和反例中的2個有Wind =Weak,其他的有Wind=Strong。由於按照屬性Wind分類14個範例得到的資訊增益可以計算如下。資訊增益正是ID3演算法增長樹的每一步中選取最佳屬性的度量標準(網上拷下可惜沒有清晰版) 計算了兩個不同屬性:濕度(humidity)和風力(wind)的資訊增益,以便決定對於訓練範例哪一個屬性更好
通過以上的計算,相對於目標,Humidity比Wind有更大的資訊增益
仍摘取自《機器學習》 是ID3第一步後形成的部分決策樹 其中經比較OutLook的資訊增益最大 選作root
中分支Overcast的所有範例都是正例,所以成為目標分類為Yes的葉結點。另兩個結點將被進一步展開,方法是按照新的範例子集選取資訊增益最高的屬性。
以上完整代碼參見http://blog.csdn.net/yangliuy/article/details/7322015
3.另一種決策樹演算法C4.5
這裡僅作簡單介紹
1)概覽:
由於ID3演算法在實際應用中存在一些問題,於是Quilan提出了C4.5演算法,嚴格上說C4.5隻能是ID3的一個改進演算法。
C4.5演算法繼承了ID3演算法的優點,並在以下幾方面對ID3演算法進行了改進:
- 用資訊增益率來選擇屬性,克服了用資訊增益選擇屬性時偏向選擇取值多的屬性的不足;有關資訊增益率的定義可以參考欒麗華和吉根林的論文《決策樹分類技術研究》1.2節。
- 在樹構造過程中進行剪枝;
- 能夠完成對連續屬性的離散化處理;
- 能夠對不完整資料進行處理。
C4.5演算法有如下優點:產生的分類規則易於理解,準確率較高。其缺點是:在構造樹的過程中,需要對資料集進行多次的順序掃描和排序,因而導致演算法的低效。此外,C4.5隻適合於能夠駐留於記憶體的資料集,當訓練集大得無法在記憶體容納時程式無法運行。
2)主要步驟:
a. 讀取檔案資訊,統計數目
b. 建立決策樹
-
- 如果樣本集為空白,則產生一個資訊數目都為0的樹節點返回
- 如果樣本均為同一類別,則產生一個葉子節點返回
- 計算節點正負樣本的數目
- 如果屬性值只有那個類別的屬性,則產生一個葉子節點,並賦實值型別索引
- 如果以上都不是,則選擇一個增益率最大的屬性(連續屬性要用增益率離散化),按那個屬性的取值情況從新定義樣本集和屬性集,建造相關子樹
c. 事後剪枝(採用悲觀錯誤率估算)
d. 輸出決策樹
e. 移除決策時
主要重點有:資訊增益率的計算、事後剪枝使用悲觀錯誤率衡量、樹的建造(分治思想)
資訊增益率的計算相關公式:
悲觀錯誤剪枝PEP演算法:(以下知識簡單引導一下 如需詳加瞭解 請閱覽相關剪枝演算法的書籍 ,筆者沒有對此作深入的研究,so不做細講)
所用來剪枝的度量的基本思想可以概述為以下幾點:
- 假設訓練資料集產生原始樹為T,某一葉子結點的執行個體個數為nt(t為右下標,以下同),其中錯誤分類的個數為et;
- 我們定義訓練資料集的誤差率如下公式所示:
由於訓練資料集既用來產生決策樹又用來修剪樹,所以是有偏倚的,利用它來修剪的決策樹樹並不是最精確,最好的;
- 為此,Quinlan在誤差估計度量中增加了連續性校正,將誤差率的公式修改為如下公式所示
- 那麼,同樣的,我們假設s為樹T的子樹的其中一個子節點,則該子樹的葉子結點的個數為ls ,Tt的分類誤差率如下公式所示:
在定量的分析中,為簡單起見,我們用誤差總數取代上面誤差率的表示,即有公式:
那麼,對於子樹Tt,它的分類誤差總數如下公式所示: