大白話5分鐘帶你走進人工智慧-第二十四節決策樹系列之分裂流程和Gini係數評估(3)

LHBlog發表於2019-05-13

 第二十四節決策樹系列之分裂流程和Gini係數評估(3)

上一節中我們講解了決策樹的數學表達形式,本節的話我們講解決策樹的分裂流程以及分裂條件的評估。我們基於決策樹的遞迴表示式上:

                                    $G(\mathbf{x})=\sum_{c=1}^{C}[b(\mathbf{x})=c] \cdot G_{c}(\mathbf{x})$

就可以知道訓練一顆決策樹需要哪些條件?臺灣大學林軒田教授給我們一個總結。

       我們翻譯一下上面的話,if termination critertion met  return base hyponthesi gt(x)。如果我們遇到終止條件,就返回基礎的gt(x)的表示式。else 1、learn branching criteria b(x) ,學習bx的表示式。 2、將原始的資料集分成C份,將資料集分到各個子樹裡面。3、建立子樹的Gc表示式。4、返回最後表達結果。

       所以決策樹從迭代考慮分裂的話我們需要4個條件: 1、分支個數(number of branches)即每次分裂要分成幾支。 2、分支條件(branching criteria),當前分支判斷的條件。 3、終止條件(termination criteria),不可能一直分下去,要有個終止條件。 4、基本演算法(base hypothesis),葉子結點到底如何表達。四個問題搞明白了,如何得到一棵決策樹我們就明白了。

我們的目標是通過大量的資料生成一棵非常好的樹,用這棵樹來預測新來的資料。好就是一定要能反映客觀規律,在大數定理的理論支援下,如果收集的訓練集足夠龐大,訓練集就一定程度上能夠反映客觀規律。然後我們用生成好的樹來預測新來的資料,舉個例子來解釋下如何生成決策樹的4個條件?假如訓練集上有100條資料,首先所有的資料都在根節點裡面出現。我們要給它分到各個子樹裡面,那麼每次分裂要分成幾份?這是第一個問題;假如分成兩份的情況下,以什麼條件來分份?什麼分裂條件最好,一定是通過實際的計算,遍歷所有的分裂條件,得到某種分裂條件下某種評分形式最高,就用什麼作為分裂條件。所以第二個問題是以什麼條件來分份。但什麼時候停止分裂呢?資料不斷分裂的遞迴過程,每一次分裂,儘可能讓類別一樣的資料在樹的一邊,當樹的葉子節點的資料都是一類的時候,則停止分類(if else語句)。這是第三個問題。分好的葉子節點裡有yes和no兩種表達,當新資料過來落到這些葉子結點上到底是yes還是no?這是第四個問題。

假如現在有30個正例30個負例如圖,哪種分法更好?為什麼不直接給它30正例,30負例分好就可以?

因為分裂條件不能用到y上的資訊,如果訓練的時候把y用了,但是預測的時候沒有y,拿不到y的資料。所以分裂只能讓它通過x來分。既然只能通過x來分,無疑第二種更好,因為第二個裡面每一個節點裡面,無論是左邊包含大部分的正例的節點還是右邊包含大部分負例的節點,夾雜其他類別的都很少,所以分出來的純度很高。因為它可以通過更少的分裂次數,達到一個比較好的效果, 所以這就引出了我們希望選擇一個分裂條件,要用這種分裂條件分裂出來的兩個節點,各自內部的純度越高越好。 那麼我們就需要一個量化評估的方式來評估什麼是純度?這是我們生成一顆決策樹需要解決的其中的一個問題。

所以接下來我們的文章會圍繞著以下生成一顆決策樹的幾點考慮進行展開。

1、第一個將原始資料集篩選.分類成子資料集的分類依據? 也就是需要計算分類後的純度。

2、第二個對生成的子資料集不斷分類 直到停止。那什麼時候會停止,也就是停止的條件是什麼?

3、第三個只要停止了之後,你現在得到的是一個包含著若干資料點的一個節點,但是節點到底是Y還是N,或者多分類情況的時候是1還是2還是3還是4,也需要通過落在最終葉子節點上的訓練集上的資料的共性來代表這個節點。假如這個節點分出來的全都是正例,那麼將來也得說,它判斷出來為正例。如何定性的判斷它的共性?

本節的話我們講解第一個問題,純度的量化方式,即我們分裂條件的計算標準。常用的純度的計算方式有Gini係數,資訊增益,資訊增益率。而這三種計算方式所生成的樹分別對應著,CART樹,ID3樹,C4.5樹。對於CART樹和ID3這兩個樹來講,它的預設分兩支,永遠只分兩支,它是一個二叉樹。對C4.5來說,它可以分若干個節點。CART意思是Classification and Regression Trees,分類與迴歸樹, 既可以處理分類問題,又可以處理迴歸問題。

