1. 程式人生 > >決策樹(ID3,C4.5,CART)原理以及實現

決策樹(ID3,C4.5,CART)原理以及實現

決策樹

決策樹是一種基本的分類和迴歸方法.決策樹顧名思義,模型可以表示為樹型結構,可以認為是if-then的集合,也可以認為是定義在特徵空間與類空間上的條件概率分佈.

[圖片上傳失敗...(image-2e6565-1543139272117)]

決策樹的中間節點可以看做是對一種特徵的判斷,也是符合上一次判斷特徵某種取值的資料集,根節點代表所有資料集;葉子節點看做是判斷所屬的類別.

決策樹學習通常包括3個步驟: 特徵選擇. 決策樹生成和決策樹剪枝.

目前常用的決策樹演算法有ID3, C4.5 和CART.

特徵選擇

在資料集中的所有特徵列表中,選擇分類效果最好的特徵,或者說讓分類效果儘可能的"純",通俗的說就是讓劃分的每個結果的儘可能屬於同一個類別,都是自己人. 那麼, 分類效果最好,或者說純度,怎麼定義? 用什麼衡量特徵的分類效果呢? 不同的決策樹演算法採用不同的衡量指標.比如說,ID3採用資訊增益,C4.5採用資訊增益比率,CART分類迴歸樹當用於分類時,採用Gini指數,用於迴歸問題時採用均方差差

[計算劃分之前的均方差,劃分之後的均方差,再做差運算]. 無論是哪種指標,本質上,都是比較用特徵劃分前後兩種狀態之間的差異變化,變化越明顯越好,而各種指標是對這種差異變化的量化. 但是不同的指標會有不同的傾向性,這種傾向性從指標計算公式上可以發現,而傾向性又會引出不同的問題,進而產生不同的優化方法.

另一方面,最佳的特徵的選擇,總是需要對所有特徵進行一次遍歷,分別計算每種特徵的劃分效果,比較求最優特徵的最佳特徵劃分值.

資訊增益

計算資訊增益之前,需要先引出資訊熵的概念.熵是資訊理論中的一個非常重要的概念,資訊熵的計算,對於一個數據集D,其中N中類別的第k類樣本所佔比例為pk,則資料集D的資訊熵:

\(Ent(D)= -\sum_{k=1}^{N}p_k log_2 p_k\)

從資訊熵的計算公式可以知道,Ent(D)的取值範圍在[0, \(log_2n\)], 最小,或者說節點最純時[都是同一個類別],為0;最大,最混亂時[每種類別比例都相等],為\(log_2n\).

知道了資訊熵的計算公式,那麼劃分前,計算資料集的資訊熵, 依據特徵f的n種取值劃分後的n個節點,分別計算資訊熵,然後依據各個節點資料集的比率,加權平均,計算劃分後的總的資訊熵,前後兩次做差,得到這次劃分的資訊增益,用來衡量特徵f的劃分效果如何.

資訊增益:
資訊增益表示得知特徵f的資訊而使得類Y的資訊的不確定性較少的程度.

\(Gain(D,f) = Ent(D) - \sum_{i=1}^{n} \frac{|D_i|}{|D|}Ent(D_i)\)

資訊增益越大,特徵劃分效果越好. 資訊增益指標,趨向於選擇取值數目多的特徵.[個人觀點:特徵取值越多,劃分到每個子節點的資料越少,一定程度上,純度越高,混亂程度越低,熵取值越小,進而,資訊增益越大.比如說,ID特徵,因為ID是唯一的,所有劃分到每個ID取值節點上也就一個數據點,純度100%,熵為0.]

資訊增益比率

\(GainRatio(D,f)=\frac{Gain(D,f)}{IV(f)}\)

其中,
\(IV(f) = -\sum_{v=1}^{V}\frac{|D_v|}{|D|}log_2\frac{|D_v|}{|D|}\)

\(D_v\)表示特徵f取值為v的資料子集.

因為資訊增益會傾向於選擇特徵取值多的特徵,所以,我們對多取值特徵進行懲罰,除以特徵f的固有值[或者說特徵f的資訊熵,f的資訊熵越大,相應f的取值情況越多,懲罰力度越大].

Gini指數

假設資料集D有K個類,樣本點屬於第k類的概率為pk,則概率分佈的基尼指數定義為:

\(Gini(D)=\sum_{k=1}^Kp_k(1-p_k) =1 - \sum_{k=1}^Kp_k^2\)

