1. 程式人生 > >資料探勘十大演算法之決策樹詳解(1)

資料探勘十大演算法之決策樹詳解(1)

在2006年12月召開的 IEEE 資料探勘國際會議上(ICDM, International Conference on Data Mining),與會的各位專家選出了當時的十大資料探勘演算法( top 10 data mining algorithms ),可以參見文獻【1】。本部落格已經介紹過的位列十大演算法之中的演算法包括:

本文主要介紹機器學習中的決策樹模型。決策樹模型是一類演算法的集合,在資料探勘十大演算法中,具體的決策樹算法佔有兩席位置,即C4.5和CART演算法,本文都會介紹到它們。

歡迎關注白馬負金羈的部落格 http://blog.csdn.net/baimafujinji,為保證公式、圖表得以正確顯示,強烈建議你從該地址上檢視原版博文。本部落格主要關注方向包括:數字影象處理、演算法設計與分析、資料結構、機器學習、資料探勘、統計分析方法、自然語言處理。

從分類問題開始

分類(Classification)任務就是確定物件屬於哪個預定義的目標類。分類問題不僅是一個普遍存在的問題,而且是其他更加複雜的決策問題的基礎,更是機器學習和資料探勘技術中最龐大的一類演算法家族。我們前面介紹過的很多演算法(例如SVM,樸素貝葉斯等)都可以用來解決分類問題。作為本文的開始,我們首先來簡單回顧一下什麼是分類。

假設我們現在有如下表所示的一個屬性集(feature set),它收集了幾個病患的症狀和對應的病症。症狀包括頭疼的程度、咳嗽的程度、體溫以及咽喉是否腫痛,這些症狀(feature)的組合就對應一個病症的分類(Cold 還是 Flu)。



分類問題的本質就是當給定這樣一個數據集後,要求我們訓練出(或建立)一個模型f。當出現一組新的特徵向量時,要求我們預測(或判斷)擁有這樣一組特徵向量的物件應當屬於哪個類別。就我們現在給出的例子而言,假設你是一名醫生,現在收治了一位新的病患,然後你通過問診得知他的一些症狀(包括頭疼的程度、咳嗽的程度、體溫以及咽喉是否腫痛),然後你就要根據你已經建立好的模型來判斷該病人得的到底是Cold(普通感冒)還是Flu(流行性感冒)。

分類問題的類別數目可以是兩類也可以是多類。二分類問題是最簡單的分類問題,而多分類問題模型可以在二分類模型的基礎上進行構建。我們在前面文章中一直使用的鳶尾花資料集就是一個典型的多分類問題,問題的最終目標是判斷給定一朵花,它應該屬於setosa、versicolor和virginica中的哪一類。

決策樹基礎

決策樹是一種用於對例項進行分類的樹形結構。決策樹由節點(node)和有向邊(directed edge)組成。節點的型別有兩種:內部節點和葉子節點。其中,內部節點表示一個特徵或屬性的測試條件(用於分開具有不同特性的記錄),葉子節點表示一個分類。

一旦我們構造了一個決策樹模型,以它為基礎來進行分類將是非常容易的。具體做法是,從根節點開始,地例項的某一特徵進行測試,根據測試結構將例項分配到其子節點(也就是選擇適當的分支);沿著該分支可能達到葉子節點或者到達另一個內部節點時,那麼就使用新的測試條件遞迴執行下去,直到抵達一個葉子節點。當到達葉子節點時,我們便得到了最終的分類結果。

下圖是一個決策樹的示例(注意我們僅用了兩個feature就對資料集中的5個記錄實現了準確的分類):



構建決策樹——Hunt演算法

Hunt演算法是一種採用區域性最優策略的決策樹構建演算法,它同時也是許多決策樹演算法的基礎,包括ID3、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 演算法是有效的。但是對於大多數實際情況,這些假設太苛刻了,因此,需要附加的條件來處理以下的情況:

  1. 演算法的第二步所建立的子女結點可能為空,即不存在與這些結點相關聯的記錄。如果沒有一個訓練記錄包含與這樣的結點相關聯的屬性值組合,這種情形就可能發生。這時,該結點成為葉結點,類標號為其父結點上訓練記錄中的多數類。
  2. 在第二步,如果與 Dt 相關聯的所有記錄都具有相同的屬性值(目標屬性除外),則不可能進一步劃分這些記錄。在這種情況下,該結點為葉結點,其標號為與該結點相關聯的訓練記錄中的多數類。

