1. 程式人生 > >第八章 決策樹演算法

第八章 決策樹演算法

1、什麼是決策樹?

        決策樹是一種類似於流程圖的樹結構。其中,每個內部結點(非樹葉結點)表示在一個屬性上的測試,每個分枝代表該測試的一個輸出,而每個樹葉結點存放一個類標號。樹的最頂層結點是節點。內部結點用矩形表示,而葉結點用橢圓表示。決策樹可以是二叉的,也可以是非二叉的(根據不同的決策樹演算法而定)。一棵典型的決策樹如下圖:


2、如何使用決策樹分類?

       給定一個類標號未知的元組X,在該決策樹上測試該元組的屬性值。跟蹤一條由根到葉結點的路徑,該葉結點就存放著該元組的類預測。

3、為什麼決策樹分類器如此流行?

     (1)決策樹分類器的構造不需要任何領域知識或引數設定,因此適合於探測式知識發現。

     (2)決策樹可以處理高維資料。

     (3)獲取的知識用樹的形式表示是直觀的,並且容易被人理解。

     (4)決策樹歸納的學習和分類步驟是簡單和快速的。

     (5)一般而言,決策樹分類器具有很好的準確率。

4、決策樹演算法

屬性選擇度量:是一種選擇分裂準則,把給定類標記的訓練元組的資料分割槽D“最好地”劃分成單獨類的啟發式方法。理想情況下,D劃分後的每個小分割槽都是純的(即落在一個給定分割槽的所有元組都屬於相同的類)。“最好的”分類準則是最接近這種情況的劃分。

        根據分裂屬性選擇度量的不同,決策樹的常見演算法有ID3(度量:資訊增益)、C4.5(度量:增益率)、CART(度量:基尼指數)。當然,決策樹演算法之間的差別也包括用於剪枝的機制等。

        它們都採用貪心(即非回溯)的方法,其中決策樹以自頂向下遞迴的分治法構造。大多數決策樹演算法都沿用這種自頂向下方法,從訓練元組集和它們相關聯的類標號開始構造決策樹。隨著樹的構建,訓練集遞迴地劃分成較小的子集。這些子集分佈在第一個決策點的所有分支上。如果某個分支下的資料屬於同一型別,則當前已經正確地劃分資料分類,無需進一步對資料集進行分割。如果資料子集內的資料不屬於同一型別,則需要重複劃分資料子集的過程。如何劃分資料子集的演算法和劃分原始資料集的方法相同,直到所有具有相同型別的資料均在一個數據子集內。

        基本決策樹演算法概括在下圖中:


圖  由訓練元組歸納決策樹的基本演算法

       遞迴的終止條件是:程式遍歷完所有劃分資料集的屬性,或者每個分支下的所有例項都具有相同的分類。

