在2006年12月召開的 IEEE 數據挖掘國際會議上(ICDM, International Conference on Data Mining),與會的各位專家選出了當時的十大數據挖掘算法( top 10 data mining algorithms ),能夠參見文獻【1】。本博客已經介紹過的位列十大算法之中的算法包括:node
本文主要介紹機器學習中的決策樹模型。決策樹模型是一類算法的集合,在數據挖掘十大算法中,具體的決策樹算法佔有兩席位置,即C4.5和CART算法,本文都會介紹到它們。算法
歡迎關注白馬負金羈的博客 http://blog.csdn.net/baimafujinji,爲保證公式、圖表得以正確顯示,強烈建議你從該地址上查看原版博文。本博客主要關注方向包括:數字圖像處理、算法設計與分析、數據結構、機器學習、數據挖掘、統計分析方法、天然語言處理。數據結構
分類(Classification)任務就是肯定對象屬於哪一個預約義的目標類。分類問題不只是一個廣泛存在的問題,並且是其餘更加複雜的決策問題的基礎,更是機器學習和數據挖掘技術中最龐大的一類算法家族。咱們前面介紹過的不少算法(例如SVM,樸素貝葉斯等)均可以用來解決分類問題。做爲本文的開始,咱們首先來簡單回顧一下什麼是分類。dom
假設咱們如今有以下表所示的一個屬性集(feature set),它收集了幾個病患的症狀和對應的病症。症狀包括頭疼的程度、咳嗽的程度、體溫以及咽喉是否腫痛,這些症狀(feature)的組合就對應一個病症的分類(Cold 仍是 Flu)。機器學習
分類問題的本質就是當給定這樣一個數據集後,要求咱們訓練出(或創建)一個模型f。當出現一組新的特徵向量時,要求咱們預測(或判斷)擁有這樣一組特徵向量的對象應當屬於哪一個類別。就咱們如今給出的例子而言,假設你是一名醫生,如今收治了一位新的病患,而後你經過問診得知他的一些症狀(包括頭疼的程度、咳嗽的程度、體溫以及咽喉是否腫痛),而後你就要根據你已經創建好的模型來判斷該病人得的究竟是Cold(普通感冒)仍是Flu(流行性感冒)。學習
分類問題的類別數目能夠是兩類也能夠是多類。二分類問題是最簡單的分類問題,而多分類問題模型能夠在二分類模型的基礎上進行構建。咱們在前面文章中一直使用的鳶尾花數據集就是一個典型的多分類問題,問題的最終目標是判斷給定一朵花,它應該屬於setosa、versicolor和virginica中的哪一類。測試
決策樹是一種用於對實例進行分類的樹形結構。決策樹由節點(node)和有向邊(directed edge)組成。節點的類型有兩種:內部節點和葉子節點。其中,內部節點表示一個特徵或屬性的測試條件(用於分開具備不一樣特性的記錄),葉子節點表示一個分類。大數據
一旦咱們構造了一個決策樹模型,以它爲基礎來進行分類將是很是容易的。具體作法是,從根節點開始,地實例的某一特徵進行測試,根據測試結構將實例分配到其子節點(也就是選擇適當的分支);沿着該分支可能達到葉子節點或者到達另外一個內部節點時,那麼就使用新的測試條件遞歸執行下去,直到抵達一個葉子節點。當到達葉子節點時,咱們便獲得了最終的分類結果。優化
下圖是一個決策樹的示例(注意咱們僅用了兩個feature就對數據集中的5個記錄實現了準確的分類): ui
Hunt算法是一種採用局部最優策略的決策樹構建算法,它同時也是許多決策樹算法的基礎,包括ID三、C4.5和CART等。該算法的具體執行步驟以下:
在Hunt算法中,經過將訓練記錄相繼劃分紅較純的子集,以遞歸方式創建決策樹。設 Dt 是與結點 t 相關聯的訓練記錄集,而y={y1,y2,⋯,yc}是類標號,Hunt算法的遞歸定義以下:
(1) 若是 Dt 中全部記錄都屬於同一個類,則 t 是葉結點,用 yt 標記。
(2) 若是 Dt 中包含屬於多個類的記錄,則選擇一個屬性測試條件(attribute test condition),將記錄劃分紅較小的子集。對於測試條件的每一個輸出,建立一個子女結點,並根據測試結果將 Dt 中的記錄分佈到子女結點中。而後,對於每一個子女結點,遞歸地調用該算法。
爲了演示這方法,咱們選用文獻【2】中的一個例子來加以說明:預測貸款申請者是會按時歸還貸款,仍是會拖欠貸款。對於這個問題,訓練數據集能夠經過考察之前貸款者的貸款記錄來構造。在下圖所示的例子中,每條記錄都包含貸款者的我的信息,以及貸款者是否拖欠貸款的類標號。
該分類問題的初始決策樹只有一個結點,類標號爲「拖欠貨款者=否」(見圖a),意味大多數貸款者都按時歸還貸款。然而,該樹須要進一步的細化,由於根結點包含兩個類的記錄。根據「有房者」測試條件,這些記錄被劃分爲較小的子集,如圖b所示。接下來,對根結點的每一個子女遞歸地調用Hunt算法。從下圖給出的訓練數據集能夠看出,有房的貸款者都按時償還了貸款,所以,根結點的左子女爲葉結點,標記爲「拖欠貨款者二否」(見圖b)。對於右子女,咱們須要繼續遞歸調用Hunt算法,直到全部的記錄都屬於同一個類爲止。每次遞歸調用所造成的決策樹顯示在圖c和圖d中。
若是屬性值的每種組合都在訓練數據中出現,而且每種組合都具備惟一的類標號,則Hunt 算法是有效的。可是對於大多數實際狀況,這些假設太苛刻了,所以,須要附加的條件來處理如下的狀況:
此外,在上面這個算法過程當中,你可能會疑惑:咱們是依據什麼原則來選取屬性測試條件的,例如爲什第一次選擇「有房者」來做爲測試條件。事實上,若是咱們選擇的屬性測試條件不一樣,那麼對於同一數據集來講所創建的決策樹可能相差很大。以下圖所示爲基於前面預測病人是患了Cold仍是Flu的數據集所構建出來的另外兩種狀況的決策樹:
事實上,在構建決策樹時咱們須要關心的問題包括:
我會在接下來的部分回答上述這些問題。
構建一棵最優的決策樹是一個NP難問題!因此咱們只能採用一些啓發式策略來解決:
如今新的問題來了:如何評估節點的Impurity?一般可使用的指標有以下三個(實際應用時,只要選其中一個便可):
第一個能夠用來評估節點Impurity的指標是Gini係數。對於一個給定的節點 t,它的Gini係數計算公式以下:
其中,p(j | t) is the relative frequency of class j at node t(即表示給定節點 t 中屬於類 j 的記錄所佔的比例)。經過這個計算公式你能夠看出:
說到這裏,咱們插一句題外話(若是你對這部分Background無感能夠跳過)。你在生活中有沒有聽過基尼係數這個名詞?是的,基尼係數原本是經濟學裏的一個概念。基尼係數是1943年美國經濟學家阿爾伯特·赫希曼根據勞倫茨曲線所定義的判斷收入分配公平程度的指標。基尼係數是比例數值,在0和1之間,是國際上用來綜合考察居民內部收入分配差別情況的一個重要分析指標。其具體含義是指,在所有居民收入中,用於進行不平均分配的那部分收入所佔的比例。基尼係數最大爲「1」,最小等於「0」。前者表示居民之間的收入分配絕對不平均,即100%的收入被一個單位的人所有佔有了;然後者則表示居民之間的收入分配絕對平均,即人與人之間收入徹底平等,沒有任何差別。但這兩種狀況只是在理論上的絕對化形式,在實際生活中通常不會出現。所以,基尼係數的實際數值只能介於0~1之間,基尼係數越小收入分配越平均,基尼係數越大收入分配越不平均。國際上一般把0.4做爲貧富差距的警惕線,大於這一數值容易出現社會動盪。
選擇最佳劃分的度量一般是根據劃分後子女結點不純性的程度。不純的程度越低,類分佈就越傾斜。例如,類分佈爲 (0, 1)的結點具備零不純性,而均衡分佈(0.5, 0.5)的結點具備最高的不純性。如今咱們回過頭來看一個具體的計算例子。如今咱們一共有6個records,以二元分類問題不純性度量值的比較爲例,下圖的意思表示有四個節點,而後分別計算了每個節點的GINI係數值(注意決策樹中每個內節點都表示一種分支判斷,也就能夠將6個records分紅幾類,咱們這裏討論的是二元分類因此是分紅兩個子類):
從上面的例子能夠看出,第一個結點,具備最低的不純性度量值,接下來節點的不純度度量值依次遞增。爲了肯定測試條件的效果,咱們須要比較父結點(劃分前)的不純程度和子女結點(劃分後) 的不純程度,它們的差越大,測試條件的效果就越好。增益Δ是一種能夠用來肯定劃分效果的標準:
其中,I(.) 是給定結點的不純性度量,N是父結點上的記錄總數,k是屬性值的個數,N(vj)是與子女結點 vj 相關聯的記錄個數。決策樹構建算法一般選擇最大化增益Δ的測試條件,由於對全部的測試條件來講,I(parent)是一個不變的值,因此最大化增益等價於最小化子女結點的不純性度量的加權平均值。
考慮下面這個劃分的例子。假設有兩種方法將數據劃分紅較小的子集。劃分前,Gini係數等於0.5,由於屬於兩個類(C0和C1)的記錄個數相等。若是選擇屬性A來劃分數據,節點N1的Gini係數爲1−(4/7)2−(3/7)2=0.4898,而N2的Gini係數爲1−(2/5)2−(3/5)2=0.48,派生節點的Gini係數的加權平均爲(7/12)×0.4898+(5/12)×0.48=0.486。同理,咱們還能夠計算屬性B的Gini係數的加權平均爲(7/12)×0.408+(5/12)×0.32=0.371。由於屬性B具備更小的Gini係數,因此它比屬性A更可取。
標稱屬性能夠產生二元劃分也能夠產生多路劃分,以下圖所示。二元劃分的Gini係數的計算與二元屬性相似。對於車型屬性第一種二元分類,{運動,豪華}的Gini係數是0.4922,而{家用}的Gini係數是0.375。這個劃分的Gini係數加權平均是:
相似地,對第二種二元劃分{運動}和{家用,豪華},Gini係數加權平均是0.167。第二種劃分的Gini係數相對更低,由於其對應的子集的純度更高。對於多路劃分,須要計算每一個屬性值的Gini係數。Gini({家用})=0.375,Gini({運動})=0,Gini({豪華})=0.219,因此多路劃分的Gini係數加權平均值爲:
多路劃分的Gini係數比兩個二元劃分都小。這是由於二元劃分實際上合併了多路劃分的某些輸出,天然下降了子集的純度。
考慮下圖所示的例子,其中測試條件「年收入≤v」用來劃分拖欠貸款分類問題的訓練記錄。用窮舉方法肯定 v 的值,將N個記錄中全部的屬性值都做爲候選劃分點。對每一個候選v,都要掃描一次數據集,統計年收入大於和小於v的記錄數,而後計算每一個候迭的Gini係數,並從中選擇具備最小值的候選劃分點。這種方法的計算代價顯然是高昂的,由於對每一個候選劃分點計算 Gini係數須要O(N)次操做,因爲有N個候選,總的計算複雜度爲O(N2)。爲了下降計算複雜度, 按照年收入將訓練記錄排序,所須要的時間爲O(NlogN),從兩個相鄰的排過序的屬性值中選擇中間值做爲候選劃分點,獲得候選劃分點55, 65, 72等。不管如何,與窮舉方法不一樣,在計算候選劃分點的Gini指標時,不需考察全部N個記錄。
對第一個候選v=55,沒有年收入小於$55K的記錄,因此年收入<$55K的派生結點的Gini係數是0;另外一方面,年收入≥$55K的樣本記錄數目分別爲3(類Yes)和7(類No)。如此一來,該結點的Gini係數是0.420。該候選劃分的Gini係數的加權平均就等於0×0+1×0.42=0.42。
對第二個候選v=65,經過更新上一個候選的類分佈,就能夠獲得該候選的類分佈。更具體地說,新的分佈經過考察具備最低年收入(即$60K)的記錄的類標號獲得。由於該記錄的類標號是No因此類No的計數從0增長到1(對於年收入≤$65K),和從7降到6(對於年收入> $65K),類Yes的分佈保持不變。新的候選劃分點的加權平均Gini係數爲0.4。
重複這樣的計算,直到算出全部候選的Gini係數值。最佳的劃分點對應於產生最小Gini係數值的點,即v=97。該過程代價相對較低,由於更新每一個候選劃分點的類分佈所需的時間是一個常數。該過程還能夠進一步優化:僅考慮位於具備不一樣類標號的兩個相鄰記錄之間的候選劃分點。例如,由於前三個排序後的記錄(分別具備年收入$60K、 $70K和$75K)具備相同的類標號,因此最佳劃分點確定不會在$60K和$75K之間,所以,候選劃分點 v = $55K、 $65K、 $72K、 $87K、 $92K、 $110K、$122K、 $172K 和 $230K都將被忽略,由於它們都位於具備相同類標號的相鄰記錄之間。該方法使得候選劃分點的個數從11個降到2個。
正如咱們前面已經提到的,評估節點的Impurity能夠是三個標準中的任何一個。並且咱們已經介紹了Gini係數。
下面來談談另一個可選的標準:信息熵(entropy)。在信息論中,熵是表示隨機變量不肯定性的度量。熵的取值越大,隨機變量的不肯定性也越大。
設X是一個取有限個值的離散隨機變量,其機率分佈爲
則隨機變量X的熵定義爲
在上式中,若是pi=0,則定義0log0=0。一般,上式中的對數以2爲底或以e爲底,這時熵的單位分別是比特(bit)或納特(nat)。由定義可知,熵只依賴於 X 的分佈,而與 X 的取值無關,因此也能夠將X 的熵記做 H(p),即
條件熵H(Y|X)表示在已知隨機變量X的條件下隨機變量Y的不肯定性,隨機變量X給定的條件下隨機變量Y的條件熵(conditional entropy)H(Y|X),定義爲X給定條件下Y的條件機率分佈的熵對X的數學指望:
就咱們當前所面對的問題而言,若是給定一個節點 t,它的(條件)熵計算公式以下:
其中,p(j | t) is the relative frequency of class j at node t(即表示給定節點 t 中屬於類 j 的記錄所佔的比例)。經過這個計算公式你能夠看出:
仍是來看一個具體的計算例子,以下圖所示(基本狀況與前面介紹Gini係數時的例子相似,咱們再也不贅述):
以此爲基礎,咱們要來定義信息增益(Information Gain)以下:
其中,Parent Node, p is split into k partitions; ni is number of records in partition i.
與以前的狀況相同,決策樹構建算法一般選擇最大化信息增益的測試條件來對節點進行劃分。
使用信息增益的一個缺點在於:信息增益的大小是相對於訓練數據集而言的。在分類問題困難時,即訓練數據集的經驗熵比較大時,信息增益會偏大。反之,信息增益會偏小。使用信息增益比(Information gain ratio)能夠對這一問題進行校訂。
因而,Higher entropy partitioning (large number of small partitions) is penalized!
給定一個節點t,它的分類偏差定義爲:
由此公式可知:
話很少說,仍是一個簡單的算例:
下圖給出了二分類模型中,熵、Gini係數、分類偏差的比較狀況。若是咱們採用二分之一熵12H(p)的時候,你會發現它與Gini係數將會至關接近。
咱們最後再來看一個Gini係數和分類偏差對比的例子:
來計算一下加權平均的Gini係數:
再來計算一下分類偏差:
可見在這個例子中,Gini improves ! However,Missclassification unchanged! 咱們會在下一篇文章中繼續介紹關於ID三、C4.5和CART算法的內容,其中會更加具體地用到本文所介紹的各類純度評判標準。
(未完,待續…)
【1】Wu, X., Kumar, V., Quinlan, J.R., Ghosh, J., Yang, Q., Motoda, H., McLachlan, G.J., Ng, A., Liu, B., Philip, S.Y. and Zhou, Z.H., 2008. Top 10 algorithms in data mining. Knowledge and information systems, 14(1), pp.1-37. (http://www.cs.uvm.edu/~icdm/algorithms/10Algorithms-08.pdf)
【2】Pang-Ning Tan, Michael Steinbach, Vipin Kumar, 數據挖掘導論,人民郵電出版社
【3】李航,統計學習方法,清華大學出版社
【4】明尼蘇達大學Prof Vipin Kumar 和墨爾本大學Prof Rao Kotagiri的課程幻燈片材料
若是你對機器學習和數據挖掘感興趣,你還能夠參考個人高能資源帖:
【5】機器學習與數據挖掘網上資源蒐羅
【6】機器學習與數據挖掘的學習路線圖