此外,在上面這個演算法過程中,你可能會疑惑:我們是依據什麼原則來選取屬性測試條件的,例如為什第一次選擇“有房者”來作為測試條件。事實上,如果我們選擇的屬性測試條件不同,那麼對於同一資料集來說所建立的決策樹可能相差很大。如下圖所示為基於前面預測病人是患了Cold還是Flu的資料集所構建出來的另外兩種情況的決策樹:



事實上,在構建決策樹時我們需要關心的問題包括:

  • How to build optimal Decision Tree?
  • How to choose attribute values at each decision point (node)?
  • How to choose number of branches at each node and attribute values for partitioning the data?
  • When to stop the growth of the tree?

我會在接下來的部分回答上述這些問題。

構建決策樹進階:Gini測度與劃分

構建一棵最優的決策樹是一個NP難問題!所以我們只能採用一些啟發式策略來解決:

  • Choose an attribute to partition the data at the node such that each partition is as homogeneous (least impure) as possible. This means we would like to see most of the instances in each partition belonging to as few classes as possible and each partition should be as large as possible.
  • We can stop the growth of the tree if all the leaf nodes are largely dominated by a single class (that is the leaf nodes are nearly pure).

現在新的問題來了:如何評估節點的Impurity?通常可以使用的指標有如下三個(實際應用時,只要選其中一個即可):

  • Gini Index
  • Entropy
  • Misclassification error

第一個可以用來評估節點Impurity的指標是Gini係數。對於一個給定的節點 t,它的Gini係數計算公式如下:

GINI(t)=1j[p(j|t)]2
其中,p(j|t) is the relative frequency of class j at node t(即表示給定節點 t 中屬於類 j 的記錄所佔的比例)。通過這個計算公式你可以看出:
  • Maximum value of Gini index = (1 - 1/nc) when records are equally distributed among all classes, implying least interesting information or most impure.
  • Minimum is (0.0) when all records belong to one class, implying most interesting information or most pure or most homogeneous.

說到這裡,我們插一句題外話(如果你對這部分Background無感可以跳過)。你在生活中有沒有聽過基尼係數這個名詞?是的,基尼係數本來是經濟學裡的一個概念。基尼係數是1943年美國經濟學家阿爾伯特·赫希曼根據勞倫茨曲線所定義的判斷收入分配公平程度的指標。基尼係數是比例數值,在0和1之間,是國際上用來綜合考察居民內部收入分配差異狀況的一個重要分析指標。其具體含義是指,在全部居民收入中,用於進行不平均分配的那部分收入所佔的比例。基尼係數最大為“1”,最小等於“0”。前者表示居民之間的收入分配絕對不平均,即100%的收入被一個單位的人全部佔有了;而後者則表示居民之間的收入分配絕對平均,即人與人之間收入完全平等,沒有任何差異。但這兩種情況只是在理論上的絕對化形式,在實際生活中一般不會出現。因此,基尼係數的實際數值只能介於0~1之間,基尼係數越小收入分配越平均,基尼係數越大收入分配越不平均。國際上通常把0.4作為貧富差距的警戒線,大於這一數值容易出現社會動盪。

選擇最佳劃分的度量通常是根據劃分後子女結點不純性的程度。不純的程度越低,類分佈就越傾斜。例如,類分佈為 (0, 1)的結點具有零不純性,而均衡分佈(0.5, 0.5)的結點具有最高的不純性。現在我們回過頭來看一個具體的計算例子。現在我們一共有6個records,以二元分類問題不純性度量值的比較為例,下圖的意思表示有四個節點,然後分別計算了每一個節點的GINI係數值(注意決策樹中每一個內節點都表示一種分支判斷,也就可以將6個records分成幾類,我們這裡討論的是二元分類所以是分成兩個子類):




