林軒田機器學習技法課程學習筆記9 — Decision Tree

紅色石頭發表於2018-07-28

上節課我們主要介紹了Adaptive Boosting。AdaBoost演演算法通過調整每筆資料的權重,得到不同的hypotheses,然後將不同的hypothesis乘以不同的係數\alpha進行線性組合。這種演演算法的優點是,即使底層的演演算法g不是特別好(只要比亂選好點),經過多次迭代後演算法模型會越來越好,起到了boost提升的效果。本節課將在此基礎上介紹一種新的aggregation演算法:決策樹(Decision Tree)。

1. Decision Tree Hypothesis

從第7節課開始,我們就一直在介紹aggregation model。aggregation的核心就是將許多可供選擇使用的比較好的hypothesis融合起來,利用集體的智慧組合成G,使其得到更好的機器學習預測模型。下面,我們先來看看已經介紹過的aggregation type有哪些。

aggregation type有三種:uniform,non-uniform,conditional。它有兩種情況,一種是所有的g是已知的,即blending。對應的三種型別分別是voting/averaging,linear和stacking。另外一種情況是所有g未知,只能通過手上的資料重構g,即learning。其中uniform和non-uniform分別對應的是Bagging和AdaBoost演算法,而conditional對應的就是我們本節課將要介紹的Decision Tree演算法。

決策樹(Decision Tree)模型是一種傳統的演算法,它的處理方式與人類思維十分相似。例如下面這個例子,對下班時間、約會情況、提交截止時間這些條件進行判斷,從而決定是否要進行線上課程測試。如下圖所示,整個流程類似一個樹狀結構。

圖中每個條件和選擇都決定了最終的結果,Y or N。藍色的圓圈表示樹的葉子,即最終的決定。

把這種樹狀結構對應到一個hypothesis G(x)中,G(x)的表示式為:

G(x)=\sum_{t=1}^Tq_t(x)\cdot g_t(x)

G(x)由許多g_t(x)組成,即aggregation的做法。每個g_t(x)就代表上圖中的藍色圓圈(樹的葉子)。這裡的g_t(x)是常數,因為是處理簡單的classification問題。我們把這些g_t(x)稱為base hypothesis。q_t(x)表示每個g_t(x)成立的條件,代表上圖中橘色箭頭的部分。不同的g_t(x)對應於不同的q_t(x),即從樹的根部到頂端葉子的路徑不同。圖中中的菱形代表每個簡單的節點。所以,這些base hypothesis和conditions就構成了整個G(x)的形式,就像一棵樹一樣,從根部到頂端所有的葉子都安全對映到上述公式上去了。

決策樹實際上就是在模仿人類做決策的過程。一直以來,決策樹的應用十分廣泛而且分類預測效果都很不錯,而它在數學上的理論完備性不充分,倒也不必在意。

如果從另外一個方面來看決策樹的形式,不同於上述G(x)的公式,我們可以利用條件分支的思想,將整體G(x)分成若干個G_c(x),也就是把整個大樹分成若干個小樹,如下所示:

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

上式中,G(x)表示完整的大樹,即full-tree hypothesis,b(x)表示每個分支條件,即branching criteria,G_c(x)表示第c個分支下的子樹,即sub-tree。這種結構被稱為遞迴型的資料結構,即將大樹分割成不同的小樹,再將小樹繼續分割成更小的子樹。所以,決策樹可以分為兩部分:root和sub-trees。

在詳細推導決策樹演算法之前,我們先來看一看它的優點和缺點。首先,decision tree的優點有:

  • 模型直觀,便於理解,應用廣泛
  • 演算法簡單,容易實現

  • 訓練和預測時,效率較高

然而,decision tree也有相應的缺點:

  • 缺少足夠的理論支援
  • 如何選擇合適的樹結構對初學者來說比較困惑

  • 決策樹代表性的演演算法比較少

2. Decision Tree Algorithm

我們可以用遞迴形式將decision tree表示出來,它的基本的演算法可以寫成:

這個Basic Decision Tree Algorithm的流程可以分成四個部分,首先學習設定劃分不同分支的標準和條件是什麼;接著將整體資料集D根據分支個數C和條件,劃為不同分支下的子集Dc;然後對每個分支下的Dc進行訓練,得到相應的機器學習模型Gc;最後將所有分支下的Gc合併到一起,組成大矩G(x)。但值得注意的是,這種遞迴的形式需要終止條件,否則程式將一直進行下去。當滿足遞迴的終止條件之後,將會返回基本的hypothesis g_t(x)

所以,決策樹的基本演演算法包含了四個選擇:

  • 分支個數(number of branches)
  • 分支條件(branching criteria)

  • 終止條件(termination criteria)

  • 基本演算法(base hypothesis)

下面我們來介紹一種常用的決策樹模型演算法,叫做Classification and Regression Tree(C&RT)。C&RT演算法有兩個簡單的設定,首先,分支的個數C=2,即二叉樹(binary tree)的資料結構;然後,每個分支最後的g_t(x)(數的葉子)是一個常數。按照最小化E_{in}的目標,對於binary/multiclass classification(0/1 error)問題,看正類和負類哪個更多,g_t(x)取所佔比例最多的那一類y_n;對於regression(squared error)問題,g_t(x)則取所有y_n的平均值。

對於決策樹的基本演演算法流程,C&RT還有一些簡單的設定。首先,C&RT分支個數C=2,一般採用上節課介紹過的decision stump的方法進行資料切割。也就是每次在一個維度上,只對一個特徵feature將資料一分為二,左子樹和右子樹,分別代表不同的類別。然而,怎麼切割才能讓資料劃分得最好呢(error最小)?C&RT中使用純淨度purifying這個概念來選擇最好的decision stump。purifying的核心思想就是每次切割都儘可能讓左子樹和右子樹中同類樣本佔得比例最大或者y_n都很接近(regression),即錯誤率最小。比如說classifiacation問題中,如果左子樹全是正樣本,右子樹全是負樣本,那麼它的純淨度就很大,說明該分支效果很好。

根據C&RT中purifying的思想,我們得到選擇合適的分支條件b(x)的表示式如上所示。最好的decision stump重點包含兩個方面:一個是剛剛介紹的分支純淨度purifying,purifying越大越好,而這裡使用purifying相反的概念impurity,則impurity越小越好;另外一個是左右分支純淨度所佔的權重,權重大小由該分支的資料量決定,分支包含的樣本個數越多,則所佔權重越大,分支包含的樣本個數越少,則所佔權重越小。上式中的|D_c\ with\ h|代表了分支c所佔的權重。這裡b(x)類似於error function(這也是為什麼使用impurity代替purifying的原因),選擇最好的decision stump,讓所有分支的不純度最小化,使b(x)越小越好。

不純度Impurity如何用函式的形式量化?一種簡單的方法就是類比於E_{in},看預測值與真實值的誤差是多少。對於regression問題,它的impurity可表示為:

impurity(D)=\frac1N\sum_{n=1}^N(y_n-\overline{y})^2

其中,\overline{y}表示對應分支下所有y_n的均值。

對應classification問題,它的impurity可表示為:

impurity(D)=\frac1N\sum_{n=1}^N[y_n\neq y^*]

其中,y^*表示對應分支下所佔比例最大的那一類。

以上這些impurity是基於原來的regression error和classification error直接推導的。進一步來看classification的impurity functions,如果某分支條件下,讓其中一個分支純度最大,那麼就選擇對應的decision stump,即得到的classification error為:

1-max_{1\leq k\leq K}\frac{\sum_{n=1}^N[y_n=k]}{N}

其中,K為分支個數。

上面這個式子只考慮純度最大的那個分支,更好的做法是將所有分支的純度都考慮並計算在內,用基尼指數(Gini index)表示:

1-\sum_{k=1}^K(\frac{\sum_{n=1}^N[y_n=k]}{N})^2

Gini index的優點是將所有的class在資料集中的分佈狀況和所佔比例全都考慮了,這樣讓decision stump的選擇更加準確。

對於決策樹C&RT演算法,通常來說,上面介紹的各種impurity functions中,Gini index更適合求解classification問題,而regression error更適合求解regression問題。

C&RT演算法迭代終止條件有兩種情況,第一種情況是當前各個分支下包含的所有樣本y_n都是同類的,即不純度impurity為0,表示該分支已經達到了最佳分類程度。第二種情況是該特徵下所有的x_n相同,無法對其進行區分,表示沒有decision stumps。遇到這兩種情況,C&RT演算法就會停止迭代。

所以,C&RT演算法遇到迭代終止條件後就成為完全長成樹(fully-grown tree)。它每次分支為二,是二叉樹結構,採用purify來選擇最佳的decision stump來劃分,最終得到的葉子(g_t(x))是常數。

3. Decision Tree Heuristics in C&RT

現在我們已經知道了C&RT演算法的基本流程:

可以看到C&RT演算法在處理binary classification和regression問題時非常簡單實用,而且,處理muti-class classification問題也十分容易。

考慮這樣一個問題,有N個樣本,如果我們每次只取一個樣本點作為分支,那麼在經過N-1次分支之後,所有的樣本點都能完全分類正確。最終每片葉子上只有一個樣本,有N片葉子,即必然能保證E_{in}=0。這樣看似是完美的分割,但是不可避免地造成VC Dimension無限大,造成模型複雜度增加,從而出現過擬合現象。為了避免overfit,我們需要在C&RT演算法中引入正則化,來控制整個模型的複雜度。

考慮到避免模型過於複雜的方法是減少葉子(g_t(x))的數量,那麼可以令regularizer就為決策樹中葉子的總數,記為\Omega(G)。正則化的目的是儘可能減少\Omega(G)的值。這樣,regularized decision tree的形式就可以表示成:

argmin_{(all\ possible\ G)}\ E_{in}(G)+\lambda\Omega(G)

我們把這種regularized decision tree稱為pruned decision tree。pruned是修剪的意思,通過regularization來修剪決策樹,去掉多餘的葉子,更簡潔化,從而達到避免過擬合的效果。

那麼如何確定修剪多少葉子,修剪哪些葉子呢?假設由C&RT演算法得到一棵完全長成樹(fully-grown tree),總共10片葉子。首先分別減去其中一片葉子,剩下9片,將這10種情況比較,取E_{in}最小的那個模型;然後再從9片葉子的模型中分別減去一片,剩下8片,將這9種情況比較,取E_{in}最小的那個模型。以此類推,繼續修建葉子。這樣,最終得到包含不同葉子的幾種模型,將這幾個使用regularized decision tree的error function來進行選擇,確定包含幾片葉子的模型誤差最小,就選擇該模型。另外,引數\lambda可以通過validation來確定最佳值。

我們一直討論決策樹上的葉子(features)都是numerical features,而實際應用中,決策樹的特徵值可能不是數字量,而是類別(categorical features)。對於numerical features,我們直接使用decision stump進行數值切割;而對於categorical features,我們仍然可以使用decision subset,對不同類別進行“左”和“右”,即是與不是(0和1)的劃分。numerical features和categorical features的具體區別如下圖所示:

在決策樹中預測中,還會遇到一種問題,就是當某些特徵缺失的時候,沒有辦法進行切割和分支選擇。一種常用的方法就是surrogate branch,即尋找與該特徵相似的替代feature。如何確定是相似的feature呢?做法是在決策樹訓練的時候,找出與該特徵相似的feature,如果替代的feature與原feature切割的方式和結果是類似的,那麼就表明二者是相似的,就把該替代的feature也儲存下來。當預測時遇到原feature缺失的情況,就用替代feature進行分支判斷和選擇。

4. Decision Tree in Action

最後我們來舉個例子看看C&RT演算法究竟是如何進行計算的。例如下圖二維平面上分佈著許多正負樣本,我們使用C&RT演算法來對其進行決策樹的分類。

第一步:

第二步:

第三步:

第四步:

在進行第四步切割之後,我們發現每個分支都已經非常純淨了,沒有辦法繼續往下切割。此時表明已經滿足了迭代終止條件,這時候就可以回傳base hypothesis,構成sub tree,然後每個sub tree再往上整合形成tree,最後形成我們需要的完全決策樹。如果將邊界新增上去,可得到下圖:

得到C&RT演算法的切割方式之後,我們與AdaBoost-Stump演算法進行比較:

我們之前就介紹過,AdaBoost-Stump演算法的切割線是橫跨整個平面的;而C&RT演算法的切割線是基於某個條件的,所以一般不會橫跨整個平面。比較起來,雖然C&RT和AdaBoost-Stump都採用decision stump方式進行切割,但是二者在細節上還是有所區別。

再看一個資料集分佈比較複雜的例子,C&RT和AdaBoost-Stump的切割方式對比效果如下圖所示:

通常來說,由於C&RT是基於條件進行切割的,所以C&RT比AdaBoost-Stump分類切割更有效率。總結一下,C&RT決策樹有以下特點:

5. 總結:

本節課主要介紹了Decision Tree。首先將decision tree hypothesis對應到不同分支下的矩g_t(x)。然後再介紹決策樹演算法是如何通過遞迴的形式建立起來。接著詳細研究了決策樹C&RT演算法對應的數學模型和演算法架構流程。最後通過一個實際的例子來演示決策樹C&RT演算法是如何一步一步進行分類的。

註明:

文章中所有的圖片均來自臺灣大學林軒田《機器學習技法》課程

更多AI資源請關注公眾號:AI有道(ID:redstonewill)

相關文章