2014-12-14 19:32 11172人閱讀 評論(1) 收藏 舉報python
分類:算法
機器學習(8) 機器學習
版權聲明:本文爲博主原創文章,未經博主容許不得轉載--「http://blog.csdn.net/suipingsp」。函數
決策樹是經過一系列規則對數據進行分類的過程。它提供一種在什麼條件下會獲得什麼值的相似規則的方法。決策樹分爲分類樹和迴歸樹兩種,分類樹對離散變量作決策樹,迴歸樹對連續變量作決策樹。測試
近來的調查代表決策樹也是最常用的數據挖掘算法,它的概念很是簡單。決策樹算法之因此如此流行,一個很重要的緣由就是使用者基本上不用瞭解機器學習算法,也不用深究它是如何工做的。直觀看上去,決策樹分類器就像判斷模塊和終止塊組成的流程圖,終止塊表示分類結果(也就是樹的葉子)。判斷模塊表示對一個特徵取值的判斷(該特徵有幾個值,判斷模塊就有幾個分支)。優化
若是不考慮效率等,那麼樣本全部特徵的判斷級聯起來終會將某一個樣本分到一個類終止塊上。實際上,樣本全部特徵中有一些特徵在分類時起到決定性做用,決策樹的構造過程就是找到這些具備決定性做用的特徵,根據其決定性程度來構造一個倒立的樹--決定性做用最大的那個特徵做爲根節點,而後遞歸找到各分支下子數據集中次大的決定性特徵,直至子數據集中全部數據都屬於同一類。因此,構造決策樹的過程本質上就是根據數據特徵將數據集分類的遞歸過程,咱們須要解決的第一個問題就是,當前數據集上哪一個特徵在劃分數據分類時起決定性做用。ui
爲了找到決定性的特徵、劃分出最好的結果,咱們必須評估數據集中蘊含的每一個特徵,尋找分類數據集的最好特徵。完成評估以後,原始數據集就被劃分爲幾個數據子集。這些數據子集會分佈在第一個決策點的全部分支上。若是某個分支下的數據屬於同一類型,則則該分支處理完成,稱爲一個葉子節點,即肯定了分類。若是數據子集內的數據不屬於同一類型,則須要重複劃分數據子集的過程。如何劃分數據子集的算法和劃分原始數據集的方法相同,直到全部具備相同類型的數據均在一個數據子集內(葉子節點)。以下圖就是一個決策樹實例(目標是兩類--見或者不見,每一個樣本有年齡、長相、收入、是否公務員四個特徵):spa
一棵決策樹的生成過程主要分爲如下3個部分:
特徵選擇:特徵選擇是指從訓練數據中衆多的特徵中選擇一個特徵做爲當前節點的分裂標準,如何選擇特徵有着不少不一樣量化評估標準標準,從而衍生出不一樣的決策樹算法。
決策樹生成: 根據選擇的特徵評估標準,從上至下遞歸地生成子節點,直到數據集不可分則中止決策樹中止生長。 樹結構來講,遞歸結構是最容易理解的方式。
剪枝:決策樹容易過擬合,通常來須要剪枝,縮小樹結構規模、緩解過擬合。剪枝技術有預剪枝和後剪枝兩種。
劃分數據集的最大原則是:使無序的數據變的有序。若是一個訓練數據中有20個特徵,那麼選取哪一個作劃分依據?這就必須採用量化的方法來判斷,量化劃分方法有多重,其中一項就是「信息論度量信息分類」。基於信息論的決策樹算法有ID三、CART和C4.5等算法,其中C4.5和CART兩種算法從ID3算法中衍生而來。
CART和C4.5支持數據特徵爲連續分佈時的處理,主要經過使用二元切分來處理連續型變量,即求一個特定的值-分裂值:特徵值大於分裂值就走左子樹,或者就走右子樹。這個分裂值的選取的原則是使得劃分後的子樹中的「混亂程度」下降,具體到C4.5和CART算法則有不一樣的定義方式。
ID3算法由Ross Quinlan發明,創建在「奧卡姆剃刀」的基礎上:越是小型的決策樹越優於大的決策樹(be simple簡單理論)。ID3算法中根據信息論的信息增益評估和選擇特徵,每次選擇信息增益最大的特徵作判斷模塊。ID3算法可用於劃分標稱型數據集,沒有剪枝的過程,爲了去除過分數據匹配的問題,可經過裁剪合併相鄰的沒法產生大量信息增益的葉子節點(例如設置信息增益閥值)。使用信息增益的話實際上是有一個缺點,那就是它偏向於具備大量值的屬性--就是說在訓練集中,某個屬性所取的不一樣值的個數越多,那麼越有可能拿它來做爲分裂屬性,而這樣作有時候是沒有意義的,另外ID3不能處理連續分佈的數據特徵,因而就有了C4.5算法。CART算法也支持連續分佈的數據特徵。
C4.5是ID3的一個改進算法,繼承了ID3算法的優勢。C4.5算法用信息增益率來選擇屬性,克服了用信息增益選擇屬性時偏向選擇取值多的屬性的不足在樹構造過程當中進行剪枝;可以完成對連續屬性的離散化處理;可以對不完整數據進行處理。C4.5算法產生的分類規則易於理解、準確率較高;但效率低,因樹構造過程當中,須要對數據集進行屢次的順序掃描和排序。也是由於必須屢次數據集掃描,C4.5只適合於可以駐留於內存的數據集。
CART算法的全稱是Classification And Regression Tree,採用的是Gini指數(選Gini指數最小的特徵s)做爲分裂標準,同時它也是包含後剪枝操做。ID3算法和C4.5算法雖然在對訓練樣本集的學習中能夠儘量多地挖掘信息,但其生成的決策樹分支較大,規模較大。爲了簡化決策樹的規模,提升生成決策樹的效率,就出現了根據GINI係數來選擇測試屬性的決策樹算法CART。
決策樹適用於數值型和標稱型(離散型數據,變量的結果只在有限目標集中取值),可以讀取數據集合,提取一些列數據中蘊含的規則。在分類問題中使用決策樹模型有不少的優勢,決策樹計算複雜度不高、便於使用、並且高效,決策樹可處理具備不相關特徵的數據、可很容易地構造出易於理解的規則,而規則一般易於解釋和理解。決策樹模型也有一些缺點,好比處理缺失數據時的困難、過分擬合以及忽略數據集中屬性之間的相關性等。
前面已經提到C4.5和CART都是由ID3演化而來,這裏就先詳細闡述ID3算法,奠下基礎。
關於決策樹的信息論基礎能夠參考「決策樹1-建模過程」
(1)信息熵
信息熵:在機率論中,信息熵給了咱們一種度量不肯定性的方式,是用來衡量隨機變量不肯定性的,熵就是信息的指望值。若待分類的事物可能劃分在N類中,分別是x1,x2,……,xn,每一種取到的機率分別是P1,P2,……,Pn,那麼X的熵就定義爲:
,從定義中可知:0≤H(X)≤log(n)當隨機變量只取兩個值時,即X的分佈爲 P(X=1)=p,X(X=0)=1−p,0≤p≤1則熵爲:H(X)=−plog2(p)−(1−p)log2(1−p)。
熵值越高,則數據混合的種類越高,其蘊含的含義是一個變量可能的變化越多(反而跟變量具體的取值沒有任何關係,只和值的種類多少以及發生機率有關),它攜帶的信息量就越大。熵在信息論中是一個很是重要的概念,不少機器學習的算法都會利用到這個概念。
(2)條件熵
假設有隨機變量(X,Y),其聯合機率分佈爲:P(X=xi,Y=yi)=pij,i=1,2,⋯,n;j=1,2,⋯,m
則條件熵(H(Y∣X))表示在已知隨機變量X的條件下隨機變量Y的不肯定性,其定義爲X在給定條件下Y的條件機率分佈的熵對X的數學指望:
(3)信息增益
信息增益(information gain)表示得知特徵X的信息後,而使得Y的不肯定性減小的程度。定義爲:
(1)分類系統信息熵
假設一個分類系統的樣本空間(D,Y),D表示樣本(有m個特徵),Y表示n個類別,可能的取值是C1,C2,...,Cn。每個類別出現的機率是P(C1),P(C2),...,P(Cn)。該分類系統的熵爲:
離散分佈中,類別Ci出現的機率P(Ci),經過該類別出現的次數除去樣本總數便可獲得。對於連續分佈,常須要分塊作離散化處理得到。
(2)條件熵
根據條件熵的定義,分類系統中的條件熵指的是當樣本的某一特徵X固定時的信息熵。因爲該特徵X可能的取值會有(x1,x2,……,xn),當計算條件熵而須要把它固定的時候,每一種可能都要固定一下,而後求統計指望。
所以樣本特徵X取值爲xi的機率是Pi,該特徵被固定爲值xi時的條件信息熵就是H(C|X=xi),那麼
H(C|X)就是分類系統中特徵X被固定時的條件熵(X=(x1,x2,……,xn)):
如果樣本的該特徵只有兩個值(x1 = 0,x2=1)對應(出現,不出現),如文本分類中某一個單詞的出現與否。那麼對於特徵二值的狀況,咱們用T表明特徵,用t表明T出現,表示該特徵出現。那麼:
與前面條件熵的公式對比一下,P(t)就是T出現的機率,就是T不出現的機率。結合信息熵的計算公式,可得:
特徵T出現的機率P(t),只要用出現過T的樣本數除以總樣本數就能夠了;P(Ci|t)表示出現T的時候,類別Ci出現的機率,只要用出現了T而且屬於類別Ci的樣本數除以出現了T的樣本數就獲得了。
(3)信息增益
根據信息增益的公式,分類系統中特徵X的信息增益就是:Gain(D, X) = H(C)-H(C|X)
信息增益是針對一個一個的特徵而言的,就是看一個特徵X,系統有它和沒它的時候信息量各是多少,二者的差值就是這個特徵給系統帶來的信息增益。每次選取特徵的過程都是經過計算每一個特徵值劃分數據集後的信息增益,而後選取信息增益最高的特徵。
對於特徵取值爲二值的狀況,特徵T給系統帶來的信息增益就能夠寫成系統本來的熵與固定特徵T後的條件熵之差:
(4)通過上述一輪信息增益計算後會獲得一個特徵做爲決策樹的根節點,該特徵有幾個取值,根節點就會有幾個分支,每個分支都會產生一個新的數據子集Dk,餘下的遞歸過程就是對每一個Dk再重複上述過程,直至子數據集都屬於同一類。
在決策樹構造過程當中可能會出現這種狀況:全部特徵都做爲分裂特徵用光了,但子集還不是純淨集(集合內的元素不屬於同一類別)。在這種狀況下,因爲沒有更多信息可使用了,通常對這些子集進行「多數表決」,即便用此子集中出現次數最多的類別做爲此節點類別,而後將此節點做爲葉子節點。
以信息增益進行分類決策時,存在偏向於取值較多的特徵的問題。因而爲了解決這個問題人們有開發了基於信息增益比的分類決策方法,也就是C4.5。C4.5與ID3都是利用貪心算法進行求解,不一樣的是分類決策的依據不一樣。
所以,C4.5算法在結構與遞歸上與ID3徹底相同,區別就在於選取決斷特徵時選擇信息增益比最大的。
信息增益比率度量是用ID3算法中的的增益度量Gain(D,X)和分裂信息度量SplitInformation(D,X)來共同定義的。分裂信息度量SplitInformation(D,X)就至關於特徵X(取值爲x1,x2,……,xn,各自的機率爲P1,P2,...,Pn,Pk就是樣本空間中特徵X取值爲xk的數量除上該樣本空間總數)的熵。
SplitInformation(D,X) = -P1 log2(P1)-P2 log2(P)-,...,-Pn log2(Pn)
GainRatio(D,X) = Gain(D,X)/SplitInformation(D,X)
在ID3中用信息增益選擇屬性時偏向於選擇分枝比較多的屬性值,即取值多的屬性,在C4.5中因爲除以SplitInformation(D,X)=H(X),能夠削弱這種做用。
C4.5既能夠處理離散型屬性,也能夠處理連續性屬性。在選擇某節點上的分枝屬性時,對於離散型描述屬性,C4.5的處理方法與ID3相同。對於連續分佈的特徵,其處理方法是:
先把連續屬性轉換爲離散屬性再進行處理。雖然本質上屬性的取值是連續的,但對於有限的採樣數據它是離散的,若是有N條樣本,那麼咱們有N-1種離散化的方法:<=vj的分到左子樹,>vj的分到右子樹。計算這N-1種狀況下最大的信息增益率。另外,對於連續屬性先進行排序(升序),只有在決策屬性(即分類發生了變化)發生改變的地方纔須要切開,這能夠顯著減小運算量。經證實,在決定連續特徵的分界點時採用增益這個指標(由於若採用增益率,splittedinfo影響分裂點信息度量準確性,若某分界點剛好將連續特徵分紅數目相等的兩部分時其抑制做用最大),而選擇屬性的時候才使用增益率這個指標能選擇出最佳分類特徵。
在C4.5中,對連續屬性的處理以下:
1. 對特徵的取值進行升序排序
2. 兩個特徵取值之間的中點做爲可能的分裂點,將數據集分紅兩部分,計算每一個可能的分裂點的信息增益(InforGain)。優化算法就是隻計算分類屬性發生改變的那些特徵取值。
3. 選擇修正後信息增益(InforGain)最大的分裂點做爲該特徵的最佳分裂點
4. 計算最佳分裂點的信息增益率(Gain Ratio)做爲特徵的Gain Ratio。注意,此處需對最佳分裂點的信息增益進行修正:減去log2(N-1)/|D|(N是連續特徵的取值個數,D是訓練數據數目,此修正的緣由在於:當離散屬性和連續屬性並存時,C4.5算法傾向於選擇連續特徵作最佳樹分裂點)
實現連續特徵數據集劃分的Python程序爲:
Source Code:▼Copy
其中dataset爲numpy matrix, feature爲dataset連續特徵在dataset全部特徵中的index,value即爲feature臨近兩值的均值。
分析分類迴歸樹的遞歸建樹過程,不難發現它實質上存在着一個數據過分擬合問題。在決策樹構造時,因爲訓練數據中的噪音或孤立點,許多分枝反映的是訓練數據中的異常,使用這樣的斷定樹對類別未知的數據進行分類,分類的準確性不高。所以試圖檢測和減去這樣的分支,檢測和減去這些分支的過程被稱爲樹剪枝。樹剪枝方法用於處理過度適應數據問題。一般,這種方法使用統計度量,減去最不可靠的分支,這將致使較快的分類,提升樹獨立於訓練數據正確分類的能力。
決策樹經常使用的剪枝經常使用的簡直方法有兩種:預剪枝(Pre-Pruning)和後剪枝(Post-Pruning)。預剪枝是根據一些原則及早的中止樹增加,如樹的深度達到用戶所要的深度、節點中樣本個數少於用戶指定個數、不純度指標降低的最大幅度小於用戶指定的幅度等。預剪枝的核心問題是如何事先指定樹的最大深度,若是設置的最大深度不恰當,那麼將會致使過於限制樹的生長,使決策樹的表達式規則趨於通常,不能更好地對新數據集進行分類和預測。除了事先限定決策樹的最大深度以外,還有另一個方法來實現預剪枝操做,那就是採用檢驗技術對當前結點對應的樣本集合進行檢驗,若是該樣本集合的樣本數量已小於事先指定的最小容許值,那麼中止該結點的繼續生長,並將該結點變爲葉子結點,不然能夠繼續擴展該結點。
後剪枝則是經過在徹底生長的樹上剪去分枝實現的,經過刪除節點的分支來剪去樹節點,可使用的後剪枝方法有多種,好比:代價複雜性剪枝、最小偏差剪枝、悲觀偏差剪枝等等。後剪枝操做是一個邊修剪邊檢驗的過程,通常規則標準是:在決策樹的不斷剪枝操做過程當中,將原樣本集合或新數據集合做爲測試數據,檢驗決策樹對測試數據的預測精度,並計算出相應的錯誤率,若是剪掉某個子樹後的決策樹對測試數據的預測精度或其餘測度不下降,那麼剪掉該子樹。
關於後剪枝的具體理論能夠參考「數據挖掘十大經典算法--CART: 分類與迴歸樹」剪枝部分。
Python中不須要構造新的數據類型來存儲決策樹,使用字典dict便可方便的存儲節點信息,永久存儲則能夠經過pickle或者JSON將決策樹字典寫入文件中,本包採用JSON。包中trees模塊定義了一個decisionTree對象,同時支持ID3和C4.5兩種算法(C4.5算法連續特徵的處理和後剪枝沒有實現),該對象中的屬性如函數__init__中所示:
Source Code:▼Copy
decisionTree對象的train函數的輸入數據爲樣本列表和樣本特徵列表,其中樣本列表每一個元素的最後一項表示該元素的分類,格式以下所示:
另外,經過Python的Matplotlib的註解功能則能夠繪製樹形圖,方便展現。decisionTree對象提供了treePlot方法,經過模塊treePlotter中的函數實現。
testDS模塊則採用決策樹決定患者是否可以佩戴隱形眼鏡,須要考慮的特徵因素包括四個--'age', 'prescript', 'astigmatic', 'tearRate'。下圖就是利用decisionTree對象生成的決策樹。
決策樹算法學習包下載地址:
決策樹技術在數據化運營中的主要用途體如今:做爲分類、預測問題的典型支持技術,它在用戶劃分、行爲預測、規則梳理等方面具備普遍的應用前景。
本文做者Adan,來源於:機器學習經典算法詳解及Python實現--決策樹(Decision Tree)。轉載請註明出處。