1. 程式人生 > >【資料科學系統學習】機器學習演算法 # 西瓜書學習記錄 [9] 決策樹

【資料科學系統學習】機器學習演算法 # 西瓜書學習記錄 [9] 決策樹

本篇內容為西瓜書第 4 章決策樹 4.14.24.3 的內容:

  • 4.1 基本流程
  • 4.2 劃分選擇
  • 4.3 剪枝處理

如移動端無法正常顯示文中的公式,右上角跳至網頁即可正常閱讀。

決策樹 (decision tree) 是一種基本的分類與迴歸方法。在分類問題中,表示基於特徵對例項進行分類的過程。決策樹學習通常包括 3 個步驟:特徵選擇、決策樹的生成和決策樹的修剪。這些決策樹的思想主要來源於由 Quinlan 在1968 年提出的 ID3 演算法和 1993 年提出的 C4.5演算法,以及由 Breiman 等人在 1984 年提出的 CART 演算法。

決策樹是一種樹型結構,其中每個內部結點

表示在一個屬性上的測試,每個分支代表一個測試輸出,每個葉結點代表一種類別。如下圖所示,就是判斷一顆瓜是否為好瓜的一顆決策樹。

clipboard.png

決策樹學習採用的是自頂向下的遞迴方法,其基本思想是以資訊熵為度量構造一棵熵值下降最快的樹,到葉子結點處的熵值為零,此時每個葉結點中的例項都屬於同一類。

這具體是說什麼意思呢?我們來看下面的內容。

基本流程

一般的,一棵決策樹包含一個根節點,若干個內部結點和若干個葉結點;葉結點對應於決策結果,其他每個結點則對應於一個屬性測試;每個結點包含的樣本集合根據屬性測試的結果被劃分到子結點中;根結點包含樣本全集。從根結點到每個葉結點的路徑對應了一個判定測試序列。

決策樹學習的目的是為了產生一棵泛化能力強,即處理未見示例能力強的決策樹,其基本流程遵循簡單且直觀的“分而治之”策略,如下圖所示:

clipboard.png

可以認為,所謂的決策樹就是資訊熵不斷下降的一個過程。比如若葉子結點是完全確定的一個類別,它的資訊熵為 0。這裡說的熵減少是指葉子結點資訊熵的平均值(按樣本個數加權取平均值)一定低於父結點的熵。

在資訊理論與概率統計中, (entropy) 是表示隨機變數不確定性的度量。設 $X$ 是一個取有限個值的離散隨機變數,其概率分佈為

$$ P(X=x_i)=p_i,\quad i=1,2,···,n $$

則隨機變數 $X$ 的熵定義為

$$ H(X)=-\sum_{i=1}^{n}p_ilogp_i $$

由定義可知,熵只依賴於 $X$ 的分佈,而與 $X$ 的取值無關,所以也可將 $X$ 的熵記作 $H(p)$,即

$$ H(p)=-\sum_{i=1}^{n}p_ilogp_i $$

當隨機變數只取兩個值,例如 1,0 時,即 $X$ 的分佈為

$$ P(X=1)=p,\quad P(X=0)=1-p,\quad 0\leq p\leq 1 $$

熵為

$$ H(p)=-plog_2p-(1-p)log_2(1-p) $$

下面我們畫圖來說明。將上述公式通過下列程式碼繪圖:

>>> import numpy as np
>>> import matplotlib.pyplot as plt
>>> eps = 0.00001
>>> p = np.linspace(eps, 1-eps, 100)
>>> H = -p * np.log(p) - (1-p) * np.log(1-p)
>>> plt.plot(p, H)
[<matplotlib.lines.Line2D object at 0x113dc89e8>]
>>> plt.show()

得到熵 $H(p)$ 隨概率 $p$ 變化的曲線如下圖所示:

clipboard.png

當 $p=0$ 或 $p=1$ 時 $H(p)=0$,隨機變數完全沒有不確定性。當 $p=0.5$ 時,熵取值最大,隨機變數不確定性最大。

劃分選擇

決策樹學習的生成演算法

建立決策樹的關鍵,即在當前狀態下選擇哪個屬性作為分類依據。根據不同的目標函式,建立決策樹主要有以下三種演算法:

  • ID3:資訊增益
  • C4.5:資訊增益率
  • CART:基尼指數

下面給出資訊增益資訊增益率基尼係數的定義(來自李航的《統計學習方法》),最後用一個例子來說明。

在給出定義前,先對一些符號進行說明:

  • $D$:訓練資料集
  • $|D|$:樣本容量,即樣本個數
  • $C_k$:設有 $K$ 個類 $C_k$,$k=1,2,···,K$
  • $|C_k|$:屬於類 $C_k$ 的樣本個數,即 $\sum_{k=1}^{K}|C_k|=|D|$
  • $A$:設特徵 $A$ 有 $n$ 個不同的取值 ${a_1,a_2,···,a_n}$,根據特徵 $A$ 的取值將 $D$ 劃分為 $n$ 個子集 $D_1,D_2,···,D_n$
  • $|D_i|$:$D_i$ 的樣本個數,即 $\sum_{i=1}^{n}|D_i|=|D|$
  • $D_{ik}$:記子集 $D_i$ 中屬於類 $C_k$ 的樣本的集合為 $D_{ik}$,即 $D_{ik}=D_i \cap C_k$
  • $|D_{ik}|$:$D_{ik}$ 的樣本個數
  • $H(D)$:經驗熵

$$ H(D)=-\sum_{k=1}^{K}\frac{|C_k|}{D}log_2\frac{|C_k|}{D} $$

  • $H(D | A)$:經驗條件熵

$$ H(D|A)=\sum_{i=1}^{n}\frac{|D_i|}{|D|}H(D_i)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}\sum_{k=1}^{K}\frac{|D_{ik}|}{|D_i|}log_2\frac{|D_{ik}|}{|D_i|} $$

當熵和條件熵中的概率由資料估計(特別是極大似然估計)得到時,所對應的熵與條件熵分別稱為經驗熵條件經驗熵

特徵選擇的準則

特徵選擇是決定用哪個特徵來劃分特徵空間,即如何選擇最優劃分屬性。要生成一棵樹,就要知道從當前結點上,如何劃分形成下面的結點,可以說,這是做決策樹的意義、目的和難點。通常特徵選擇的準則就是上面提到的資訊增益或資訊增益比,還有基尼指數。

定義 5.2(資訊增益)特徵 $A$ 對訓練資料集 $D$ 的資訊增益 $g(D, A)$,定義為集合 $D$ 的經驗熵 $H(D)$ 與特徵 $A$ 給定條件下 $D$ 的經驗條件熵 $H(D|A)$ 之差,即

$$ g(D|A)=H(D)-H(D|A) $$

一般地,熵 $H(Y)$ 與條件熵 $H(Y|X)$ 之差稱為互資訊 (mutual information)。決策樹學習中的資訊增益等價於訓練資料集中類與特徵的互資訊。

定義 5.3(資訊增益比)特徵 $A$ 對訓練資料集 $D$ 的資訊增益比 $g_R(D, A)$ 定義為其資訊增益 $g(D, A)$ 與訓練資料集 $D$ 關於特徵 $A$ 的值的熵 $H_A(D)$ 之比,即

$$ g_R(D, A)=\frac{g(D|A)}{H_A(D)} $$

其中,$H_A(D)=-\sum_{i=1}^{n}\frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|}$,$n$ 是特徵 $A$ 取值的個數。

定義 5.4(基尼係數)分類問題中,假定有 $K$ 個類,樣本點屬於第 $k$ 類的概率為 $p_k$,則概率分佈的基尼指數定義為

$$ Gini(p)=\sum_{k=1}^{K}p_k(1-p_k)=1-\sum_{k=1}^{K}p_k^2 $$

對於給定的樣本集合 $D$,其基尼指數為

$$ Gini(D)=1-\sum_{k=1}^{K} \left(\frac{|C_k|}{|D|} \right)^2 $$

這裡,$C_k$ 是 $D$ 中屬於第 $k$ 類的樣本子集,$K$ 是類的個數。

如果樣本集合 $D$ 根據特徵 $A$ 是否取某一可能值 $a$ 被分割成 $D_1$ 和 $D_2$ 兩部分,即

$$ D_1= \{ (x,y)\in D|A(x)=a \},\quad D_2=D-D_1 $$

則在特徵 $A$ 的條件下,集合 $D$ 的基尼指數定義為

$$ Gini(D,A)=\frac{|D_1|}{|D|}Gini(D_1)+\frac{|D_2|}{|D|}Gini(D_2) $$

基尼指數 $Gini(D)$ 表示集合 $D$ 的不確定性,基尼指數 $Gini(D,A)$ 表示經 $A=a$ 分割後集合 $D$ 的不確定性。

直觀來說,$Gini(D)$ 反映了從資料集 $D$ 中隨機抽取兩個樣本,其類別標記不一致的概率。因此,$Gini(D)$ 越小,則資料集 $D$ 的純度越高。

下面選取了一個例子(來自李航的《統計學習方法》)來說明上述公式的運用,以及生成決策樹的計算過程。

clipboard.pngclipboard.pngclipboard.pngclipboard.pngclipboard.pngclipboard.png

以資訊增益為準則來選擇劃分屬性為例,簡單的解釋如下:

在本例中,共有 15 個樣本,有“年齡”“有工作”“有自己的房子”“信貸情況”共 4 個特徵,這裡為了敘述方便,分別記做 $A_1,A_2,A_3,A_4$。最後一列類別表示是否同意貸款,有“是”“否”兩個值,記做 $Y$。

  • 計算$H(Y)$,即經驗熵 $H(D)$
  • 計算 $A_1$ 給定的條件下隨機變數 $Y$ 的條件熵 $H(Y|A_1)$,即經驗條件熵 $H(D|A_1)$

為了計算 $H(D|A_1)$,又特徵“年齡”有 3 個可能值:青年、中年、老年,用不嚴格的記號來說明下列過程:$A_1=青年(5)$:$\frac{5}{15}*H(D|A_1=青年)$$A_1=中年(5)$:$\frac{5}{15}*H(D|A_1=中年)$$A_1=老年(5)$:$\frac{5}{15}*H(D|A_1=老年)$$H(D|A_1)=H(D|A_1=青年)+H(D|A_1=中年)+H(D|A_1=老年)$

  • 計算特徵 $A_1$ 對資料集 $D$ 的資訊增益

$g(D,A_1)=H(D)-H(D|A_1)$

同理,分別可得到 $g(D,A_2),g(D,A_3),g(D,A_4)$。最後比較各特徵的資訊增益值,選擇其值最大的那個特徵作為最優特徵。

根據資訊增益準則的特徵選擇方法是:對訓練資料集(或子集)$D$,計算其每個特徵的資訊增益,並比較它們的大小,選擇資訊增益最大的特徵。

以上過程即解釋了資訊增益的演算法

clipboard.pngclipboard.png

總的來說,對於分類問題而言,若根據資訊增益比和基尼指數來選擇特徵,也是類似的想法。對於迴歸問題,則可以用計算均方誤差來進行閾值劃分。

通過上述例子,我們對如何用演算法生成決策樹有了一個大致的瞭解,下面我們給出三種主要的演算法步驟。

ID3 演算法:clipboard.pngclipboard.png

C4.5 的生成演算法:

clipboard.png

CART 生成演算法:

clipboard.pngclipboard.png

剪枝處理

剪枝 (pruning) 是決策樹學習演算法對付“過擬合”的主要手段。其基本策略有預剪枝後剪枝。決策樹的剪枝往往通過極小化決策樹整體的損失函式或代價函式來實現。如下圖所示:

clipboard.png

上述的三種決策樹的剪枝過程演算法相同,區別僅是對於當前樹的評價標準不同。

剪枝總體思路

由完全樹 $T_0$ 開始,剪枝部分結點得到 $T_1$,再次剪枝部分結點得到 $T_2$···直到僅剩樹根的樹 $T_k$,在驗證資料集上對這 $k$ 個樹分別評價,選擇損失函式最小的樹 $T_\alpha$。

剪枝係數的確定

剪枝,就是當 $\alpha$ 確定時,選擇損失函式最小的模型,即損失函式最小的子樹。根據評價函式(由於該評價函式越小越好,所以可以稱之為“損失函式”):

$$ C(T)=\sum_{t \in leaf}N_t·H(t) $$

其中,$t$ 是樹 $T$ 的葉結點,該葉結點有 $N_t$ 個樣本點,$H(t)$ 為葉結點 $t$ 上的經驗熵。$\alpha \ge0$ 為引數,葉結點越多,決策樹越複雜,損失越大。

用 $C(T)$ 表示模型對訓練資料的預測誤差,即模型與訓練資料的擬合程度,$|T_{leaf}|$表示模型複雜度,引數 $\alpha \ge0$ 控制兩者之間的影響。

則當 $\alpha=0$ 時,未剪枝的決策樹損失最小,修正損失函式為:

$$ C_\alpha(T)=C(T)+\alpha|T_{leaf}| $$

當 $\alpha=+\infty$ 時,單根結點的決策樹損失最小。

具體地,假定當前對以 $t$ 為根的子樹剪枝。剪枝後,只保留 $t$ 本身而刪掉所有的葉子考察以 $t$ 為根的子樹。則以 $t$ 為單結點樹的損失函式是:

$$ C_\alpha(t)=C(t)+\alpha $$

以 $t$ 為根結點的子樹 $T_t$ 的損失函式是:

$$ C_\alpha(T_t)=C(T_t)+\alpha|T_t| $$

令二者相等,求得:

$$ \alpha=\frac{C(t)-C(T_t)}{|T_t|-1} $$

$T_t$ 與 $t$ 有相同的損失函式值,而 $t$ 的結點少,因此 $t$ 比$T_t$ 更可取,對 $T_t$ 進行剪枝。其中,$\alpha$ 稱為結點 $t$ 的剪枝係數。

剪枝演算法

對於給定的決策樹 $T_0$:$\quad$計算所有內部結點的剪枝係數;$\quad$查詢最小剪枝係數的結點,剪枝得決策樹 $T_k$;$\quad$重複以上步驟,直到決策樹 $T_k$ 只有 1 個結點;$\quad$得到決策樹序列 $T_0,T_1,T_2,···,T_k$;$\quad$使用驗證樣本集選擇最優子樹。

使用驗證集做最優子樹的標準,可以使用評價函式:$C(T)=\sum_{t \in{leaf}}N_t·H(t)$。

不足之處,歡迎指正。

$$$$