系统学习机器学习之决策树
決策樹是一種實現分治策略的層次數據結構,它是一種有效的非參數學習方法,可以用于分類和回歸。本節我們來簡單介紹決策樹的相關知識。
??? 什么是決策樹
??? 單變量樹
??? 單變量分類樹
??? 剪枝
??? 由決策樹提取規則
一、什么是決策樹
決策樹(decision tree)是一種用于監督學習 的層次模型,通過這種特殊的層次模型,局部區域可以通過少數幾步遞歸分裂確定。決策樹由一些內部決策節點和終端樹葉組成。所謂決策節點,即運行某個判斷/測試函數,來確定數據是否符合條件,從而進行選擇分支地輸出。樹葉節點一般用來存放最終不可再分的數據集合,一個決策節點可以分支出一個樹葉節點,也可以分支出一個新的決策節點,從而繼續遞歸分裂。一個簡單的決策樹模型如下:
其中C1、C2、C3表示數據集,也可以說是我們的分類,而菱形流程表示測試\判斷函數。每個測試函數的輸入可以是一個d-維向量。如果我們考慮的是一個數值數據,那么分支一般是兩分的,比如這里使用X1 > W10 對數據進行兩分,一般最好的情況下每次都可以講數據集二分,因此如果存在b個區域\類別,那么最好的情況可以通過對b求以2為底的對數次找到正確的區域,即LOG2(b)。
二、單變量樹
對于一個決策樹來說,如果輸入測試節點的數據是單維的,即只有一個變量,那么稱為單變量樹。如果使用的輸入維是離散的,取n個可能值之一,那么就對應一個n路劃分;如果是一個連續值,則對應一個兩分(binary split)。需要注意,每次測試節點進行的劃分都是兩兩正交的,即每次劃分都是獨立、不存在重復關聯。
樹歸納是指構造給定訓練樣本的樹,一般對于給定的訓練集,我們可以找到多個使用的決策樹,為了簡單考慮,我們一般最感興趣地是尋找其中最小的樹,樹的大小用樹的節點和決策節點數來衡量。但是尋找最小數是NP完全問題,所以我們只能使用基于啟發式的局部搜索過程,在合理的時間內得到合理的樹。
樹學習算法根本上是貪心算法,從包含全部訓練數據的根節點開始,每一步都選擇最佳劃分。依賴于所選取的屬性是離散還是連續的,每次都可以將訓練數據劃分成n個或兩個子集,然后對相應子集進行遞歸決策、劃分,直到不再需要劃分,此時就創建一個樹葉節點并標記。
三、單變量分類樹
對于單變量分類樹來說,劃分的優劣判斷標準是不純性度量(impurity measure) ,我們說一個劃分是純的,是說如果對于所有分支,劃分后選擇相同分支的所有實例都屬于相同的類。這里的意思說白了就是每個樹葉節點應當表示一個單純類的實例。
四、剪枝
一般如果到達一個節點的訓練實例樹小于訓練集的某個比例,比如5%,無論是否不純或是否有錯誤,該節點都不再進一步分裂。因為 基于過少實例的決策樹會導致方差太大,從而導致泛化誤差較大。這種在樹完全構造出來之前提前停止樹構造的方法稱作樹的先剪枝(prepruning)。
另一個得到較小樹的方法是后剪枝(postpruning) ,實踐中比先剪枝要好些。我們讓樹完全增站直到所有的樹葉都是純的并具有零訓練誤差。然后我們找出導致過分擬合的子樹并剪掉它們。方法是我們最初從數據集中暴力一個剪枝集,訓練階段不使用。我們用一個被子樹覆蓋的訓練實例標記的樹葉節點替換該子樹,如果該樹葉在剪枝集上的性能不比該子樹差,則剪掉該子樹并保留樹葉節點。
一般來說,先剪枝速度快,但是后剪枝更加準確。
五、由決策樹提取規則
決策樹可以提取特征,我們要做的是將每條路徑描述出來就可以了。我們可以方便地將樹的路徑轉換成IF-THEN規則。 比如對于下圖的一個關于員工信息對應工作效率的實例:
這樣我們可以描述每個分支,這里我們僅舉個簡單的例子:
R1: IF(age > 38.5) AND (years-in-job > 2.5) THEN y=0.8
可以看到,上面的IF-THEN規則描述了最左側的分支情況。這樣的規則庫可以提取知識。容易理解,并且使得領域專家可以通過驗證從數據學習得到的模型。
多變量樹的情況可以由單變量樹對輸入維度擴展得到。自從凱撒將一個復雜的“高盧人問題”分解成一組較簡單的問題以來,分治 一直作為一種啟發式方法頻繁使用。決策樹更多地用在監督式學習的分類問題,并且通常在使用復雜算法以前,可以先試驗決策樹,并將它的準確率作為性能基準。
Refer: 《機器學習導論》,Ethen Alpaydin(土耳其),機械工業出版社
以下,引自:
http://www.cnblogs.com/biyeymyhjob/archive/2012/07/23/2605208.html
一、簡介
決策樹是一個預測模型;他代表的是對象屬性與對象值之間的一種映射關系。樹中每個節點表示某個對象,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的對象的值。決策樹僅有單一輸出,若欲有復數輸出,可以建立獨立的決策樹以處理不同輸出。 數據挖掘中決策樹是一種經常要用到的技術,可以用于分析數據,同樣也可以用來作預測(就像上面的銀行官員用他來預測貸款風險)。
從數據產生決策樹的機器學習技術叫做決策樹學習, 通俗說就是決策樹。
一個決策樹包含三種類型的節點: 1.決策節點——通常用矩形框來表式 2.機會節點——通常用圓圈來表式 3.終結點——通常用三角形來表示 Decision-Tree-Elements.png
決策樹學習也是資料探勘中一個普通的方法。在這里,每個決策樹都表述了一種樹型結構,它由它的分支來對該類型的對象依靠屬性進行分類。每個決策樹可以依靠對源數據庫的分割進行數據測試。這個過程可以遞歸式的對樹進行修剪。 當不能再進行分割或一個單獨的類可以被應用于某一分支時,遞歸過程就完成了。另外,隨機森林分類器將許多決策樹結合起來以提升分類的正確率。
二、決策樹算法
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,它的分類誤差總數如下公式所示:
---------------------
作者:Eason.wxd
原文:https://blog.csdn.net/App_12062011/article/details/50351152
總結
以上是生活随笔為你收集整理的系统学习机器学习之决策树的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 系统学习机器学习之算法评估
- 下一篇: 系统学习机器学习之监督学习