參考:《機器學習》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。






通過以上的計算,相對於目標,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,它的分類誤差總數如下公式所示: