1. 算法概述
決策樹(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分類過程尋找最大后驗概率類算法,其本質都符合經驗風險最小策略,即盡可能地去擬合已知的觀測樣本。到了決策樹這里,情況依然沒有改變。決策樹本質上是在高維特征空間不斷地進行二叉切分,每次尋找一個分界面,不斷向下生長樹形結構。
而經驗風險策略的體現就通過來特征選擇來實現,為什么這么說?
經驗風險的定義是,“模型關於訓練數據集的平均損失稱為經驗風險(empirical risk)”,同時決策樹中特征選擇的核心思想是"最大熵減",即每次選的特征要讓當前剩余樣本集的熵減少幅度最大,換句話說即每次選的特征要讓當前剩余樣本被誤分類的個數減少幅度最大。所以決策樹每次特征選擇對應的損失都是局部最優的,對於全局整體來說,也是逼近全局最優的,即符合經驗風險最小原則。
接下來的問題就是如何在每次節點分裂的時候選擇最合適的屬性,從而使整體上滿足經驗風險最小化原則呢?
接下來我們用一種演進迭代的方式,逐步介紹和討論為什么決策樹發展處了如今我們看到的這樣的形式,揭示出其演進的底層邏輯。
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的樣本個數。信息增益算法公式如下
- 計算數據集D的經驗熵H(D):
- 計算特征A對數據集D的經驗條件熵H(D|A):
- 計算信息增益:
下面舉一個具體的里來說明如何用信息增益來選擇一次特征選擇中的局部最佳特征
樣本數: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類的交集:
- 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 - 年齡在青年、中年、老年的子集中的經驗條件熵
- 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
- 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
- g(D,A4) = 0.971 - 0.608 = 0.363
比較各特征的信息增益值,由於特征A3(有自己的房子)的信息增益值最大,所以選擇特征A3作為本輪特征選擇的最優特征
5)基於信息增益的特征選擇
根據信息增益准則的特征選擇方法是:對訓練數據集(或子集)D,計算其所有每個特征的信息增益,並比較它們的大小,選擇信息增益最大的特征
6)高度分支屬性問題 - 信息增益驅動的屬性分裂標准存在的問題
盡管信息增益看起來很合理,但是我們稍加思考就會發現,其本質是一種絕對數值的比較,當某些屬性擁有的可能值的數量很大,從而使分支的路徑增加,產生很多子節點時,計算信息增益就會出現問題。這個問題和向量空間中兩個向量比較大小所遇到的問題是一樣的,即沒有考慮放縮性。
怎么理解上面這句話呢?我們用一個極端的例子來說明。當數據集的某個屬性對於每一個示例存在不同的屬性值時,例如標識碼屬性(每個屬性值是一個唯一的標識碼)。
帶有標識碼的天氣數據
對ID code屬性進行分裂來產生樹
從上面的表中可以看到,如果將ID code的每一項都分裂為一個獨立的分支,從而每一項的信息熵就都為0,簡單的計算會發現,這種分裂方式得到的信息增益是最大的,因為這就是一個完美分類嘛。
但是很顯然,在標識碼屬性上的分支對預測未知實例的類別沒有任何幫助,也沒能描述任何有關決策樹的結構信息。換言之,這種分裂方式過擬合了。
由此可見,采用度量信息增益的方法會傾向於選擇擁有較多可能屬性值的屬性,為了彌補這一缺陷,學者們引入了增益率(gain ratio)也叫信息增益比的修正度量方法,增益率綜合考慮了屬性分裂數據集后所產生的子節點的數量和規模,以及信息增益的影響。我們下一章節就會討論它。
2. 信息增益比
以信息增益作為划分訓練數據集的特征,存在偏向於選擇取值較多的特征的問題。使用信息增益比(information gain ratio)可以對這一問題進行校正,這是特征選擇的另一准則。
特征 A 對訓練數據集 D 的信息增益比 gR(D,A) 定義為其信息增益 g(D,A) 與訓練數據集 D 關於特征 A 的值的熵 HA(D) 之比,即:
其中,
,n 是特征 A 取值的個數
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,我們就可以計算在一個特定切分變量情況下,左右子區間的最小平方誤差了
- CART采取啟發式的方法,遍歷當前所有特征中選擇第 j 個變量(特征)
作為切分變量,切分變量確定后,特征就被切分成了左右子區域:
- 在一輪特(切分變量)征選擇中有很多選擇,我們通過下面公式,得到最優的切分變量以及它的切分點(切分點就是區域內的特征均值):
- 用選定的(切分變量 j,切分點 s)划分區域並決定相應的輸出值:
- 繼續遞歸地對左右子區間進行2~3步驟,直至滿足終止條件
- 將輸入特征空間划分為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