【機器學習速成寶典】模型篇06決策樹【ID3、C4.5、CART】(Python版)


目錄

  什么是決策樹(Decision Tree)

  特征選擇

  使用ID3算法生成決策樹

  使用C4.5算法生成決策樹

  使用CART算法生成決策樹

  預剪枝和后剪枝

  應用:遇到連續與缺失值怎么辦?

  多變量決策樹

  Python代碼(sklearn庫)


 

什么是決策樹(Decision Tree) 

  引例

  現有訓練集如下,請訓練一個決策樹模型,對未來的西瓜的優劣做預測。

 

  先不談建立決策樹模型的算法,我們先看一下基於“信息增益”(后面講)生成的決策樹的樣子

   一棵決策樹包含一個根節點、若干個內部節點、若干個葉節點。葉節點對應於決策結果,其他節點對應於一個屬性測試。每個節點包含的樣本集合根據屬性測試的結果被划分到子節點中。根節點(紋理)包含樣本全集,根節點下的節點(根蒂)包含所有紋理=清晰的樣本。從根節點到每個葉節點的路徑對應一個判定測試序列。決策樹的學習就是要產生一棵對新樣本預測正確率高的決策樹。

 

  李航《統計學習方法》中的介紹

  決策樹(decision tree)是一種基本的分類與回歸方法。決策樹模型呈樹形結構,在分類問題中,表示基於特征對實例進行分類的過程。它可以認為是if-then規則的集合,也可以認為是定義在特征空間與類空間上的條件概率分布。其主要優點是模型具有可讀性,分類速度快。學習時,利用訓練數據,根據損失函數最小化的原則建立決策樹模型。預測時,對新的數據,利用決策樹模型進行分類。決策樹學習通常包括3個步驟:特征選擇、決策樹的生成和決策樹的修剪。這些決策樹學習的思想主要來源於由Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法。

 

 返回目錄

 

特征選擇

  決策樹學習的關鍵在於:在每個節點上如何選擇最優划分屬性。

  在引例中,在根節點上,優先選擇了“紋理”作為划分屬性,這種選擇是有依據的。

  一般而言,隨着划分過程不斷進行,我們希望決策樹的分支節點所包含的樣本盡可能屬於同一類別,即節點的“純度”越來越高。因此我們要找一個指標,去衡量划分數據集后“純度提升的幅度”,然后選擇能讓“純度提升的幅度”最大的特征去划分數據集。

  常用的衡量“純度提升的幅度”的指標有:信息增益信息增益率基尼指數

  基於信息增益生成決策樹的算法,稱為ID3算法。

  基於信息增益率生成決策樹的算法,稱為C4.5算法。

  基於基尼指數生成決策樹的算法,稱為CART算法。

 

  二娃:為什么要在每個節點上都要費老大勁去選擇最優划分屬性呢?先看看我們有哪些特征(色澤、根蒂...觸感),按順序選唄?

  假設有一個訓練集,有4個特征A、B、C、D;標記={0,1}。我們發現:無論ABC取什么,標記都和D的取值一樣,也就是說,D是最主要的因素。如果用D作為划分特征的話,我們的決策樹將會十分精致(模型即簡單又准確);如果沒選D,那么遺憾了,模型可能會變得復雜(有過擬合的風險),還會額外增加計算量。

 返回目錄

 