從上面的例子可以看出,第一個結點,具有最低的不純性度量值,接下來節點的不純度度量值依次遞增。為了確定測試條件的效果,我們需要比較父結點(劃分前)的不純程度和子女結點(劃分後) 的不純程度,它們的差越大,測試條件的效果就越好。增益Δ是一種可以用來確定劃分效果的標準:
Δ=I(parent)j=1kN(vj)NI(vj)
其中,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係數加權平均是:

(16/20)×0.4922+(4/20)×0.375=0.468
類似地,對第二種二元劃分{運動}和{家用,豪華},Gini係數加權平均是0.167。第二種劃分的Gini係數相對更低,因為其對應的子集的純度更高。對於多路劃分,需要計算每個屬性值的Gini係數。Gini({家用})=0.375,Gini({運動})=0,Gini({豪華})=0.219,所以多路劃分的Gini係數加權平均值為:
(4/20)×0.375+(8/20)×0+(8/20)×0.219=0.163
多路劃分的Gini係數比兩個二元劃分都小。這是因為二元劃分實際上合併了多路劃分的某些輸出,自然降低了子集的純度。


考慮特徵值連續的情況

考慮下圖所示的例子,其中測試條件“年收入

相關推薦

資料演算法決策1

在2006年12月召開的 IEEE 資料探勘國際會議上(ICDM, International Conference on Data Mining),與會的各位專家選出了當時的十大資料探勘演算法( top 10 data mining algorithms ),

資料演算法Apriori

在2006年12月召開的 IEEE 資料探勘國際會議上(ICDM, International Conference on Data Mining),與會的各位專家選出了當時的十大資料探勘演算法( top 10 data mining algorithms ),

資料演算法決策演算法 python和sklearn實現

學完到第三章——決策樹,python程式碼實現的僅是ID3演算法,sklearn為優化過的C4.5,這裡做一個詳細的總結包括(原理、程式碼、視覺化、scikit-learn實現),皆為親自實踐後的感悟。以下進入正文。 早前簡單瞭解了決策樹的原理,然後為了儘快使用便沒有深究直

資料演算法——支援向量機SVM:線性支援向量機

首先感謝“劉建平pinard”的淵博知識以及文中詳細準確的推導!!! 本文轉自“劉建平pinard”,原網址為:http://www.cnblogs.com/pinard/p/6097604.html。 支援向量機原理SVM系列文章共分為5部分: (一)線性支援向量機

資料演算法——支援向量機SVM:SMO演算法原理

首先感謝“劉建平pinard”的淵博知識以及文中詳細準確的推導!!! 支援向量機原理SVM系列文章共分為5部分: (一)線性支援向量機 (二)線性支援向量機的軟間隔最大化模型 (三)線性不可分支援向量機與核函式 (四)SMO演算法原理 (五)線性支援迴歸

資料演算法:樸素貝葉斯 python和sklearn實現

第三個演算法終於算是稍有了解了,其實當你結合資料瞭解了它的實現原理後,你會發現確實很樸素。這裡對樸素貝葉斯演算法做一個介紹和總結,包括(原理、一個程式碼示例、sklearn實現),皆為親自實踐後的感悟,下面進入正文。 原理: 首先我們需要了解概率論的一些簡單知識:

資料演算法——支援向量機SVM:線性支援向量機的軟間隔最大化模型

首先感謝“劉建平pinard”的淵博知識以及文中詳細準確的推導!!! 支援向量機原理SVM系列文章共分為5部分: (一)線性支援向量機 (二)線性支援向量機的軟間隔最大化模型 (三)線性不可分支援向量機與核函式 (四)SMO演算法原理 (五)線性支援迴歸

資料演算法:EM(Expectation Maximum)演算法原理與Python實現

參考: 一、一個簡單的概率問題 實驗:現在有A和B兩個硬幣,我們從這兩個硬幣中,隨機選取5次,做5組實驗,每組實驗內容是:丟擲所選的硬幣,記錄正反面。 實驗資料如下: 目標:根據所得到的實驗資料,分別求出硬幣A和B丟擲後正面向上的概率。 根據古典概率的原

資料演算法——支援向量機SVM:線性支援迴歸

首先感謝“劉建平pinard”的淵博知識以及文中詳細準確的推導!!! 支援向量機原理SVM系列文章共分為5部分: (一)線性支援向量機 (二)線性支援向量機的軟間隔最大化模型 (三)線性不可分支援向量機與核函式 (四)SMO演算法原理 (五)線性支援迴歸

資料演算法:樸素貝葉斯原理、例項與Python實現

一、條件概率的定義與貝葉斯公式 二、樸素貝葉斯分類演算法 樸素貝葉斯是一種有監督的分類演算法,可以進行二分類,或者多分類。一個數據集例項如下圖所示: 現在有一個新的樣本, X = (年齡:<=30, 收入:中, 是否學生:是, 信譽:中),目標是利用樸素貝

資料演算法 』筆記二:SVM-支援向量機

資料探勘Top 10演算法 C4.5, k-Means, SVM, Apriori, EM, PageRank, AdaBoost, kNN, Naive Bayes, and CART 支援向量機 支援向量機,英文為Support Ve

資料演算法----EM演算法期望演算法

概念 在統計計算中,最大期望(EM)演算法是在概率(probabilistic)模型中尋找引數最大似然估計或者最大後驗估計的演算法,其中概率模型依賴於無法觀測的隱藏變數(Latent Variable)。 最大期望經常用在機器學習和計算機視覺的資料聚類(Data Clust

資料演算法的最簡單理解

目錄 一、PageRank 原理 比喻說明 二、Apriori(關聯分析) 原理 比喻說明 三、AdaBoost

機器學習演算法決策詳細

什麼是決策樹? 如何構建決策樹? ID3 C4.5 CART 決策樹的優缺點及改進 什麼是決策樹? 決策樹是運用於分類的一種樹結構,其本質是一顆由多個判斷節點組成的樹,其中的每個內部節點代表對某一屬性的一次測試,每條邊代表一個測試結果,而葉節點代表某個類或類的分佈。 屬於有監督學習 核心思想:

nignx服務配置檔案1

Nginx的配置檔案nginx.conf配置詳解如下: user nginx nginx ; Nginx使用者及組:使用者 組;window下不指定 worker_processes 8; 工作程序:數目。根據硬體調整,通常等於CPU數量或者2倍於CPU。 erro

資料經典演算法K-means 演算法

K-means演算法(非監督性學習) 1.演算法思想         k-means演算法是一種簡單的迭代型聚類演算法,採用距離作為相似性指標,從而發現給定資料集中的K個類,且每個類的中心是根據類中所有值的均值得到,每個類

資料經典演算法KNN演算法

KNN演算法(監督性學習) 1.演算法思想        KNN是通過測量不同特徵值之間的距離進行分類。它的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別,其

資料經典演算法K最近鄰演算法

k-最近鄰演算法是基於例項的學習方法中最基本的,先介紹基於例項學習的相關概念。     基於例項的學習     1.已知一系列的訓練樣例,很多學習方法為目標函式建立起明確的一般化描述;但與此不同,基於例項的學習方法只是簡單地把訓練樣例儲存起來。     從這些例項中泛化

資料經典演算法原理

資料探勘十大經典演算法 一、 C4.5 C4.5演算法是機器學習演算法中的一種分類決策樹演算法,其核心演算法是ID3 演算法. C4.5演算法繼承了ID3演算法的優點,並在以下幾方面對ID3演算法進行了改進: 1) 用資訊增益率來選擇屬性,克服了

資料經典演算法(九) 樸素貝葉斯分類器 Naive Bayes

分類演算法--------貝葉斯定理: 樸素貝葉斯的基本思想:對於給出的待分類項,求解在此項出現的條件下各個類別出現的概率,哪個最大,就認為此待分類項屬於哪個類別。 可以看到,整個樸素貝葉斯分類分為三個階段:       第一階段——準備工作階段,這個階段的任務是為樸