4.1  ID3演算法(資訊增益

        ID3演算法(Iterative Dichotomiser3   迭代的二分器3代)是一位機器學習研究人員J.Ross Quinlan開發的決策樹演算法。

        ID3演算法的核心思想:以資訊增益作為屬性選擇度量(該度量基於夏農在研究訊息的值或“資訊內容”的資訊理論方面的先驅工作),選擇分裂後資訊增益最大的屬性進行分裂。該演算法採用自頂向下的貪婪搜尋遍歷可能的決策樹空間。

        思想

       (1)自頂向下的貪婪搜尋遍歷可能的決策樹空間構造決策樹

       (2)從“哪一個屬性將在樹的根節點被測試”開始;

       (3)使用統計測試來確定每一個例項屬性單獨分類訓練樣例的能力,分類能力最好的屬性作為樹的根結點測試。

       (4)然後為根結點屬性的每個可能值產生一個分支,並把訓練樣例排列到適當的分支(也就是說,樣例的該屬性值對應的分支)之下。

       (5)重複這個過程,用每個分支結點關聯的訓練樣例來選取在該點被測試的最佳屬性。

          資訊增益:原來的資訊需求(僅基於類比例)與新的資訊需求(對屬性A劃分後)之間的差。

                            

                 Gain(A)告訴我們通過屬性A上的劃分我們得到了多少。選擇具有最高增益Gain(A)的屬性A作為分裂屬性。這等價於在“能做最佳分類”的屬性A上劃分,使得完成 元組分類還需要的資訊最小(即最小化InfoA(D))

          對D中的元組分類所需的期望資訊由下式給出:

                           

          其中,pi是D中任意元組屬於類Ci的非零概率,Info(D)又稱為D的

          離散屬性A(具有v個不同的觀測值)對D進行屬性劃分後所需要的期望資訊:    

                               

           需要的期望資訊越小,分割槽的純度越高。

           例子

顧客資料庫標記類的訓練元組


                首先,計算對D中元組分類所需要的期望資訊:

                                 

               下一步,需要計算每個屬性的期望資訊需求(先計算屬性age)。

                                

                                

                類似地,可以計算Gain(income)=0.029位   Gain(student)=0.151位   Gain(credit_rating)=0.048位。

                由於age在屬性中具有最高的資訊增益,所以它被選作分裂屬性。並且每個屬性值生長出一個分枝,然後元組據此劃分。

                其中,落在分割槽age=“middle_age”的元組都屬於相同的類。由於它們都屬於類“yes”,所以要在該分枝的端點建立一個樹葉,並用“yes”標記。 演算法返回的最終決策樹   如下圖:


                     這個決策樹只是一個屬性分裂後的決策樹,還需在每個分枝上遞迴地進行屬性分裂(比如,在youth這個分枝上的剩下元組中,可以對student屬性進行分裂,因為這樣分類後資訊增益最大,student是no(yes),class是no(yes))。

       上面我們說的分裂屬性都是離散值的,如果是連續值的我們怎麼計算它們的資訊增益呢?

        假設屬性A是連續值的,而不是離散值的(例如,假定有屬性age的原始值,而不是該屬性的離散化版本。)對於這種情況,必須確定A的“最佳”分裂點,其中分裂點是A上的閾值。

        首先,將A的值按遞增序排序。典型地,每對相鄰值的中點被看作可能的分裂點。這樣,給定A的v個值,則需要計算v-1個可能的劃分。對於A的每個可能的分裂點,計算Info(D),其中分割槽的個數為2,A具有最小期望資訊需求的點選作A的分裂點。D1是滿足A<=split_poin的元組集合,而D2是滿足A>split_poin的元組集合。這樣的話,就轉換成離散屬性的計算了。

        在此,順便介紹一下,根據屬性分裂準則劃分元組的三種可能性:

 


4.2  C4.5演算法(增益率

        ID3的缺點:資訊增益度量偏向具有許多輸出的測試。換句話說,它傾向於選擇具有大量值的屬性。例如,考慮充當唯一識別符號的屬性,如product_ID。在product_ID的劃分將導致大量分割槽(與值一樣多),每個只包含一個元組。由於每個分割槽都是純的,所以基於該劃分對資料集D分類所需要的資訊為Infoproduct_ID(D)=0。因此,通過對該屬性的劃分得到的資訊增益最大。顯然,這種劃分對分類沒有用。C4.5的出現就是為了克服這種偏倚。

        C4.5:也是Quinlan提出來的,它是對ID3演算法的改進,這些改進包括處理數值屬性、缺失值、噪聲資料和由決策樹產生規則的方法。

        C4.5採用增益率作為屬性選擇度量,增益率定義為:

                                             

                 選擇具有最大增益率的屬性作為分裂屬性。然而需要注意的是,隨著劃分資訊趨向於0,該比率變得不穩定。為了避免這種情況,增加一個約束:選取的測試的資訊增益必須較大,至少與考察的所有測試的平均增益一樣大。比如我們可以先計算每個屬性的增益,然後僅對那些增益高過平均值的屬性應用增益率測試。

         其中,分裂資訊度量被定義為(分裂資訊用來衡量屬性分裂資料的廣度和均勻):

                                             

         例子

         事務資料庫中屬性income的增益率的計算:

                                             

                                              

4.3  CART演算法(基尼指數

        CART分類和迴歸樹(ClassificationAnd Regression Tree)演算法由Breiman等人於1984年提出的。它是以二叉樹的形式給出,易於理解、使用和解釋。如果目標變數是離散的,則該樹為分類樹(classification tree),而對於連續數值目標變數,則該樹稱為迴歸樹(regression tree)。

        Gini指數:是一種不等性度量,由義大利統計學家Corrado Gini提出,並於1912年發表在他的文章“Variabilita e mutabilita”中。它通常用來度量收入不平衡,但是它可以用來度量任何不均勻分佈。Gini指數是一個0—1之間的數。其中0對應於完全相等(其中每個人都具有相同的收入),而1對應於完全不相等(其中一個人具有所有收入,而其他人收入都為零)。

         基尼指數度量資料分割槽或訓練元組集D的不純度,定義為:

                                            

其中pi是D中元組屬於Ci類的概率,對m個類計算和。

         基尼指數考慮每個屬性的二元劃分。

      (1)首先考慮A是離散值屬性的情況,其中A具有v個不同值出現在D中。如果A具有v個可能的值,則存在2v個可能的子集。例如,如果income具有3個可能的值{low,medium,high},則可能的子集具有8個。不考慮冪集({ low,medium,high})和空集({ }),因為從概念上講,它不代表任何分裂。因此,基於A的二元劃分,存在2v -2中形成資料集D的兩個分割槽的可能方法。

當考慮二元劃分裂時,計算每個結果分割槽的不純度的加權和。例如,如果A的二元劃分將D劃分成D1和D2,則給定該劃分,D的基尼指數

                                               

選擇該屬性產生最小基尼指數的子集作為它的分裂子集。

      (2)對於連續值屬性,其策略類似於上面介紹的資訊增益所使用的策略。

                對於離散或連續值屬性A的二元劃分導致的不純度降低

                                                

                最大化不純度降低(或等價地,具有最小基尼指數)的屬性選為分裂屬性。該屬性和它的分裂子集(對於離散值的分裂屬性)或分裂點(對於連續值的分裂屬性)一起         形成分裂準則。

        例子

        繼續使用“顧客資料庫”進行介紹。

      (1計算D的不純度:

                                              

      (2為了找出D中元組的分裂準則,需要計算每個屬性的基尼指數。從屬性income開始,並考慮每個可能的分裂子集。考慮子集{low,medium},基於該劃分計算出的基尼指數為:

                                             

        類似地,其餘子集劃分的基尼指數值是:0.458(子集{low,high}和{medium})和0.450(子集{medium,high}和{low})。因此,屬性income的最好劃分在{low,medium}(或{high}) 上,因為它最小化基尼指數。

       評估屬性age,得到{youth,senior}(或{middle_aged})為age的最好劃分,具有基尼指數0.357;

       屬性studentcredit_rating都是二元的,分別具有基尼指數值0.367和0.429。

      (3屬性age和分裂子集{youth,senior}產生最小的基尼指數。二元劃分“age屬於{youth,senior}?”導致D中元組的不純度降低最大,並返回作為分裂準則。從它生長出兩個分枝,並且相應地劃分元組。

5、決策樹演算法之間的比較

       資訊增益偏向於多值屬性。儘管增益率調整了這種偏倚,但是它傾向於產生不平衡的劃分,其中一個分割槽比其他分割槽小得多。基尼指數偏向於多值屬性,並且當類的數量很大時會有困難。它還傾向於導致相等大小的分割槽和純度。儘管是有偏的,但是這些度量在實踐中產生相當好的結果。

6、樹剪枝

        決策樹為什麼要剪枝?

        原因是避免決策樹過擬合(Overfitting)樣本。前面的演算法生成的決策樹非常詳細並且龐大,每個屬性都被詳細地加以考慮,決策樹的樹葉節點所覆蓋的訓練樣本都是“純”的。因此用這個決策樹來對訓練樣本進行分類的話,你會發現對於訓練樣本而言,這個樹表現完好,誤差率極低且能夠正確得對訓練樣本集中的樣本進行分類。訓練樣本中的錯誤資料也會被決策樹學習,成為決策樹的部分,但是對於測試資料的表現就沒有想象的那麼好,或者極差,這就是所謂的過擬合(Overfitting)問題。

        “如何進行剪枝?”有兩種常用的剪枝方法:先剪枝和後剪枝

        先剪枝:通過提前停止樹的構建(例如,通過決定在給定的節點不再分裂或劃分訓練元組的子集)而對樹“剪枝”。一旦停止,結點就成為樹葉。該樹葉可以持有子集元組中最頻繁的類,或這些元組的概率分佈。

        在構造樹時,可以使用諸如統計顯著性、資訊增益、基尼指數等度量來評估劃分的優劣。如果劃分一個結點的元組導致低於預定義閾值的劃分,則給定子集的進一步劃分將停止。然而,選取一個適當的閾值是困難的。高閾值可能導致過分簡化的樹,而低閾值可能使得樹的簡化太少。

         例子:限定樹的最大生長高度為3

                                                                   

        後剪枝:它由“完全生長”的樹剪去子樹。通過刪除節點的分枝並用樹葉替換它而剪掉給定結點上的子樹。該樹葉的類標號用子樹中最頻繁的類標記。

        例子:

                                                                     

        決策樹演算法用的是什麼剪枝?

        CART使用的是:代價複雜度(後剪枝方法的一種例項)剪枝演算法。

       該方法把樹的複雜度看作樹中樹葉結點的個數和樹的錯誤率的函式(其中,錯誤率是樹誤分類的元組所佔的百分比)。它從樹的底部開始。對於每個內部結點N,計算N的子樹的代價複雜度和該子樹剪枝後N的子樹(即用一個樹葉節點替換)的代價複雜度,比較這兩個值。如果剪去結點N的子樹導致較小的代價複雜度,則剪掉該子樹;否則,保留該子樹。

        C4.5使用的是:悲觀剪枝。它類似於代價複雜度方法,因為它也使用錯誤率評估,對子樹剪枝做出決定。

        剪枝後還可能存在什麼困擾?

        另外,對於組合方法,先剪枝和後剪枝可以交叉使用。後剪枝所需要的計算比先剪枝多,但是通常產生更可靠的樹。

       儘管剪枝後的樹一般比未剪枝的樹更緊湊,但是他們仍然可能很大、很複雜。決策樹可能受到重複複製的困擾,使得他們很難解釋。

       沿著一條給定的分枝反覆測試一個屬性時就會出現重複。複製是樹中存在重複的子樹。這些情況影響了決策樹的準確率和可解釋性。

       解決辦法:(1)使用多元劃分(基於組合屬性的劃分)(2)使用不同形式的知識表示(如規則),而不是決策樹。




        更多關於剪枝的內容(特別是代價複雜度剪枝和悲觀剪枝),可以參考文獻:

        決策樹分類及剪枝演算法研究_張宇(哈爾濱理工大學)

        決策樹學習及其剪枝演算法研究_王黎明(武漢理工大學)

7、可伸縮性與決策樹歸納(後期續寫