使用ID3算法生成決策樹

  ID3算法是基於信息增益生成決策樹的算法。

  首先定義“信息熵”,它是度量樣本集合純度的一種指標。假定當前樣本集合D中第k類(k=1,2,...,|Y|)樣本所占的比例為pk,則D的信息熵定義為

  假設離散屬性a有V個可能的取值,若用a來對樣本集D進行划分,則會產生V個分支節點,其中第v個分支節點包含了D中所有在屬性a上取值為av的樣本,記為Dv。計算出Dv的信息熵,再考慮到不同的分支節點所包含的樣本數不同,給分支節點賦予權重,即樣本數越多的分支節點影響越大,於是可計算出用屬性a對樣本集D進行划分所獲得的“信息增益”:

  信息增益越大,則意味着用屬性a來進行划分所獲得的“純度提升的幅度”越大。以根節點為例,對屬性集A中的所有屬性(色澤、根蒂...觸感),分別計算信息增益,取來划分根節點數據集。

 

  下面,演示引例中決策樹形成的過程:

 

  第一步:

  顯然,|Y|=2。在決策樹開始學習是,根節點包含D中所有樣例,其中正例占p1=8/17,反例占p2=9/17。於是根節點的信息熵為:

  第二步:

  計算使用屬性集合{色澤,根蒂,敲聲......}中的哪個屬性進行數據集划分可以帶來最高的信息增益。

  先計算“色澤”:

  根據色澤可以將數據集D分為3個子集:

  D1包含{1,4,6,10,13,17}(正例p1=3/6,反例占p2=3/6)、D2包含{2,3,7,8,9,15}(正例p1=4/6,反例占p2=2/6)、D3包含{5,11,12,14,16}(正例p1=1/5,反例占p2=4/5).

  求每個節點的信息熵:

  計算使用“色澤”划分數據集后的信息增益:

  類似的,計算出使用其他屬性划分數據集后的信息增益:

 

  顯然,選擇“紋理”划分后信息增益最大,於是,通過“紋理”划分數據集,各分支節點包含樣例子集的情況是:

  第三步:

  在每個子節點上遞歸執行相同的算法,便可得到決策樹,如下:

 

 返回目錄

 

使用C4.5算法生成決策樹 

  實際上,信息增益准則對可取值數目較多的屬性有所偏好(這種偏好是不好的,他會妨礙我們在節點上找到最優的划分特征,最終導致建立的決策樹模型復雜、額外增加計算量。說到底就是這是基於“信息增益”選擇特征的缺陷),為減少這種偏好的影響,C4.5算法不直接采用信息增益,而是使用“信息增益率”來選擇最優划分特征。信息增益率定義為:

  需要注意的是:信息增益率對可取值數目較少的屬性有所偏好。

  因此,C4.5算法使用了一個啟發式:先選出信息增益高於平均水平的屬性,再從中選擇信息增益率最高的。

 返回目錄

 

使用CART算法生成決策樹 

  CART算法是基於“基尼指數”選擇最優划分屬性的,數據集D的純度可以用基尼值表示:

  直觀來說,Gini(D)反映了從數據集D中隨機抽取兩個樣本,其標記不一致的概率(表示隨機抽2個樣本,標記相同的概率)。因此,Gini(D)越小,則數據集的純度越高。選擇屬性a的基尼指數(基尼值減少程度)定義為

  於是,我們要選擇(基尼指數最小的特征)作為最優划分屬性。

 返回目錄

 

預剪枝和后剪枝

  剪枝是決策樹學習算法對付“過擬合”的主要手段。在決策樹學習中,為了盡可能正確分類訓練樣本,結點划分過程將不斷重復,有時會造成決策樹分支過多,這時就可能因訓練樣本學得“太好”了,以致於把訓練集自身的一些特點當作所有數據都具有的一般性質而導致過擬合。因此,可通過主動去掉一些分支來降低過擬合的風險。

  決策樹剪枝的基本策略有:“預剪枝”和“后剪枝”。

  預剪枝是指在決策樹生成過程中,對每個結點在划分前先進行估計,若當前結點的划分不能帶來決策樹准確率提升,則停止划分並將當前結點標記為葉結點;后剪枝則是先從訓練集生成一棵完整的決策樹,然后自底向上地對非葉結點進行考察,若將該結點對應的子樹替換為葉結點能帶來決策樹准確率提升,則將該子樹替換為葉節點。

  如何判斷決策樹准確率是否提升呢?可以使用性能評估的方法,如:留出法,即預留一部分數據用作“驗證集”以進行性能評估。

 

  假定這里使用信息增益准則生成如下決策樹:

(准確率為42.9%)

 

  先討論“預剪枝”:

  預剪枝是在建造決策樹的過程中執行的,如果發現某個節點划分后准確率沒有提高,就禁止划分。

  優點:預剪枝使得決策樹的分支都沒有“展開”,降低了過擬合的風險,減小了訓練時間。

  缺點:有欠擬合的風險。因為有些分支的當前划分雖不能提升准確率、甚至會暫時導致准確率下降,但是在其基礎上的后續划分卻有可能顯著提升准確率。

  (准確率為71.4%)

 

  再討論“后剪枝”:

  后剪枝先從訓練集生成一棵完成決策樹,然后慢慢砍樹,砍的位置:當前決策樹葉節點的父節點,砍的條件是:如果能提高准確率就砍。

  優點:欠擬合風險很小,准確率一般優於“預剪枝”決策樹。

  缺點:訓練時間長。

(准確率為71.4%)

 

  以上剪枝的過程引自周志華《機器學習》直觀易於理解;李航《統計學習方法》中的剪枝是通過定義一個損失函數,然后也是像“后剪枝”一樣,遞歸地從樹的葉節點向上回縮。

  兩人算法的不同點在於:李航的算法不是單單看准確率,而是同時權衡准確率和樹的復雜度兩個因素,並通過改變參數控制兩者的影響力。

  兩人算法的相同點在於:最終目的都是提升決策樹的泛化性能。

 返回目錄

 

應用:遇到連續與缺失值怎么辦? 

  先討論“連續”:

  之前討論的都是基於離散屬性來生成決策樹。當遇到連續屬性時,最簡單的策略是采用“二分法”對連續屬性進行處理。

  具體步驟是:先將連續屬性排序,假設有划分點t,基於t便可將D划分為兩部分。那么,連續屬性划分的關鍵就在於如何選划分點t,假設我們有排好序的序列:a1,a2,...,an,划分點可以從相鄰兩個元素的中位點組成的集合中選:,選擇的依據就是哪個划分點帶來的信息增益大,就選哪個划分點。

 

  假設數據集:

  在決策樹學習的開始,根節點包含17個訓練樣本,“含糖率”的候選划分點集合包含16個候選值:{0.049, 0.074, ... ,0.418},可以計算出使用划分點0.126時,信息增益最大,為:0.349。但是還是沒有競爭過,所以根節點的寶座還是要由“紋理”來坐。此后結點划分過程遞歸進行,最終基於信息增益准則生成的決策樹是:

  注意:與離散屬性不同,若當前結點划分屬性為連續屬性,該連續屬性還能作為其后代結點的划分屬性。例如在父節點使用了“密度≤0.381”,不會禁止在子節點上使用“密度≤0.294”

  

  再討論“缺失”:

  現實任務中常會遇到不完整樣本,即樣本的某些屬性值缺失。如果拋棄不完整的樣本,顯然是一種對數據信息的浪費。因此,要想辦法利用有缺失屬性值的訓練樣本。假設有以下數據集:

  我們需解決兩個問題:

  (1)如何在屬性缺失的情況下進行划分屬性的選擇?

  (2)給定划分屬性,若該樣本在該屬性上的值缺失,如何對樣本進行划分?

  給定數據集D和屬性a,令表示D中在屬性a上不缺失的樣本子集。

  對問題(1),假定屬性a有V個可取值,令表示 中在屬性a上取值為的樣本子集,表示中屬於第k類的樣本子集。假定為每個樣本x賦予一個權重,並定義

,完整性的比重

,第k類樣本占得比重

,在某屬性上取值為v的樣本占得比重

  因此,可以將信息增益的計算式推廣為:

 

  對問題(2),若樣本a 在划分屬性a 上的取值已知,則將a 划入與其取值對應的子結點,且樣本權值在子結點中保持為。若樣本a 在划分屬性a上的取值未知,則將a 同時划入所有子結點,且樣本權值在與屬性值 對應的子結點中調整為; 直觀地看,這就是讓同一個樣本以不同的概率划入到不同的子結點中去。

 

 返回目錄

 

多變量決策樹 

  通過一個例子來解釋,假設有訓練集:

 

  若使用單變量決策樹可以產生如下決策樹,決策邊界:

  單變量決策樹的決策邊界是與坐標軸垂直或水平的。因此會造成決策樹深度過高,模型較復雜。

 

  若使用多變量決策樹可以產生如下決策樹,決策邊界:

  多變量決策樹的決策邊界可以是斜的(利用了多個屬性的線性組合)。因此會造成決策樹深度變低,模型變簡單。

 

 

 返回目錄

 

Python代碼(sklearn庫) 

  待續...

 返回目錄

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM