決策樹之 CART


繼上篇文章決策樹之 ID3 與 C4.5,本文繼續討論另一種二分決策樹 Classification And Regression Tree,CART 是 Breiman 等人在 1984 年提出的,是一種應用廣泛的決策樹算法,不同於 ID3 與 C4.5, CART 為一種二分決策樹, 每次對特征進行切分后只會產生兩個子節點,而ID3 或 C4.5 中決策樹的分支是根據選定特征的取值來的,切分特征有多少種不同取值,就有多少個子節點(連續特征進行離散化即可)。CART 設計回歸與分類,接下來將分別介紹分類樹與回歸樹。

回歸樹與模型樹

首先簡單回憶線性回歸:是對於數據集 $D = \left \{(x_i,y_i) \right \}_{i=1}^N$ ,線性回歸的模型為:$ \bar{y}_i = \theta ^T x_i $,損失函數可以記做:

\[L(\theta) = \frac{1}{N}\sum_i( y_i - \bar{y}_i  )^2\]

或者向量形式(參考NG),對於 $Y = X\theta$ ,損失函數為 $\frac{1}{2}(X\theta-y)^T(X\theta-Y) $,對 $\theta$ 求導,即得:

\[\theta = (X^TX)^{-1}X^TY\]

Liner Regression 已經很強大,可以處理線性數據集,對於非線性數據集,可以考慮增加特征的辦法,比如引入高次特征或者進行特征組合來增加模型的非線性能力。如果數據集不是很大,可以考慮不加特征的局部加權回歸,這里需要考慮一個概念,即 Parametric 算法與 Non-Parametric 算法,簡單介紹一下,Parametric  算法會用訓練集訓練數據得到模型參數,用做之后的預測;Non-Parametric 算法則並不會學習得到通用的參數,而是根據需求擬合模型。所以線性回歸可以認為是一種 Parametric 學習算法,那么局部加權回歸可以認定為非參數方法,因為局部加權只考慮離待預測樣本 $x$ 近的那些點,所以對於待測樣本,都要遍歷數據集進行運算,速度會很慢,局部加權回歸還對損失函數進行了一些改進:

\[L(\theta) = \frac{1}{N}\sum_iw_i(\bar{y}_i  - y_i)\]

\[w_i = exp \left (\frac{x_i-x}{2 \tau ^2}  \right ) \]

這里 $\tau$ 控制了權值變化的速率,每個樣本  $x_i$  都有一個權值,權值根據 $\tau$ 來調整大小,離樣本點 $x_i$ 越近的樣本其權值卻大,局部加權回歸的預測模型同線性回歸。值得注意的問題還有特征歸一化正則化,這里不展開了,關於局部加權回歸與線性回歸的圖形分別如下:

1

線性回歸是一個關於全局數據的模型,用一個唯一的目標優化來優化全數據集。當數據並呈現分段特性的時候,比如如下圖所示的數據,全局共享一個優化目標顯然不是一個很好的選擇。這時可以對數據集進行划分,分而治之明顯是一個不錯的選擇。下圖所示的數據可以划分為 5 個分片分別進行處理,分片之后可以對每個分片做一個線性模型,這種情況稱之為模型樹;也可以簡單的對分片后的數據取均值,這種情況就是普通的回歸樹。接下來分別對回歸樹與模型樹進行介紹。

1

回歸樹采用均方誤差作為損失函數,樹生成時會遞歸的按最優特征與最優特征下的最優取值對空間進行划分,直到滿足停止條件為止,停止條件可以人為設定,比如說設置某個節點的樣本容量小於給定的閾值 $c$ ,或者當切分后的損失減小值小於給定的閾值小於給定的 $\varepsilon $,則停止切分,生成葉節點。

對於生成的回歸樹,每個葉節點的類別為落到該葉節點數據的標簽的均值,假設特征空間被划分為 $M$ 個部分,即現在有 $M$ 個葉節點分別為 $R_1,R_2,…,R_M$ , 對應的數據量分別為 $N_1,N_2,…,N_M$ ,則葉節點的預測值分別為:

\[c_m = \frac{1}{N_m}\sum_{x_i \in R_m} y_i  \tag{*}\]

回歸樹為一顆二叉樹,每次都是按特征下的某個取值進行划分,每一個內部節點都是做一個對應特征的判斷,直至走到葉節點得到其類別,構建這棵樹的難點在於如何選取最優的切分特征與切分特征對應的切分變量。回歸樹與模型樹既可以處理連續特征也可以處理離散特征,對於連續特征,若這里按第 $j$ 個特征的取值 $s$ 進行切分,切分后的兩個區域分別為:

\[R_1(j,s) = \left \{ x_i|x_i^j \le s \right \} \ \ \ R_2(j,s) = \left \{ x_i|x_i^j > s \right \}\]

若為離散特征,則找到第 j 個特征下的取值 s :

\[R_1(j,s) = \left \{ x_i|x_i^j = s \right \} \ \ \ R_2(j,s) = \left \{ x_i|x_i^j \ne s \right \}\]

根據 $(*)$ 分別計算 $R_1$ 與 $R_2$ 的類別估計 $c_1$ 與 $c_2$, 然后計算按 $(j,s)$ 切分后得到的損失:

\[\min_{j,s} \left [   \sum _{x_i \in R_1}(y_i –c_1)^2 + \sum_{x_i \in R_2} (y_i –c_2)^2  \right ]\]

找到使損失最小的 $(j,s)$ 對即可,遞歸執行 $(j,s)$ 的選擇過程直到滿足停止條件為止。這里以連續特征為例,給出回歸樹的算法:

輸入: 訓練數據集 $D=\left\{ (x_1,y_1),(x_2,y_2),…,(x_N,y_N)\right\}$

輸出: 回歸樹 $T$

1)求解選擇切分特征 $j$ 與 切分特征取值 $s$ ,$j$ 將訓練集 $D$ 划分為兩部分,$R_1$ 與 $R_2$ ,依照$(j,s)$ 切分后如下:

\[R_1(j,s) = \left \{ x_i|x_i^j \le s \right \} \ \ \ R_2(j,s) = \left \{ x_i|x_i^j > s \right \}\]

\[c_1 = \frac{1}{N_1}\sum_{x_i \in R_1} y_i   \ \ \ \ c_2 = \frac{1}{N_2}\sum_{x_i \in R_2} y_i  \]

2)遍歷所有可能的解$(j,s)$,找到最優的 $(j^*,s^*)$ ,最優的解使得對應損失最小,按照最優特征 $(j^*,s^*)$ 來切分即可。

\[\min_{j,s} \left [   \sum _{x_i \in R_1}(y_i –c_1)^2 + \sum_{x_i \in R_2} (y_i –c_2)^2  \right ]\]

3)遞歸條用 $1) \sim  2)$ ,知道滿足停止條件。

4)返回決策樹 $T$.

回歸樹主要采用了分治策略,對於無法用唯一的全局線性回歸來優化的目標進行分而治之,進而取得比較准確的結果,但分段取均值並不是一個明智的選擇,可以考慮將葉節點設置為一個線性函數,這便是所謂的分段線性模型樹。為什么模型樹效果好呢,可以通過下圖來觀察,左邊為回歸樹,右邊為模型樹,可以看到模型樹的效果還是好一些。1

模型樹只需在回歸樹的基礎上稍加修改即可,對於分到葉節點的數據,采用線性回歸的最小均方損失來計算該節點的損失,具體的求解方法可以參考 《Machine Learning in Action》 這本書。

分類樹

分類樹是 CART 中用來分類的了,不同於 ID3 與 C4.5 ,分類樹采用基尼指數來選擇最優的切分特征,而且每次都是二分。

基尼指數是一個類似與熵的概念,對於一個有 $K$ 種狀態對應的概率為 $p_1,p_2,…,p_K$ 的隨機變量 $X$ ,其 $Gini$ 定義如下:

\[Gini(X) = \sum_k p_k (1-p_k) = 1-\sum_k p_k^2\]

根據公式可得到伯努利分布 $X \sim Bernoulli(p)$ 的基尼系數為:

\[Gini(X) = \sum_k p_k (1-p_k) = 2p(1-p)\]

對於訓練數據集合 $D$ ,假設共有 $K$ 個類別,$C_k$ 代表第 $k$ 類的樣本子集,$|C_k|$ 為 $C_k$ 的大小,$|D|$ 為 $D$ 的大小,則集合 $D$的基尼系數為:

\[Gini(D) = \sum_k \frac{|C_k|}{|D|}(1-\frac{|C_k|}{|D|}) = 1- \sum_k \left (\frac{|C_k|}{|D|}\right )^2\]

類似於 $ID3$ 中的信息增益,假設現在用特征 $A$ 對數據進行分割,若特征 $A$ 為離散特征,則根據 $A$ 的某一可能取值 $a$ 將 $D$ 分為 $D_1$ 與 $D_2$

\[D_1 =\left \{D | A=a \right \} \ \ \ D_2 = \left \{D | A \ne a \right \} \]

其實就跟回歸樹一樣,對於連續特征,也類似於回歸樹。接下來便得到類似於條件熵的一個量 $Gini(D,A)$ ,即在已知特征 $A$ 的條件下集合 $D$ 的基尼指數:

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

$Gini(D,A)$ 取值越大,樣本的不確定性也越大,這一點與熵類似,所以選擇特征 $A$ 的標准是 $Gini(D,A)$ 的取值越小越好。接下來以離散特征為例,給出分類樹算法:

輸入:訓練數據集 $D=\left\{ (x_1,y_1),(x_2,y_2),…,(x_N,y_N)\right\}$ ,停止條件

輸出:分類樹 $T$

1)利用特征 $A$ 的取值 $a$ 將數據分為兩部分,計算 $A=a$ 時的基尼系數:

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

2)對整個數據集中所有的可能特征 $A$ 以及其可能取值 $a$ 選取基尼系數最小的特征 $A^*$ 與特征下的取值 $a^*$,來將數據集切分,將數據 $D_1$、$D_2$ 分到兩個子節點中去。

3)對子節點遞歸的調用 $1) \sim 2)$ ,直至滿足停止條件

4)返回 CART 樹 $T$

算法的停止條件可以是節點中的樣本數不能小於給定閾值,或者樣本集的基尼系數小於給定閾值,或者沒有更多的特征。最后給出一個 CART 用於分類的圖:

剪枝

CART 中同樣需要對生成的樹進行剪枝操作,來避免模型過度擬合訓練數據,類似於ID3,剪枝時使用的損失函數如下:

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

$C(T)$為樹 $T$ 對訓練數據的誤差,可以用基尼系數或者均方損失來表示,$a \ge 0$  代表一個權衡訓練數據損失 $C(T)$ 與總節點數 $|T|$ 的參數,$C_a(T)$ 代表了樹 $T$ 的整體損失,對於固定的 $a $,一定存在一個確定的使得 $C_a(T)$ 最小的子樹,當 $a$ 偏大時, $|T|$ 偏小,樹 $T$ 的規模偏小,反之,樹 $T$ 的規模偏大,Breiman 等人采用遞歸的方法對 CART 進行剪枝,將 $a$ 從小增大  $0=a_0 < a_1<…<a_n$ ,如此產生的區間 $a \in [a_i,a_{i+1}) , \ i =1,2,…,n$ ,用對應此區間的 a 產生一系列的子樹序列 $\left\{T_0,T_1,…,T_n \right\}$ 這里 $T_{i+1}$ 總是由 $T_i$ 剪枝后產生。

剪枝是從 $T_0$ 開始的,對 $T_0$ 的任意內部節點 $t$ ,把節點 $t$ 看做葉節點計算其損失函數:

\[C_a(t) = C(t) + a|1|\]

然后計算以 $t$ 為根節點時,子樹 $T_t$ 的損失函數

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

要不要把 $t$ 的子樹 $T_t$ 歸並到 $t$ 上呢,關鍵看這個損失了,如果單節點 $t$ 的損失小於或等於整個子樹 $T_t$ 的損失,合並當然好了,啥時候 $C_a(t) = C_a(T_t)$ 呢?如下所示:

\[C_a(t) = C_a(T_t) \Rightarrow C(t) + a|1| = C(T_t)+ a|T_t|  \Rightarrow  a=\frac {C_t-C(T_t)}{|T_t|-1}\]

明顯的,只要滿足以上條件, $T_t$ 與 $t$ 具有相同的損失,而且 $t$ 的節點少,所以進行剪枝,剪枝就是這么一個過程:

從 $T_0$ 開始,對於每一個內部節點 $t$ ,計算:

\[g(t) = \frac {C_t-C(T_t)}{|T_t|-1}\]

$g(t)$ 表示剪枝后整體損失函數的減小的程度,在 $T_0$ 中剪掉 $g(t)$ 最小的樹 $T_t $ ,將得到的樹稱作 $T_1$ ,同時將最小的 $g(t) $設置為 $a_1$ , $T_1$ 為區間$[a_1,a_2)$上的最優子樹,如此剪下去,在這一過程中,不斷增加 $a$ 的取值,產生新的區間,最終會得到一組決策樹 $\left\{T_0,T_1,…,T_n \right\}$ 對應一組確定的權衡參數 $\left\{a_0,a_1,…,a_n \right\}$ ,通過驗證集合中每顆樹的總體誤差,也就得到了最終的最優決策樹 $T^*$ ,這里給出CART 剪枝算法:

輸入:CART 生成樹 $T_0$

輸出:剪枝后的最優樹 $T^*$

1)設 $k = 0$ , $T = T_0$ ,$a=+\infty$

3) 自下而上的對內部節點 t 計算 :

\[g(t) = \frac {C_t-C(T_t)}{|T_t|-1} \]

\[a = min(a,g(t))\]

4) 自上而下的訪問內部節點 $t$ , 對最小的 $g(t) = a$ 進行剪枝,並對葉節點 $t$ 以多數表決形式決定其類別,得到樹 $T$

5) $k = k + 1$, $a_k = a $,$T_k = T$

6) 如果 $T$ 為非單節點樹,回到 4).

7) 對於產生的子樹序列 $\left\{T_0,T_1,…,T_n \right\}$ 分別計算損失,得到最優子樹 $T^* $ 並返回.

至此,關於CART 的內容全部介紹完畢,CART 剪枝還是不同於 ID3 與 C4.5 的 , 另外 CART 為二叉樹,且可用於回歸。

 

參考:http://www.stat.cmu.edu/~cshalizi/350-2006/lecture-10.pdf

      《統計學習方法》

      《Machine Learning in Action》


免責聲明!

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



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