1. 程式人生 > >系統學習機器學習之決策樹

系統學習機器學習之決策樹

決策樹是一種實現分治策略的層次資料結構,它是一種有效的非引數學習方法,可以用於分類和迴歸。本節我們來簡單介紹決策樹的相關知識。
  • 什麼是決策樹
  • 單變數樹
  • 單變數分類樹
  • 剪枝
  • 由決策樹提取規則

一、什麼是決策樹

決策樹(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(土耳其),機械工業出版社

以下,引自:

一、簡介

決策樹是一個預測模型;他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。 資料探勘中決策樹是一種經常要用到的技術,可以用於分析資料,同樣也可以用來作預測(就像上面的銀行官員用他來預測貸款風險)。

從資料產生決策樹的機器學習技術叫做決策樹學習, 通俗說就是決策樹

一個決策樹包含三種類型的節點: 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)。

複製程式碼
//根據具體屬性和值來計算熵   
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的葉結點。另兩個結點將被進一步展開,方法是按照新的樣例子集選取資訊增益最高的屬性。

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,它的分類誤差總數如下公式所示: