0. 演算法概述
決策樹(decision tree)是一種基本的分類與迴歸方法。決策樹模型呈樹形結構(二分類思想的演算法模型往往都是樹形結構)
0x1:決策樹模型的不同角度理解
在分類問題中,表示基於特徵對例項進行分類的過程,它可以被看作是if-then的規則集合;也可以被認為是定義在特徵空間與類空間上的條件概率分佈
1. if-then規則集合
決策樹的屬性結構其實對應著一個規則集合:由決策樹的根節點到葉節點的每條路徑構成的規則組成;路徑上的內部特徵對應著if條件,葉節點對應著then結論。
決策樹和規則集合是等效的,都具有一個重要的性質:互斥且完備。也就是說任何例項都被且僅被一條路徑或規則覆蓋。
從if-then視角來看,構造過程是這樣的
1. 由決策樹的根節點到葉節點的每一條路徑構建一條if-then規則 2. 路徑上的內部節點的特徵對應著if的判斷條件,而葉節點的類對應著規則的then結論
決策樹的路徑或其對應的if-then規則集合具有一個重要的性質:互斥且完備
即每一個例項都被一條路徑或一條規則所覆蓋,而且只被一條路徑或一條規則所覆蓋
2. 條件概率集合
決策樹還是給定特徵條件下,類別的條件概率分佈的一種退化表示(非等效)。
該條件分佈定義在特徵空間的劃分上(每個劃分代表一個條件),特徵空間被劃分為互不相交的單元,每個單元定義一個類的概率分佈就構成了一個條件概率分佈。
決策樹所表示的整體條件概率分佈由各個單元在給定條件下類的條件概率分佈組成,決策樹的每條路徑對應於劃分中的一個單元。給定例項的特徵X,一定落入某個劃分,決策樹選取該劃分裡最大後驗概率對應的類(期望風險最小化)作為結果輸出。這點上和樸素貝葉斯和KNN的決策思想是一致的
0x2:決策樹的優缺點
1. 優點
1. 可讀性和可解釋性強,可通過視覺化的方式直觀展現 - "分而治之”(divide-and-conquer)策略 2. 對資料預處理的要求較低,不需要預先做資料規範化。這是因為決策樹不是非常關注樣本特徵維度中的數值大小,而是更關注其代表了類別,根據所屬的範疇進行二分類,這也是判別式模型的好處 3. 記憶體開銷小,不像DNN深度學習演算法需要在記憶體中儲存大量的中間梯度變數,decision tree的記憶體開銷是logN級別的 4. 既可以處理數值資料(連續性),也可以處理分類資料(離散型) 5. 能夠處理多分類問題(輸出的Y是一個2維陣列) 6. 效能優良,分類速度快,單純由邏輯判斷組成
2. 缺點
1. 決策樹很容易陷入訓練樣本資料的細節中,過分地細分會導致訓練出一個很"複雜且深"的樹出來。這是因為 太過複雜的樹很容易對訓練資料中的噪音過於敏感 2. 決策樹本身存在"不穩定性",訓練樣本集中的一些微小的變化,可能就會導致決策樹建立出一個不同的分類模型,這也是決策樹對訓練資料樣本太過敏感的表現,這個問題可以用決策森林的投票法得到緩解 3. 當資料中某些維度上的分佈特別密集(這可能是取樣觀察量不夠的原因),決策樹可能會形成偏樹,這種偏樹無法擬合出真實的資料規律,對之後的分類效果也會下降
3. 決策樹對特徵工程的依賴
不單是對決策樹,對所有分型別機器學習演算法特徵工程是最基礎也是最重要的一個環節(如果特徵足夠好,模型已經不重要了),我麼提供給決策樹演算法的特徵需要足夠好,足夠具備"代表性、可分性、鑑別型",決策樹才能儘可能地從資料中學習到規律。這對特徵工程提出了很高的要求,那如何提高特徵的鑑別型呢?
1. 一是設計特徵時儘量引入domain knowledge(專家領域知識):對於業務領域專家來說,他能通過將人工判斷的經驗通過抽象轉化成一系列的特徵維度,人工的經驗越豐富,所提取的特徵的代表性往往就越強,決策樹非常依賴於代表性強的特徵 2. 二是對提取出來的特徵做選擇、變換和再學習,這一點是機器學習演算法不管的部分 3. 現在的機器學習還做不到完全的point to point黑盒預測,前期的特徵提取和特徵預處理在很多場景下還依賴於專家的參與
Relevant Link:
http://scikit-learn.org/stable/modules/tree.html#tree
2. 決策樹模型定義
0x1:決策樹是判別模型
決策樹的訓練過程無法得到樣本中包含的概率密度分佈,它得到的是一個按照不同特徵劃分的判別規則集合,因此屬於一種判別模型
0x2:決策樹模型
決策樹模型是一種描述對例項進行分類的樹形結構。決策樹由結點(node)和有向邊(directed edge)組成。結點有兩種型別
1. 內部節點(internal node):表示一個特徵維度或一個屬性 2. 葉節點:表示一個類
1. 決策樹學習
假設給定訓練資料集:,其中,為輸入例項(特徵向量),n為特徵個數,為類標記,,N 為樣本容量。學習模型的目標是根據給定的訓練資料集構建一個決策樹模型,使它能夠對例項進行正確的分類
2. 基於決策樹模型進行分類預測
用決策樹分類,從根節點開始,對例項的某一特徵維度進行測試,根據測試結果將例項分配到其子節點;
這時,每一個子節點對應著該特徵維度的一個取值(分類結果範圍);
如此遞迴地對例項進行測試和分配,直至達到葉節點;
最後將例項分到葉節點的類中,完成預測的過程
Relevant Link:
https://technet.microsoft.com/zh-cn/library/cc645758(v=sql.105).aspx http://www.jianshu.com/p/3997745880d4
3. 決策樹學習策略
我們知道,機器學習一般由模型、策略、演算法組成,這一章節我們來討論下決策樹的學習策略。學習策略的目標是通過一個可收斂函式將模型原本的最優求解難題轉化為一個數學上可解的方程式求解問題
決策樹學習本質上是從訓練資料集中歸納出一組分類規則,與訓練資料集擬合的決策樹可能有多個,也可能一個都沒有(當資料集中完全無規律時決策樹也無法建樹)。我們需要的是一個與訓練資料集擬合程度較好,同時具有很好的泛化能力的模型
0x1:結構化風險最小
決策樹學習用損失函式來表達對訓練資料的擬合以及泛化能力的目標,所以,決策樹學習的損失函式通常是正則化的極大似然估計。
決策樹學習的策略是以損失函式為目標函式的最小化,這對應於結構風險最小策略。
但是要明白的是,即使對於結點數量固定的樹,確定最優結構(包括每次劃分使用的輸入變數以及對應的閾值)來最小化平方和誤差函式的問題通常在計算上不可行的,因為可能的組合數量相當巨大,在這種情況求偏導極值計算量十分龐大。
所以,大多數時候:決策樹無法一步到位得到整個模型的結構!我們通常使用貪心的最優化演算法
0x2:次最優啟發策略
當損失函式確定以後,學習問題就變為在損失函式意義下選擇最優決策樹的問題,因為從所有可能的決策樹中選取最優決策樹是NP完全問題(搜尋空間過於龐大),所有現實中的決策樹學習通常採用啟發式方法,通過逐步逼近的思想,近似求解這一最優化問題。這樣得到的決策樹是次最優(sub-optimal)的
0x3:結構化風險和次最優啟發策略在建樹過程中的體現
決策樹學習的演算法通常是一個遞迴地選擇最優特徵,並根據該特徵對訓練資料進行分割,使得對各個子資料集有一個最好(區域性最好)的分類的過程 。這一過程對應著對特徵空間的一次次劃分,也對應著決策樹的構建
1. 開始,構建根節點,將所有訓練資料都放在根節點 2. 選擇一個最優特徵,選擇的標準是資訊增益(比)最大或基尼指數最小,即選擇能讓分類後的樣本純度最大的特徵維度。按照這一特徵將訓練資料集分隔成子集,使得各子集有一個在當前條件下最好的分類 3. 如果這些子集已經能夠被基本正確分類,那麼構建葉節點,並將這些子集分到所對應的葉節點中去; 4. 如果還有子集不能被"基本正確"分類(純度還不高),那麼就對這些子集繼續選擇新的最優特徵(區域性最優),繼續對其進行分割,構建相應的節點 5. 如此遞迴地進行下去,直至所有訓練資料子集被基本正確分類,或者沒有合適的特徵為止 6. 最後每個子集都被分到葉節點上,即都有了明確的類,這就生成了一棵決策樹
以上方法生成的決策樹可能對訓練資料有很好的分類能力,但對未知的測試資料卻未必有很好的分類能力,即可能發生過擬合現象。根據結構化風險最小策略思想,我們需要對已生成的樹自上而下進行剪枝,將樹變得更簡單(奧卡姆剃刀原則),從而使它具有更好的泛化能力
從貝葉斯後驗概率的角度來看,決策樹學習是由訓練資料集估計後驗條件概率模型。基於特徵空間劃分的類的條件概率模型有無窮多個(當然最大似然後驗概率只有一個)。我們選擇的條件概率模型應該不僅對訓練資料有很好的擬合而且對未知資料有很好的預測
Relevant Link:
http://scikit-learn.org/stable/modules/tree.html http://www.cnblogs.com/yonghao/p/5061873.html http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html http://blog.csdn.net/nieson2012/article/details/51314873 http://www.cnblogs.com/bourneli/archive/2013/03/15/2961568.html
4. 決策樹建樹演算法 - 對訓練樣本儘可能地擬合以符合經驗風險最小策略
0x1:特徵選擇
特徵選擇可謂決策樹建樹過程中非常核心關鍵的一部分,為什麼這麼說?
我們知道,感知機的分介面尋找過程基於的梯度下降演算法、KNN分類過程尋找最大後驗概率類演算法,其本質都符合經驗風險最小策略,即儘可能地去擬合已知的觀測樣本。到了決策樹這裡,情況依然沒有改變,同時決策樹是沿著特徵不斷地進行二叉切分,向下生長的樹形結構,經驗風險策略的體現就通過來特徵選擇來實現。為什麼這麼說?我這裡談一些我個人的理解:
1. 經驗風險的定義是:模型關於訓練資料集的平均損失稱為經驗風險(empirical risk);
2. 同時決策樹中特徵選擇的核心思想是"最大熵減",即每次選的特徵要讓當前剩餘樣本集的熵減少幅度最大,換句話說即每次選的特徵要讓當前剩餘樣本被誤分類的個數減少幅度最大;
3. 所以決策樹每次特徵選擇對應的損失都是區域性最優的,對於全域性整體來說,也是逼近全域性最優的,即符合經驗風險最小原則
但是經驗風險最小化畢竟只是一個思想,在決策樹演算法中有更加明確嚴格地對特徵選擇原則的定義,那就是資訊增益或資訊增益比
資訊增益的目的是為了更好地量化該如何評判不同特徵對建模效果的共享,而我們知道:
如果利用一個特徵進行分類的結果與隨機分類的結果沒有很大差別,則稱這個特徵是沒有分類能力的,扔掉這樣的特徵對決策樹學習的精確度影響不大
對於這個問題,我們可以用於生活上的例子來幫助理解:如果我們要從一群人裡分類出打籃球打的好的同學,我們手上現在有幾個特徵:年齡、性別、身高、體重、語文課成績。其中語文課成績這個特徵維度中,打籃球好的和打籃球壞的同學數量基本相同,即這個特徵維度下基本不包含有用的分類規律(就算知道了這個特徵的分佈也不能對我們的判斷起多大的幫助),所以直觀上這個特徵是可以丟棄的
這是直觀上的感覺,下面我們用資訊增益(比)和基尼指數來定量描述一個特徵的"可分類性"
1. 資訊增益
資訊增益的概念建立在熵與條件熵的基礎概念之上
1. 隨機變數的熵
在資訊理論與概率統計中,熵(entropy)是表示隨機變數不確定性的度量。設X是一個取有限個值的離散隨機變數,其概率分佈為:
則隨機變數X的熵定義為:。由定義可知,熵只依賴於X的分佈結構,而與X的具體取值無關,所以也可以將X的熵記作H(P),即:
熵值隨著隨機變數的不確定的增加而單調增大,從定義可驗證
當隨機變數符合伯努利分佈(只取兩個值,例如0,1)時,X的分佈為:
熵為:
這時,熵H(p)隨概率p變化的曲線如下圖所示
可以看到,X的概率分佈越接近於0.5(隨機分佈),則隨機變數的不確定性越大,熵越大。熵的極值是log2
2. 條件隨機變數的熵
設有隨機變數(X, Y),其聯合概率分佈為:
條件熵H(Y|X)表示在已知隨機變數X的條件下隨機變數Y的不確定性。隨機變數X給定的條件下隨機變數Y的條件熵(conditional entropy)。H(Y|X)定義為在給定X的條件下,Y的條件概率分佈的熵對X的數序期望
當熵和條件熵中的概率由觀察樣本資料估計(特別是極大似然估計)得到時,所對應的熵與條件熵分別稱為經驗熵(empirical entropy)和經驗條件熵(empirical conditional entropy)
3. 資訊增益定義
對熵和條件熵有所瞭解後我們來繼續討論資訊增益。資訊增益(information gain)表示獲得特徵X的資訊之後使得類Y的資訊的不確定性減少的程度,即我們能從特徵中得到多少有效資訊。特徵A對訓練資料集D的資訊增益g(D, A),定義為集合D的經驗熵H(D)與特徵A給定條件下D的經驗條件熵H(D|A)之差,即:
一般地,熵與條件熵之差稱為互資訊(mutual information)。決策樹中的資訊熵等價於訓練資料集中類與特徵的互資訊
顯然,對於資料集D而言,資訊增益依賴於特徵的選取,不同的特徵往往具有不同的資訊增益。
資訊增益大的特徵具有更強的分類能力,同時獲得更好的經驗風險
4. 資訊增益的演算法
設訓練資料集為D,| D | 表示其樣本容量,即樣本個數。設有K個類Ck,k=1,2,3...K。| Ck | 為屬於類Ck的樣本個數,。設特徵A有n個不同的取值{a1, a2, ...,an},根據特徵A的取值將D劃分為n個子集D1,D2,,..,Dn,| Dt | 為Dt的樣本個數,,記子集Di中屬於類Ck的樣本集合為Dik,即:,| Dik | 為Dik的樣本個數。資訊增益演算法公式如下
1. 計算資料集D的經驗熵H(D):
2. 計算特徵A對資料集D的經驗條件熵H(D|A):
3. 計算資訊增益:
下面舉一個具體的裡來說明如何用資訊增益來選擇一次特徵選擇中的區域性最佳特徵
樣本數:15 樣本類別 K = 2:是;否 特徵維度(屬性): 1)年齡:青年;中年;老年 2)有工作:是;否 3)有自己的房子:是;否 4)信貸情況:一般;好;非常好
首先計算經驗熵H(D)
:9個樣本分類是"是",6個樣本的分類是"否"。經驗熵H(D)代表的是未根絕特徵分類前當前樣本的不確定度
然後確定各特徵對資料集D的資訊增益,分別用A1、A2、A3、A4表示年齡、有工作、有自己的房子、信貸情況這4個特徵
特徵A將資料分為3類,每類都是5個,所以| Di | / | D | = 5/15。然後再計算被特徵A分類後的類和樣本label類的交集
1)g(D,A1) = H(D) - 【5/15 * H(D1) + 5/15 * H(D2) + 5/15 * H(D3)】 = 0.971 - 【5/15 * ( -2/5 * log2/5 - 3/5 * log3/5) + 5/15 * ( -2/5 * log2/5 - 3/5 * log3/5) + 5/15 * (-4/5 * log4/5 - 1/5 * log1/5) 】= 0.971 - 0.888 - 0.083 - 年齡在青年、中年、老年的子集中的經驗條件熵
2)g(D,A2) = H(D) - 【5/15 * H(D1) + 10/15 * H(D2) 】 = 0.971 - 【5/15 * 0 + 10/15 * ( -4/10 * log4/10 - 6/10 * log6/10) 】= 0.324
3)g(D,A3) = H(D) - 【6/15 * H(D1) + 9/15 * H(D2) 】 = 0.971 - 【6/15 * 0 + 9/15 * ( -3/9 * log3/9 - 6/9 * log6/9) 】= 0.971 - 0.551 = 0.420
4)g(D,A4) = 0.971 - 0.608 = 0.363
比較各特徵的資訊增益值,由於特徵A3(有自己的房子)的資訊增益值最大,所以選擇特徵A3作為本輪特徵選擇的最優特徵
5. 基於資訊增益的特徵選擇
根據資訊增益準則的特徵選擇方法是:對訓練資料集(或子集)D,計算其所有每個特徵的資訊增益,並比較它們的大小,選擇資訊增益最大的特徵
2. 資訊增益比
資訊增益值的大小是相對於訓練資料集而言的,容易受到訓練資料集的經驗熵的影響而變大變小。使用資訊增益比(information gain ratio)可以對這一問題進行校正,相當於根據資料集的經驗熵進行歸一化。
特徵A對訓練資料集D的資訊增益比定義為其資訊增益g(D,A)與訓練資料集D的經驗熵H(D)之比:
3. 基尼指數
基尼指數和資訊熵本質是一樣的,都是用於描述資料集混亂度的一種數學度量。在分類問題中,假設有K個類,樣本點屬於第k類的概率是Pk,則概率分佈的基尼指數定義為:
對於二分類問題,若樣本點屬於第一個類的概率是p,則概率分佈的基尼指數為:
對於給定的樣本集合D,其基尼指數為:,這裡Ck是D中屬於第k類的樣本子集,K是類的個數。注意因為實際概率我們不知道,只能用樣本分佈來估計概率p
1. 基於基尼指數來評估分類特徵的效果
資訊增益用分類前後的概率分佈的熵差值來體現分類的效果,基尼指數的核心思想也是類似的,基尼指數反映了樣本集的不確定性,基尼指數越大,樣本的不確定性就越大
如果樣本集合D根據特徵A是否取某個可能的值a被分隔成D1和D2兩部分,即:,則在特徵A的條件下,集合D的基尼指數定義為:
,基尼指數Gini(D)表示集合D的不確定性,基尼指數Gini(D, A)表示經A=a分隔後集合D的不確定性。和資訊增益一樣,基尼指數本質上也是在評估分類後的樣本純度
下圖顯示了二類分類問題中基尼指數Gini(p)、1/2 * 熵(單位位元)、分類誤差率的曲線關係
可以看出基尼指數和熵之半的曲線和接近,都可以近似地代表分類誤差率
Relevant Link:
http://zh.numberempire.com/graphingcalculator.php?functions=log%281-x%29%2C1%2F%28x-1%29
0x2:決策樹建樹具體演算法 - 工程化應用
上面討論的特徵選擇更多地是體現決策建樹的策略性指導原則,而在具體工程化領域應用這一原則構建決策樹需要有具體的演算法
決策樹學習的常用演算法有ID3、C4.5和CART,這3個演算法包括了特徵選擇、建樹訓練、剪枝過程(我們後面會討論),我們接下來分別討論每種演算法的主要思想以及演進情況
1. ID3演算法
ID3演算法的核心是在決策樹各個結點上應用資訊增益準則選擇特徵,遞迴地構建決策樹T
1. 若當天結點中的D所有例項都屬於同一類Ck,則T為單節點樹(這是建樹停止的強條件),並將類Ck作為該節點的類標記。返回T 2. 若當前可選取的特徵A為空(即無特徵可選),則T為單節點樹,並將D中例項數最大的類Ck作為該結點的類標記(有可能純度未達到100%),返回T 3. 否則,從當前D中計算所有特徵的資訊增益,選擇資訊增益最大的特徵Ag,如果Ag對應的資訊增益小於收斂閾值(類似於損失函式減少量閾值,用於提前終止,快速收斂),則設定T為單節點樹,並將當前D中例項數量最大的類Ck作為該結點類標記,返回T 4. 否則,對Ag的每一可能取值ai,依照Ag = ai將D分割成若干非空子集Di,將Di中例項數最大的類作為標記,構建子結點,由結點及其子節點溝通樹T,返回T 5. 對第i個子結點,已Di為訓練集,以A-{Ag}為特徵集(在剩下來的特徵中繼續尋找最優),遞迴地呼叫1~4步。得到子樹Ti,返回Ti
ID3相當於用極大似然法進行概率模型的選擇
回到上面"貸款申請樣本表"的例子中,使用ID3來生成決策樹
1. 由於特徵A3(有自己的房子)的資訊增益最大,所以選擇特徵A3作為根節點的特徵。它將訓練資料集D劃分為兩個子集D1(A3取值為"是")和D2(A3取值為"否") 2. 由於D1只有同一類label的樣本(即純度已經100%),即"有自己房子"的樣本的label都是能夠予以放款。所以D1成為一個葉節點,結點的類標記為"是" 3. 對D2則需要從特徵A1(年齡)、A2(有工作)和A4(信貸情況)中選擇新的特徵,計算各個特徵的資訊增益 g(D2,A1) = H(D2) - H(D2 | A1) = -3/9 * log3/9 - 6/9 * log6/9 - H(D2 | A1) = 0.918 - H(D2 | A1)= 0.918 -【4/9* H(D21) + 2/9 * H(D22) + 3/9 * H(D23)】 = 0.918 - 【4/9 * ( -3/4 * log3/4 - 1/4 * log1/4) + 2/9 * 0 + 3/9 * (-2/3 * log2/3 - 1/3 * log1/3) 】= 0.918 - 0.667 = 0.251 g(D2,A2) = H(D2) - H(D2 | A2) = 0.918 g(D2,A4) = H(D2) - H(D2 | A4) = 0.474 # 可以看到,在條件概率對應的特徵Ag下,如果依據該特徵進行分類後,不管label是哪一類,只要純度最高,則對應的資訊增益就是最高的,資訊增益關注的是分類後的純度 4. 選擇資訊增益最大的A2(有工作)作為結點的特徵 5. 由於A2有兩個可能的取值: 1)一個對應"是"(有工作)的子結點,包含3個樣本,它們屬於同一類,所以這就是一個葉節點,標記為"是"; 2)另一個是對應"否"(無工作)的子節點,包含6個樣本,它們也屬於同一類,所以這也是一個葉節點,類標記為"否" 6. 由於到了這一步後,所以子節點的純度都已經到100%,因此建樹過程結束
需要注意的是,ID3演算法只有樹的生成,所以該演算法生成的樹容易產生過擬合
2. C4.5演算法
C4.5演算法與ID3的建樹過程相似,所區別的是,C4.5對特徵選擇進行優化,採用了資訊增益比來選擇特徵
3. CART演算法
分類與迴歸樹(classification and regression tree CART)模型是一種廣泛應用的決策樹學習演算法。它同樣由特徵選擇、樹的生成以及剪枝組成,既可以用於分類也可以用於迴歸
CART是在給定輸入隨機變數X條件下輸出隨機變數Y的條件概率分佈的學習方法,和ID3和C4.5不同的是(ID3和C4.5可以支援多叉樹),CART假設決策樹是二叉樹,內部結點特徵的取值永遠為"是"和"否"
1. 左分支是取值為"是"的分支 2. 右分支有取值為"否"的分支
這樣的決策樹等價於遞迴地二分每個特徵,將輸入空間即特徵空間遞迴地劃分為2的指數倍個單元,並在這些單元上根據訓練資料推測出條件概率分佈
1. 迴歸樹的生成
決策樹的生成就是遞迴地構建二叉決策樹的過程,對迴歸樹用平方誤差最小化策略(迴歸問題)
迴歸問題和分類問題不同,迴歸問題本質上一個擬合問題,迴歸樹的建立和分類數建立有幾個最大的不同
1. 分類樹對特徵空間的劃分是針對離散的特徵(例如年齡、收入、工作等)進行的,而回歸樹的特徵數量往往是一個連續區間(例如【0,10.5】),迴歸樹是將特徵空間"取樣化"成m個數量的區域Rm,只要落在這個區域內的特徵,不管其值如何,都統一歸一化為同一個特徵值 2. 分類樹的輸入樣本在一個特徵中的特徵值是離散有限的,但是迴歸樹的輸入樣本在一個特徵中的特徵值是連續無限的,所以迴歸樹這裡最重要的"取樣思想",在每個特徵單元Rm上有一個固定的輸出值Cm,本質上就是用線性分類器在對連續變數進行離散的擬合
用skilearn官方的例子來說明迴歸樹(depth = 2)的非線性資料擬合問題
# -*- coding: utf-8 -*- # Import the necessary modules and libraries import numpy as np from sklearn.tree import DecisionTreeRegressor import matplotlib.pyplot as plt import pydotplus from sklearn import tree # Create a random dataset rng = np.random.RandomState(1) X = np.sort(5 * rng.rand(80, 1), axis=0) y = np.sin(X).ravel() y[::5] += 3 * (0.5 - rng.rand(16)) # Fit regression model regr_1 = DecisionTreeRegressor(max_depth=2) regr_2 = DecisionTreeRegressor(max_depth=5) print X print y regr_1.fit(X, y) regr_2.fit(X, y) # Predict X_test = np.arange(0.0, 5.0, 0.01)[:, np.newaxis] y_1 = regr_1.predict(X_test) y_2 = regr_2.predict(X_test) # generate a PDF file ''' dot_data = tree.export_graphviz(regr_1, out_file=None) graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf("dt_2.pdf") dot_data = tree.export_graphviz(regr_2, out_file=None) graph = pydotplus.graph_from_dot_data(dot_data) graph.write_pdf("dt_5.pdf") ''' # Plot the results plt.figure() plt.scatter(X, y, c="darkorange", label="data") plt.plot(X_test, y_1, color="cornflowerblue", label="max_depth=2", linewidth=2) #plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=5", linewidth=2) plt.xlabel("data") plt.ylabel("target") plt.title("Decision Tree Regression") plt.legend() plt.show()
列印出模型引數
我們先用不太嚴謹粗糙的語言描述整個建樹和預測過程,以期對決策迴歸樹有一個直觀的理解,之後再詳細討論它的演算法過程公式
1. 該樣本總共有80個,特徵為X座標,特徵值為Y座標,這樣很利於我們畫圖視覺化和理解 2. 迴歸樹遍歷所有特徵,嘗試將每個特徵作為切分變數,並計算在該切分點下,兩邊區間Rm的最小平方誤差Cm(Cm是一定可以算出來的) 3. 在第一輪選擇中,迴歸樹最終選擇了3.1328這個點,這時候 1)左區間的最優輸出值(即取樣值)(其實就是均值)是0.5712 2)右區間的最優輸出值是-0.6675 4. 由於我們指定了樹深度為2,所以迴歸樹繼續遞迴地在第一輪分出的子區間中尋找最優切分點 1)這一次在左區間找到了0.5139 2)在右區間找到了3.8502 5. 根據新的切分點將左右子區間再次切分成子區間,這樣就有4個區間了:R1【0: 0.5139】;R2【0.5139: 3.1328】;R3【3.1328: 3.8502】;R4【3.8502: 5】,這4個區間的輸出值就是這4個區間的樣本均值: Cm1 = 0.0524;Cm2 = 0.7138;Cm1 = -0.4519;Cm1 = -0.8686;
可以看到,隨著depth深度的增大,迴歸樹會逐漸從取樣分類問題演進為曲線擬合問題,但depth的增加也會加劇過擬合的產生。即迴歸樹對訓練資料擬合的很精確,但是泛化能力會下降
接下來用公式化描述迴歸樹建樹過程
一個迴歸樹對應著輸入空間(即特徵空間)的一個劃分以及在劃分的單元上的輸出值(在連續值中取離散值)。假設已將輸入空間分化為M個單元R1,...Rm,並且在每個單元Rm上有一個固定的輸出值Cm,於是迴歸樹模型可以表示為:。當輸入空間的劃分確定時,可以用平方誤差來表示迴歸樹對於訓練資料的預測誤差,用平方誤差誤差最小的準則求解每個單元上的最優輸出值。根據高斯正態分佈可知,單元Rm上的Cm的最優值是Rm上所有輸入例項Xi對應的輸出Yi的均值,即:。得到了Cm,我們就可以計算在一個特定切分變數情況下,左右子區間的最小平方誤差了
1. CART採取啟發式的方法,遍歷當前所有特徵中選擇第 j 個變數(特徵)作為切分變數,切分變數確定後,特徵就被切分成了左右子區域:
2. 在一輪特(切分變數)徵選擇中有很多選擇,我們通過下面公式,得到最優的切分變數以及它的切分點(切分點就是區域內的特徵均值):
3. 用選定的(切分變數 j,切分點 s)劃分割槽域並決定相應的輸出值:
4. 繼續遞迴地對左右子區間進行2~3步驟,直至滿足終止條件
5. 將輸入特徵空間劃分為M個區域R1...Rm,生成決策樹:。決策時是針對特徵進行預測
2. 分類樹的生成
對分類樹(分類問題)用基尼指數(Gini Index)最小化策略,進行特徵選擇,生成二叉樹
分類樹用基尼指數(類似與資訊增益的思想)選擇最優特徵,同時決定該特徵的最優二值切分點。根據訓練資料集,從根節點開始,遞迴地建樹
1. 設結點的訓練資料集為D,計算現有特徵對該資料集的基尼指數。遍歷所有特徵,計算每個特徵分類後的條件基尼指數 2. 在所有可能的特徵A以及它們所有可能的切分點a中,選擇基尼指數最小的特徵及其切分點(均值)作為最優特徵和最優切分點。將訓練集分配到這兩個子節點中 3. 對兩個子節點遞迴地呼叫1、2過程,直至滿足條件。(結點中的樣本個數小於閾值、或樣本集的基尼指數小於閾值)、或者沒有更多特徵 4. 生成CART決策樹
CART建樹為了實現二分類,不僅要評估切分變數(特徵),還在要特徵的可能取值中選出一個最佳切分點用於二分類(壓縮),還是用之前的放貸的資料集作為例子,約定數學代號
A1:年齡 1:青年 2:中年 3. 老年 A2:有工作 1. 有工作 2. 無工作 A3:有自己的房子 1. 有房子 2. 無房子 A4:信貸情況 1. 非常好 2. 好 3. 一般
求特徵A1的基尼指數,遍歷所有可能值作為切分點
Gini(D,A1 = 1) = 5/15 * (2 * 2/5 * (1 - 2/5)) + 10/15 * (2 * 7/10 * (1 - 7/10)) = 0.44
Gini(D,A1 = 2) = 5/15 * (2 * 3/5 * (1 - 3/5)) + 10/15 * (2 * 6/10 * (1 - 6/10)) = 0.48
Gini(D,A1 = 3) = 5/15 * (2 * 4/5 * (1 - 4/5)) + 10/15 * (2 * 5/10 * (1 - 5/10)) = 0.44
由於Gini(D,A1 = 1)和Gini(D,A1 = 3)相等,且最小,所以A1=1、A1=3都可以選作A1的最優切分點,注意這時候還不確定是否A1就是本輪的最優切分變數
求特徵A2、A3的基尼指數,遍歷所有可能值作為切分點
Gini(D,A2 = 1) = 0.32
Gini(D,A3 = 1) = 0.27
由於A2、A3內都只有兩個特徵值,無論選誰作為切分點都是一樣的,因此不需要選擇
求特徵A4的基尼指數,遍歷所有可能值作為切分點
Gini(D,A4 = 1) = 0.36
Gini(D,A4 = 2) = 0.47
Gini(D,A4 = 3) = 0.32
Gini(D,A4 = 3) = 0.32最小,所以A4 = 3作為A4的最優切分點
總體比較所有(切分變數,切分點)對,Gini(D,A3 = 1) = 0.27最小,所以特徵A3(是否有自己房子)為最優特徵,A3=1為最優切分點(即有自己房子)。於是根節點生成2個子結點,一個是葉節點(A3已不可再分),另一個作為新的資料集繼續用以上方法尋找最佳切分變數和切分點
Relevant Link:
https://cethik.vip/2016/09/21/machineCAST/
5. 決策樹剪枝演算法 - 在樣本擬合和模型複雜度間動態平很以符合結構風險最小策略
所有的機器學習模型都要遵循一個原則:"Be Simple",在深度神經網路中的正則化項、DropOut;貝葉斯概率模型中的經驗風險和結構風險(複雜度懲罰項);還是到決策樹中的剪枝都體現了這種策略思想,在相同的分類效果下,越簡單的模型往往具備越好的泛化能力
決策樹生成演算法遞迴地產生決策樹,直到不能繼續下去為止(沒有可選特徵、資訊增益小於閾值、子集中純度達到100%)。這樣產生的樹往往對訓練資料的分類很準確,但是對未知的測試資料卻效果沒那麼好,即出現過擬合現象。回想上面的貸款例子,在第二輪選擇A2特徵(有工作)作為分類特徵時,如果被分出來的子集中類label的純度不是如題的100%,而是包含了一些噪音資料,則決策樹還會繼續遞迴下去,但也許這些噪音資料並不代表該分類問題真實的規律,這樣建出來的樹在之後的predict中對包含這部分噪音特徵範圍的樣本就會預測失敗,決策樹的過分細分導致出現過擬合現象
0x1: 對噪音資料過於敏感導致過擬合
在討論剪枝之前,我們先來探討下決策樹在建樹過程中,對噪音資料處理能力較差的問題,決策樹的建樹過程有點像物盡其類,如果不設定MAX Depth或者最小葉子數,決策樹會不斷遞迴地去把樣本中的所有樣本都分到對應的label類中
下面我們通過一個逐步加深決策樹深度的例子來說明決策樹建樹過程中的過擬合現象,基於bag of word onehot模型對標記了"好/壞"傾向性的評論語料集進行訓練,例如下面的句子,句首的數字代表了label
1 originally launched in 1978 , this popular film was re-introduced in 1998 to a whole new generation of moviegoers . based on the mighty successful musical from broadway , grease was followed in 1980 with the less stellar grease 2 ( 6 . 5/10 ) , starring a young michelle pheiffer in one of her first feature film roles . plot : high-school musical set in the 1950's showcasing the relationship between the cool danny zuko of the t-birds ( travolta ) and the innocent and pure sandy olsen ( newton-john ) from australia . the film follows the couple and their vivacious friends during their last year at rydell high through song , dance and humour . critique : fun-loving , energetic and innocent look back at times much simpler . this movie effectively juggles a thin romantic story line and the overall experience of the 1950's , with a superb soundtrack and some great dance numbers . admittedly , i am somewhat biased in this opinion , since this film blasts me into my past as a rebellious youth ( grease was one of schmoe's first big-screen experiences , and every other scene sends me reeling into the times of my elaborate grease bubble-gum card collection ) , and the lesser responsibilities that i possessed at that time . but apart from the nostalgic vibe , i was still extremely impressed by this film , as it continued to amuse me , despite my previous dozen or so viewings . this film took john travolta from a dim-witted " sweathog " on tv's welcome back kotter , and transformed him into a movie-star of spectacular proportions ( saturday night fever ( 7 . 5/10 ) in 1979 confirmed that sudden popularity ) . unfortunately for the rest of the cast , his popularity was not terribly contagious , despite their effective showings in this classic movie . on the down side , some of the absolute innocence in this film might bore or turn people off ( like when sandy sings about " drinking lemonade " and " staying out until 10 " with danny in " summer nights " ) , and the plot isn't exactly the most elaborate story-line ever created , but despite these small reservations , this movie carries enough great music and high energy to keep anyone amused through its rapid 110 minute running time ( and believe me . . . i am not a fan of the musicals ! ! ) . make sure to look for a young lorenzo lamas in the static role of the brainless football player , as well as the national bandstand dance contest as one of the film's absolute highlights . and don't forget to buy the popular soundtrack afterwards , so that you could listen to its peppy tunes whenever you're feeling a little blue . little known facts : henry winkler , of tv's happy days' fonzie fame , turned down the part of danny zuko because he did not want to be typecast for the rest of his career . both travolta and conaway were smitten by newton-john during the filming of this picture . conaway eventually bowed out of the woo-fest , and married newton-john's sister a year later ( divorced after five years ) .
0 confucius once said , " governing a nation is like cooking a small fish -- don't overdo it . " his maxim might be easily applied to writing a comedy script , for quantity over quality is one of the worst mistakes an amateur scribe can make . granted , mike judge , writer-director of the workplace satire office space isn't exactly an amateur ( his most infamous work , the mtv series " beavis and butt-head " was pure gold for its network ) . but unfailingly , judge manages to make some rather inexcusable mistakes in office space by spreading an iffy plot over too much ground . the iffiness in judge's plot -- a group of coworkers plan the downfall of their despicable boss -- is not in its appeal . in fact , based on the popularity of scott adams' cartoon " dilbert , " which will soon have its own television series , a satirical view of the american workplace is a hot item in hollywood . unfortunately the concept lends itself to skit-length sequences which would be more at home on the set of " saturday night live " rather than a full-length feature . the most convincing evidence of this are the trailers for office space , which feature almost all of the movie's top content ; this leaves the actual picture appearing very deflated . other evidence of office space's failure to work are its lack of good jokes . the comedy is marginally funny at best , but not enough to get a packed house of theater-goers to laugh out loud . the material in the movie is on-key for an older demographic than judge is used to targeting , and this could partially explain his work here . however , the movie is loaded with too many misfires -- including the token plot -- to allow for any excuse . the plot centers around three or four cubicled engineers , headed up by peter gibbons ( ron livingston ) , at a company named initech . after the movie elaborately establishes the miserable working conditions at initech , the movie introduces us to two consultants ( john c . mcginley and paul willson ) which are in charge of " downsizing " the company's payroll . when peter and his gang learns of this , as well as the reason behind it -- so their smooth talking boss bill lumbergh ( gary cole ) 's stock will go up -- they set about creating a plan to see his downfall . the circumstances that follow were obviously intended to be hilarious but they come out as anything but . a sympathetic cast and a muddled jennifer aniston-as-love-interest subplot are all that keep this one together , but it's definitely missable in lieu of something more intelligent .
向量化後得到一個3473維度的定長vector
1. depth = 1
bad? -N-> class 1 (333 for class 0, 533 for class 1) -Y-> class 0 (358 for class 0, 176 for class 1)
上圖表明,決策樹通過資訊增益或者基尼指數計算得到1078維度的特徵的分類能力最強,即根據"bad"這個詞進行二分類
1. 被分到True類(class = 1)的866個樣本中 1) 533的label class = 1 2) 333的label class = 0:看起來還有很多樣本雖然在這個維度分類點有相同的區間範圍,但是一定還在其他維度有不同的表現,似乎還應該繼續分下去 2. 被分到False類(class = 0)的534個樣本中 1) 358的label class = 0 2) 176的label class = 1
分別檢視當前模型對訓練集、驗證機、和測試集的準確度
# Accuracy of training set print np.mean(dt.predict(X_tr) == Y_tr) 0.636428571429 # Accuracy of dev set print np.mean(dt.predict(X_de) == Y_de) 0.605 # Accuracy of test set print np.mean(dt.predict(X_te) == Y_te) 0.595
可以當前模型對訓練資料的準確度為63%(但是注意是訓練集,對訓練集的準確度並不能說明泛化能力,對訓練集的準確度只能說明模型對訓練資料的擬合程度)
2. depth = 2
我麼看到,僅在深度為1的情況下,決策樹的分類還不夠徹底,每一類中還有很多類明顯和該類不相容(純度還不夠),應該還可以再分,我們把深度提高到2
bad? -N-> worst? | -N-> class 1 (281 for class 0, 514 for class 1) | -Y-> class 0 (52 for class 0, 19 for class 1) -Y-> stupid? | -N-> class 0 (281 for class 0, 168 for class 1) | -Y-> class 0 (77 for class 0, 8 for class 1) 0.66 0.62 0.615
這一次,所有集合中的準確度都有所提高
3. depth = 3
bad? -N-> worst? | -N-> many? | | -N-> class 1 (204 for class 0, 274 for class 1) | | -Y-> class 1 (77 for class 0, 240 for class 1) | -Y-> present? | | -N-> class 0 (52 for class 0, 13 for class 1) | | -Y-> class 1 (0 for class 0, 6 for class 1) -Y-> stupid? | -N-> wonderfully? | | -N-> class 0 (280 for class 0, 153 for class 1) | | -Y-> class 1 (1 for class 0, 15 for class 1) | -Y-> bob? | | -N-> class 0 (76 for class 0, 4 for class 1) | | -Y-> class 1 (1 for class 0, 4 for class 1) 0.676428571429 0.645 0.625
4. depth = 4
bad? -N-> worst? | -N-> many? | | -N-> dull? | | | -N-> class 1 (184 for class 0, 271 for class 1) | | | -Y-> class 0 (20 for class 0, 3 for class 1) | | -Y-> ludicrous? | | | -N-> class 1 (70 for class 0, 240 for class 1) | | | -Y-> class 0 (7 for class 0, 0 for class 1) | -Y-> present? | | -N-> brilliant? | | | -N-> class 0 (52 for class 0, 9 for class 1) | | | -Y-> class 1 (0 for class 0, 4 for class 1) | | -Y-> class 1 (0 for class 0, 6 for class 1) -Y-> stupid? | -N-> wonderfully? | | -N-> life? | | | -N-> class 0 (205 for class 0, 79 for class 1) | | | -Y-> class 0 (75 for class 0, 74 for class 1) | | -Y-> area? | | | -N-> class 1 (0 for class 0, 15 for class 1) | | | -Y-> class 0 (1 for class 0, 0 for class 1) | -Y-> bob? | | -N-> buddy? | | | -N-> class 0 (76 for class 0, 2 for class 1) | | | -Y-> class 1 (0 for class 0, 2 for class 1) | | -Y-> falls? | | | -N-> class 1 (0 for class 0, 4 for class 1) | | | -Y-> class 0 (1 for class 0, 0 for class 1) 0.699285714286 0.645 0.635
5. depth = 5
bad? -N-> worst? | -N-> many? | | -N-> dull? | | | -N-> both? | | | | -N-> class 1 (149 for class 0, 164 for class 1) | | | | -Y-> class 1 (35 for class 0, 107 for class 1) | | | -Y-> terrific? | | | | -N-> class 0 (20 for class 0, 1 for class 1) | | | | -Y-> class 1 (0 for class 0, 2 for class 1) | | -Y-> ludicrous? | | | -N-> awful? | | | | -N-> class 1 (61 for class 0, 236 for class 1) | | | | -Y-> class 0 (9 for class 0, 4 for class 1) | | | -Y-> class 0 (7 for class 0, 0 for class 1) | -Y-> present? | | -N-> brilliant? | | | -N-> approach? | | | | -N-> class 0 (52 for class 0, 6 for class 1) | | | | -Y-> class 1 (0 for class 0, 3 for class 1) | | | -Y-> class 1 (0 for class 0, 4 for class 1) | | -Y-> class 1 (0 for class 0, 6 for class 1) -Y-> stupid? | -N-> wonderfully? | | -N-> life? | | | -N-> plausible? | | | | -N-> class 0 (205 for class 0, 73 for class 1) | | | | -Y-> class 1 (0 for class 0, 6 for class 1) | | | -Y-> else? | | | | -N-> class 1 (54 for class 0, 70 for class 1) | | | | -Y-> class 0 (21 for class 0, 4 for class 1) | | -Y-> political? | | | -N-> class 1 (0 for class 0, 15 for class 1) | | | -Y-> class 0 (1 for class 0, 0 for class 1) | -Y-> bob? | | -N-> meeting? | | | -N-> treats? | | | | -N-> class 0 (75 for class 0, 0 for class 1) | | | | -Y-> class 1 (1 for class 0, 2 for class 1) | | | -Y-> class 1 (0 for class 0, 2 for class 1) | | -Y-> give? | | | -N-> class 1 (0 for class 0, 4 for class 1) | | | -Y-> class 0 (1 for class 0, 0 for class 1) 0.722857142857 0.62 0.6425
可以看到,當深度提高到5的時候,訓練準確度繼續提高,但是dev和test卻出現了小幅下降以及保持持平,這說明開始出現了過擬合的現象,繼續往下實驗可以發現,從6開始,泛化能力就逐漸走下坡路了,這說明過深的決策樹過分地捕獲了細節資訊,導致將噪音特徵作為判斷依據,最終導致泛化能力下降
6. depth range(1, 40)
我們列印從depth = 1到depth = 40的train/dev/test的準確度曲線
可以看到,在depth = 25的時候,train的準確度到達了極限,很可能是葉子已經不可再分了,而從depth = 5開始,就出現了過擬合現象,之後隨著depth的增加,dev和test的準確度都在不斷波動
0x2: 緩解過擬合的策略 - 剪枝
過擬合的原因在於學習時過多地考慮如何提高對訓練資料的正確分類,從而構建出過於複雜的決策樹,解決這一問題的思路是將已生成的樹進行簡化,即剪枝(pruning)。具體的,剪枝從已生成的樹上裁掉一些子樹或葉節點,並將其根節點或父節點作為新的葉節點,從而簡化分類樹模型
剪枝的原理和Dropout是相通的,不過其更本質的目的是降低模型的複雜度
0x3: 剪枝策略
決策樹的剪枝往往通過極小化決策樹整體的損失函式(loss function)或代價函式(cost function)來實現。
設樹T的葉節點個數為|T|,葉節點個數和樹複雜程度呈比例上升趨勢,t是樹T的葉節點,該葉節點有Nt個樣本點,其中k類的樣本點有Ntk個(每個葉節點可能純度不一定都100%,所以可能包含K類),Ht(T)為葉節點t上的經驗熵,a>=0為引數,則決策樹學習的損失函式可以定義為:,其中經驗熵為:
所以損失函式的第一項C(T)可寫為:
這時有:,其中
1. C(T)只由訓練資料決定,它反映了模型對訓練資料的預測誤差,即模型與訓練資料的擬合程度 2. | T | 表示模型複雜度(等比於葉節點個數) 3. 引數 a>=0 控制兩者之間的平衡 1)較大的a的情況下:| T | 就被迫要儘量小,但是C(T)相對地就會增加,這動態地促使模型選擇較簡單的模型(淺樹) 2)較小的a的情況下:| T | 就被迫要儘量大,C(T)就會相對地減小,促使選擇較複雜的模型(深樹)
剪枝,就是當a確定時,選擇損失函式最小的模型,即損失函式最小的子樹。當a值確定時
1. 子樹越大,往往與訓練資料的擬合越好,但是模型的複雜度就越高 2. 相反子樹越小,模型的複雜度就越低,但是往往與訓練資料的擬合不好
損失函式動態地調整了對兩者的平衡。可以看到,上面定義的損失函式的極小化策略等價於正則化的極大似然估計。所以,利用損失函式最小原則進行剪枝就是用正則化的極大似然估計進行模型選擇
注意:上式中的C(T)即對訓練資料的預測誤差,也可以用基尼指數來評估(CART剪枝),用經驗熵來評估就是ID3/C4.5剪枝
0x4: 剪枝過程
1. 計算當前樹中每個結點的經驗熵
2. 遞迴地從樹的葉節點向上回縮,即將葉節點歸併到其父節點中
3. 設一組葉節點回縮到其父節點之前與之後的整體樹分別為Tb與Ta,其對應的損失函式值分別是:Ca(Tb)與Ca(Ta)。如果:Ca(Ta) <= Ca(Tb)。即損失函式減小了,說明這個剪枝給整棵樹帶來了正向的幫助,則進行剪枝,即將葉節點歸併到父節點中,將父節點作為新的葉節點
4. 遞迴地進行2~3過程,直至不能繼續或者損失函式不再減小為止,最終得到損失函式最小的子樹Ta
Relevant Link:
https://github.com/hal3/ciml https://github.com/hal3/ciml/tree/master/labs/lab1-DTs-and-overfitting http://ciml.info/dl/v0_99/ciml-v0_99-ch01.pdf http://scikit-learn.org/stable/auto_examples/tree/plot_tree_regression.html
Copyright (c) 2017 LittleHann All rights reserved