用於分類的決策樹(Decision Tree)-ID3 C4.5


決策樹(Decision Tree)是一種基本的分類與回歸方法(ID3、C4.5和基於 Gini 的 CART 可用於分類,CART還可用於回歸)。決策樹在分類過程中,表示的是基於特征對實例進行划分,將其歸到不同的類別。決策樹的主要優點是模型可讀、易於理解、分類速度快、建模與預測速度快。本文主要介紹 Quinlan 在 1986 年提出的 ID3 算法與 1993 年提出的 C4.5 算法。下面首先對決策樹模型進行簡單介紹。

決策樹模型

決策樹是由樹節點與邊組成的,其節點有兩種類型,內部節點和葉節點,內部節點表示一個特征或者屬性,葉節點代表類別,如下如所示:

1

圖中可見根節點開始到葉節點的每條路徑構建一條規則,內部節點的特征對應着規則的條件。整棵樹滿足一個重要性質:每一個訓練數據實例都被一條唯一的路徑覆蓋。

決策樹的學習算法是做一個遞歸選擇最優特征的過程,用最優特征對訓練數據集進行分割,對分割后的兩個子數據集,選擇各自子數據集的最優特征繼續進行分割,如果某個子數據集已經能夠正確分類,則將該節點改為葉節點。否則一直遞歸尋找最優特征知道沒有合適特征為止。決策樹可能對訓練數據有很好的分類能力,對測試數據卻未必,這時可能是由於過度擬合訓練數據,而降低了其泛化性,可以通過剪枝操作合並過分細分的葉子節點,將數據歸並到父節點來增加其泛化性。所以可以看到決策樹生成過程對應着局部最優的特征選擇,而剪枝對應着對模型進行全局調優。

對決策樹模型有了初步認識之后,接下來將介紹決策樹的建模與剪枝過程,這里重點介紹 ID3 與 C4.5 ,這兩種形式的決策樹學習均包括三個步驟:1)特征選擇;2)決策樹的生成;3)減枝。接下來的段落圍繞這三部分展開。

特征選擇

特征選擇在於選取具有分類能力的特征,來提高決策樹的學習效率,通常選擇特征的標准為信息增益(ID3)與信息增益比(C4.5)。首先在這里引入一個(Entrop)的概念。

熵是表示隨機變量不確定性的度量,對於離散隨機變量 $X$ ,其概率分布為:

\[P(X = x_i) = p_i ,\ \ i = 1,2,…,n\]

根據熵的定義,得到隨機變量 $X$ 的熵為:

\[H(X) = – \sum_i p_i log p_i\]

這里約定若 $p_i = 0$ , 則有 $ p_i log p_i = 0  $,而且這里的 $log$ 通常以 $2$ 或者 $e$ 為底(本文默認以 $2$ 為底了 )。熵越大,隨機變量的不確定性就越大,下邊給一個示例,對於 $ X \sim Bernoulli(p) $,則下圖為 $H(X) = -plogp-(1-p)log(1-p)$ 隨 $p$ 變化的圖:

1

當 $p =0$ 或者 $p=1$ 時,$H(X) = 0$,隨機變量完全沒有不確定性,當 $p=0.5$ 時,熵達到最大,即不確定性達到最大。有了熵的定義,下面是繼而給出條件熵  $H(Y|X)$ 的定義,條件熵指的是在已知隨機變量 $X$ 條件下隨機變量 $Y$ 的不確定性,假設現在有 $P(X=x_i) = p_i$ ,則給定 $X$ 條件下 $Y$ 的條件熵定義如下:

\[H(Y|X) = \sum_i p_i H(Y|X=x_i)\]

有了以上兩個概念,接下來便可以定義信息增益(Information Gain)了,信息增益表示的是得知特征 $X$ 的取值情況下使得 $Y$ 的不確定性的減少程度。 現在回憶決策樹,是要在給定的特征集合中選擇對分類最有益的特征,如果用熵來衡量訓練的混亂程度,則選擇一個特征將訓練集分為幾個子集后,子集的混亂程度越小越好,混亂程度小正好對應了信息增益大,所以以 IG 作為特征選擇是十分自然的,IG 的定義如下:

特征 $A$ 對於給定訓練集合 $D$ 的信息增益 $IG(D,A)$ 為集合 $D$ 的熵與給定特征 $A$ 的條件下系統 $D$ 的條件熵 $H(D|A)$ 之差:

\[IG(D,A) = H(D) –H(D|A)\]