知道了gini指數的計算公式,計算劃分前的gini指數,劃分後,計算各個節點的gini指數值,然後根據劃分後子節點的資料比例進行加權求和,得到劃分後的總gini指數,最後對兩次結果做差,得到特徵f的劃分效果, 差值越大,分類效果越好.

均方差MSE[和,不平均]

和分類時相似,計算劃分前節點的均方差,劃分後計運算元節點的均方差,依據資料比例加權平均,再計算兩次結果差值,差值越大越好.

MAE也可以用作特徵選擇指標,和MSE類似.

決策樹生成

決策樹本質上也是一棵樹,所以符合資料結構中樹的一般性構造過程,也就是遞迴.

既然是遞迴構建過程,首先要明白的是遞迴終止條件,否則就會陷入死迴圈.那麼決策樹的終止條件是什麼呢?決策樹中符合終止條件時,停止繼續劃分,生成葉節點.

如果是分類樹:

  1. 如果節點資料全是同一類別,停止遞迴[沒有必要了,都是自己人];
  2. 如果特徵列表為空,停止遞迴[在分類問題中,一般情況下,每種劃分特徵只會用一次,用完就扔了---負心漢];
  3. 如果所有樣本在所有特徵上取值都相同,停止遞迴[特徵沒用,不具有區分度---所有特徵上取值都相同,千篇一律]

如果是迴歸樹,迴歸樹通常會設定自定義的引數,比如均方差變化最小值,每個節點容忍的最小樣本數,相應的條件:

  1. 均方差變化太小[小於預定義的閾值];
  2. 劃分後節點的樣本量太少[小於預定義的閾值,比如只有2,3個,小貓兩三隻沒有必要繼續劃分了];
[終止條件]檢測資料集中的每個子項是否屬於同一分類,or 特徵集為空:

    If so:  return  類標籤

    Else:
        尋找劃分資料集的最好特徵(--基於資訊增益)
        劃分資料集
        建立分支結點
            for    每個劃分的子集
                呼叫自己,並增加返回結果到分支結點中

        return    分支結點

上面虛擬碼中存在一個問題, 類標籤怎麼確定?
如果葉子節點都屬於同一類別,那麼給定所屬類別即可;如果葉子節點資料屬於不同的類別,大家進行投票決定,服從多數人的利益[少數服從多數].

樹剪枝

因為在決策樹的構建過程中,可能會存在過擬合現象,或者說決策樹深度太深,太過於複雜;因此,我們可以對決策樹進行剪枝處理.剪枝又分為預剪枝和後剪枝.

預剪枝是指在決策樹生成過程中,對每個節點在劃分前先進行估計,如果當前的劃分不能帶來決策樹泛化效能的提升[泛化效能可以用錯誤率,或者說均方差衡量],則停止劃分將當前節點標記為葉節點.

後剪枝過程是一個不斷嘗試的過程:找到葉子節點,嘗試合併[將葉子節點的雙親變成葉子節點],比較合併前後的變化效果.變化效果需要定量分析,這個資料量指標分類問題可以使用錯誤率,迴歸樹可以使用均方差, 而指標的計算需要資料,因此我們需要一定的測試資料,然後使用測試資料在已經生成的決策樹上進行不斷測試,假如合併後比合並前效果好,分類問題上就是錯誤率降低了,迴歸問題上均方差減少了,我們就進行合併處理[或者說是剪枝處理].

其他問題

決策樹使用範圍,或者說對資料集的要求: 標稱資料或數值型資料.本質上,決策樹只適用於標稱型資料[也就是離散資料],但如果是連續資料[在特徵取值上連續],我們需要進行離散處理.不同型別的決策樹處理問題不同,有的決策樹需要對資料進行預先離散化處理;但有的決策樹本身可以處理連續資料.

決策樹在生成過程中會遇到各種各樣的問題.有資料集的問題,也有決策樹本身的問題,而決策樹本身也有自己的適用範圍,不可能適用於所有問題[一招鮮吃遍天impossible].比如說:

  • 連續資料: 離散化處理;
  • 空缺資料: 如果在某個特徵上資料存在空缺值,怎麼處理? 我們可以先將取特徵上非空的資料子集,當做非空資料處理,然後將特徵取值為空記錄按照子節點資料的比率劃分到所有子節點上.
  • etc.

具體問題具體分析,依據不同的任務,資料集的不同特點選擇適合的演算法模型.

程式碼實現

repository 歡迎fork,star.