我們說下第一種定量的計算純度的方式,基尼係數。公式如下:

                                                            $\operatorname{Gini}(D)=1-\sum_{i=1}^{n} p_{i}^{2}$

          pi代表各個類別的概率,對於離散的情況來說,通常我們認為在資料量足夠大的情況下,頻率可以近似等於概率。假設有10000條資料,其中有2000條是正例,8000條是負例,在不知道任何資訊的情況下,拿一條新的資料,就判斷屬於正例的概率是多少,只有估計20%是最合理的。有可能估計錯,但只有這麼估計是最合理的。因為概率永遠在小資料集上沒有意義,拿了一條資料,說它概率是20%正例80%負例沒有任何意義,因為有可能估計錯;但一下拿來10萬條資料,它最終在統計上會趨近於有20%的資料變成正例,80%資料變成負例。概率在大資料量上才有它的意義。我們這裡通過一個節點內各個label樣本的佔比(即頻率)近似這裡的各個類別的pi概率,所以從這裡能看出決策樹是有監督學習。因為是通過樣本的label,得到各個類別的比例。所以訓練的時候有人說用到y,是用在計算基尼係數上了,而不是用來作為分裂條件的。

         i代表著當前節點包含幾種可能性,對分類來說,也就是所有的類別佔比。

我們所謂統計純度就是統計某一個節點內部的純度。舉個例子說明下,假如一個節點有2000個正例,8000個負例,也就是正負0.8:0.2的比例,在這種情況下,p(i)有幾種可能?兩種。一個是p(Y)即0.2,一個是p(N)即0.8。根據公式,這時這個節點內部的基尼係數是1-(0.2^2+0.8^2)。假如一個節點內全部是正例的話,正負比例為1:0,此時基尼係數等於0;最純不過。假如比例是0.5:0.5 ,此時基尼係數等於0.5。所以我們可以總結出基尼係數用來評估純度時,數值 越低代表著越純。

因此現在就有一個工具,可以定性的去計算,這個節點裡邊純還是不純,可以一定程度上通過基尼係數來判斷。這是判斷一個節點純還是不純,而每次的分裂不僅僅分列出一個節點,怎麼評估這次分裂的好壞呢?比如下面例子:

                 從D分到D1,D2。怎麼綜合的看這一次分裂到底好不好呢?用D1或者D2,還是兩者都要用。實際上是把兩者結合起來再實現加權平均。公式如下:

                假如原始資料有100條,分到左節點94條,右節點6條。假設左邊基尼係數是0.5,右邊基尼係數是0。

             此次的分裂效果能直接說(0.5+0)/2嗎,實際上是不公平的。因為0.5是說明這94條資料分的純度,而0是這6條資料分的純度,說明這6條很純。所以我們需要把左節點和右節點個數的佔比作為權重加權平均作為本次分裂的評判標準。有了上述評判標準,我們再回到我們所說的對於一個資料集的分裂過程。對於一個資料集來說,我們需要遍歷所有的維度去分裂,怎麼遍歷每個維度?假設資料集有6個維度如下:

 

假如這裡面維度的資料有兩種情況,連續性資料和離散型資料,那麼每個維度的分裂條件的取值該怎麼取呢?比如對於第一個維度x1有10000條資料,連續性資料,我們要做的首先是對這10000個資料進行排序,從大到小排列出來。然後依次的再每兩個資料中間取中位數作為分裂數值計算基尼得分。比如資料情況是1.88m,1.78m,1.68m,我們就要取(1.88+1.78)/2=1.83 ,然後大於1.83的放在左邊,小於1.83的放在右邊,計算下此時的基尼得分。然後再取(1.78+1.68)/2=1.73當做x1維度的分列條件,大於1.73的放在左邊,小於1.73的放在右邊,計算下此時基尼得分。假如有10000條資料,就會有9999個這種中位數,然後分別計算出它們的基尼係數。保留最小的那個基尼係數對應的數值就代表著用x1維度去分最好的分裂結果,假如此時通過x1計算的基尼係數是0.1。然後我們再遍歷x2,假如x2,是離散性資料呢?我們該怎麼選擇x2中的數值進行分裂呢?對於連續型資料我們可以進行排序,但是對於離散性資料,我們不能排序,實際上就變成排列組合了,假如有100個類別,第1個類別和剩下99個類別是一種分法,第1和第2個類別作為一個節點和剩下98個又是一種分法,第1和第3個作為一個節點和剩下98個又是一種分法,這樣的情況太多了。所以我們一般不這樣做,既然Cart樹是二分類資料,只能分兩個節點,所以我們就乾脆給它分兩類,第一種分裂情況是等於1類別和不等於1類別,第二種分裂情況是等於2類別和不等於2類別,然後依次遍歷所有這種情況計算下分別的基尼係數,求最小的那一個作為x2維度下分裂條件數值,這樣我們就得到x2作為分裂維度下所求得的基尼係數。假設是0.05,此時我們就不再用x1這個維度分裂了。然後再依次對x3,維度進行分裂。所以我們就是這樣依次試著每一個維度作為分裂條件,然後計算基尼係數,去得到最終最小的那個基尼係數所對應的維度的取值。當根節點分裂完兩個子樹之後,若是子節點不純,再依次進行上述方法再分即可。

通過基尼係數來選擇一個最好的分類標準,就是嘗試進行若干種分裂方式,哪種最後結果最好,純度最高,就選哪種,因為純度高代表著未來子樹會少分幾次。 

通常一棵樹要分多少層?如果不加限制的話,可能會分成幾百層,對於Cart樹來說,就會有一個致命的缺陷,它是按照計算純度來評價分裂好壞,如果不對它進行限制,讓它一直分裂純度會達到100%,最極端情況,每個葉子節點有一個資料,總能讓它分到純度最高,相當於就是記錄了一下。所以生成的樹通常會人為限制它的層數,不讓它太深。

下節的話我們講解另外兩種評估純度的計算方式。

 

相關文章