信息增益大的特征往往具有更強的分類能力, ID3 算法采用信息增益作為 特征選擇的標准,對於訓練數據集 $D$ ,$|D|$ 表示訓練樣本總數,數據共有 $K$ 個類別,  類別 $k$ 的樣本集合分別用 $C_k$ 表示 ,明顯有 $\sum_k |C_k| = |D|$ ,假設特征 $A$ 有 $n$ 個不同取值 分別為 $\left \{ a_1,a_2,...,a_n \right \}$ ,特征 $A$ 可以將 $D$ 划分為 $n$ 個子集 $D_1,D_2,…,D_n$, $|D_i|$ 為 $D_i$ 的樣本個數, 且有 $\sum_i|D_i| = |D|$ ,子集 $D_i$ 屬於類別 $C_k$ 的樣本集合為 $C_{ik}$  ,$C_{ik}$ 即為子集 $D_i$ 中屬於類別 $C_k$ 的 樣本集合:$C_{ik} = D_i \wedge C_k $ 。用 $|C_{ik}|$ 表示 $C_{ik}$ 集合樣本的個數,接下來可以把 ID3 中信息增益算法歸納如下:

輸入: 訓練數據集 $D$ 與 特征 $A$

輸出: 特征 $A$ 對訓練數據集 $D$ 的信息增益 $IG(D,A)$.

1)計算訓練集合 $D$ 的熵 $H(D)$:

\[H(D) = -\sum_k \frac{|C_k|}{|D|}log\frac{|C_k|}{|D|}\]

2)特征 $A$ 把 $D$ 划分為 $i$ 個子集,計算特征 $A$ 對數據集 $D$ 的條件熵 $H(D|A)$:

\[H(D|A) = -\sum_i \frac{|D_i|}{|D|} \sum_k \frac{|C_{ik}|}{|D_i|} log \frac{|C_{ik}|}{|D_i|} \]

3)計算信息增益 IG:

\[IG(D,A) = H(D) – H(D|A)\]

至於 C4.5 完全與 ID3 類似,只不過不是采用 $IG$ 了,而是利用信息增益比:因為用 $IG$ 作為尋找最優划分特征時,傾向於選擇特征取值多的特征,所以使用信息增益比可以校正該問題,$IG_R$ 是這樣定義的:

特征集 $A$ 對訓練數據集合 $D$ 的信息增益比 $IG_R(D,A)$  定義為特征 $A$ 的信息增益 $IG(D,A)$ 與訓練數據集 $D$ 關於特征 $A$ 的取值熵 $H_A(D)$ 之比,即:

\[IG_R (D,A) = \frac {IG(D,A)}{H_A(D)}\]

假設特征 $A$ 有 $n$ 個取值,則其中數據集 $D$ 關於 特征 $A$ 的熵為:

\[H_A(D) = –\sum_i^n \frac{|D_i|}{|D|}log\frac{|D_i|}{|D|}\]

由公式可見,若 $IG_R$ 不僅對特征取值多的特征有一個除以關於特征值的熵的懲罰,所以特征取值多時信息增益不一定大。 C4.5 的信息增益算法只需把 $IG(D,A)$ 換成 $IG_R(D,A)$ 即可,這里省略不寫了。

決策樹的生成

經過特征選擇后,接下來將進入決策樹的生成算法.首先看 ID3 ,算法是這樣一個過程:從根節點開始,計算特征集合的信息增益,選擇增益最大的特征作為節點的特征,又該特征的不同取值構建不同的子節點,對子節點遞歸調用特征選擇過程,直到信息增益很小或沒有特征可以選擇為止。ID3 算法如下:

輸入:訓練數據 $D$ ,特征集 $A$ ,閾值 $\varepsilon$ ;

輸出:決策樹 $T$.

1) 若 $D$ 中所有實例均為同一類別 $C_k$ ,則 $T$ 為單節點樹,將 $C_k$ 作為該節點的類標記,返回 $T$;

2) 若 $A =  \varnothing $ ,則 $T$ 為單節點樹,將 $D$ 中 類別最大的類 $C_k$ 作為該節點的類標記,返回 $T$;

3) 計算特征集合 $A$ 中各特征對 $D$ 的信息增益,選擇特征集合 $A$ 中信息增益最大的特征 $A_g$;

4) 如果 $A_g$ 的信息增益小於閾值 $\varepsilon$ ,則設置 $T$ 為 單節點樹,將 $D$ 中 類別最大的類 $C_k$ 作為該節點的類標記,返回 $T$ ;

5) 對 $A_g$ 中的每一個取值 $a_i$ ,依 $a_i$ 將 $D$ 分割為 非空子集 $D_i$ ,以 $D_i$ 中實例最多的類作為類標記,構建子節點,由節點 $A_g$ 與子節點構成樹 $T$ ,並返回 $T$;

6) 對第 $i$ 個子節點,以 $D_i$ 為訓練集,$A - A_g$ 為特征集,遞歸調用 $1) \sim 5)$ ,得到子樹 $T_i$ ,返回$T_i$ .

C4.5 與 ID3 基本一致,只是在特征選擇過程使用的是信息增益比,這里省略不寫了。

決策樹剪枝

決策樹遞歸的生成,直到不能繼續為止,這樣產生的樹往往對於訓練數據十分准確,但不能很好的泛化到測試數據上,因為決策樹考慮對訓練數據盡可能的正確分類,從而構建出過度復雜的決策樹,產生過擬合的現象,可以通過剪枝來降低樹的復雜度,剪枝即裁剪掉樹中的一些代表類別的葉節點,並將其數據合並到父節點作為新的葉節點,從而簡化分類模型。剪枝是從決策樹整體出發的,用來降低整個決策樹的誤差。通過極小化損失函數來實現。設決策樹 $T$ 的葉節點的個數為 $|T|$ , $t$ 為 $T$ 的葉節點,該節點有 $N_t$  個樣本,其中類別 $k$ 的樣本有 $N_{ik}$ 個,$H_t(T)$ 代表葉子節點 $t$ 的熵, 另 $a \ge 0$ ,則決策樹的損失函數可以定義為:

\[C_a(T) = \sum_t N_t H_t(T) +a|T| \tag{*}\]

\[H_t(T) = -\sum_k \frac{N_{tk}}{N_t} log \frac{N_{tk}}{N_t} \]

將 $(*)$ 式的第一項記做:

\[C(T) = -\sum _t N_t \sum_k \frac{N_{tk}}{N_t} log \frac{N_{tk}}{N_t} = –\sum_t\sum_kN_{tk}log \frac{N_{tk}}{N_t} \]

於是可以得到:

\[C_a(T) = C(T) + a|T|\]

$C(T)$ 表示決策樹對於訓練數據的誤差,即模型與訓練數據的擬合程度,$|T|$ 表示模型復雜程度,兩者之間有一個權衡  $a \ge 0 $,較大的 $a$ 代表選擇簡單的模型,反之則選擇復雜的模型, $a =0$ 意味着值考慮與訓練數據的擬合程度,所謂的剪枝即在 $a$ 確定的條件下選擇損失最小的模型,損失函數 $C_a(T)$ 是在簡單模型與復雜模型之間的一種權衡,因為 $C(T)$ 越小 $|T|$ 越大,同時使得 $C(T)$ 與 $|T|$ 減小,得到的當然是一種權衡了。而且決策樹建立時,考慮的是局部的最優特征,而剪枝時損失函數會考慮的是全局損失,整體來優化模型。好比 Deep Learning 中的 fine-tune ,剪枝如下圖所示:

1

決策樹的剪枝算法:

輸入:決策樹 $T$ ,參數 $a$

輸出:剪枝后的樹 $T_a$

1) 計算每個葉節點的熵

2) 假設歸並前后的對應的樹分別為 $T_B$ 與 $T_A$ ,對應的損失函數的值分別為 $C _a(T_B)$ 與 $C _a(T_A)$ 如果有 $C _a(T_B) \ge C _a(T_A)$ ,則進行剪枝操作,即歸並到父節點。遞歸執行這個過程,直到$C _a(T_B) < C _a(T_A)$.

3) 返回得到的新樹 $T_a $.

剪枝算法只考慮剪枝前后損失函數的差,所以剪枝可以理解為一種動態規划算法。ID3 與 C4.5 均采用這種算法即可。

對於連續屬性的計算是這樣的, 如果某特征有 N 個取值,那么我們有N-1種離散化的方法:<=vj的分到左子樹,>vj的分到右子樹。計算這N-1種情況下最大的信息增益率。

在離散屬性上只需要計算1次信息增益率,而在連續屬性上卻需要計算N-1次,計算量是相當大的。有辦法可以減少計算量。對於連續屬性先進行排序,只有在決策屬性發生改變的地方才需要切開。比如對Temperature進行排序:

1


免責聲明!

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



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