1. 程式人生 > >python機器學習案例系列教程——決策樹(ID3、C4.5、CART)

python機器學習案例系列教程——決策樹(ID3、C4.5、CART)

決策樹簡介

決策樹算是最好理解的分類器了。決策樹就是一個多層if-else函式,就是對物件屬性進行多層if-else判斷,獲取目標屬性(類標籤)的類別。由於只使用if-else對特徵屬性進行判斷,所以一般特徵屬性為離散值,即使為連續值也會先進行區間離散化。

這裡寫圖片描述

在機器學習中,決策樹是一個預測模型,他代表的是物件屬性與類別屬性之間的一種對映關係。

分類決策樹概念:是一種描述對例項進行分類的樹形結構。決策樹由結點和有向邊組成。結點有兩種型別:內部結點和葉結點。內部結點表示一個特徵或屬性,葉結點表示一個分類。

思考:選哪些特徵屬性參與決策樹建模、哪些屬性排在決策樹的頂部,哪些排在底部,對屬性的值該進行什麼樣的判斷、樣本屬性的值缺失怎麼辦、如果輸出不是分類而是數值能用麼、對決策沒有用或沒有多大幫助的屬性怎麼辦、什麼時候使用決策樹?

使用決策樹做預測需要以下過程:

1、收集資料:可以使用任何方法。比如想構建一個相親系統,我們可以從媒婆那裡,或者通過參訪相親物件獲取資料。根據他們考慮的因素和最終的選擇結果,就可以得到一些供我們利用的資料了。

2、準備資料:收集完的資料,我們要進行整理,將這些所有收集的資訊按照一定規則整理出來,並排版,方便我們進行後續處理。

3、分析資料:可以使用任何方法,決策樹構造完成之後,我們可以檢查決策樹圖形是否符合預期。

4、訓練演算法:這個過程也就是構造決策樹,同樣也可以說是決策樹學習,就是構造一個決策樹的資料結構。

5、測試演算法:使用經驗樹計算錯誤率。當錯誤率達到了可接收範圍,這個決策樹就可以投放使用了。

資訊增益

資訊增益表示得知特徵Xj的資訊而使所屬分類的不確定性減少的程度。

特徵A對訓練資料集D的資訊增益g(D,A),定義為集合D的經驗熵H(D)與特徵A給定的情況下D的經驗條件熵H(D|A)之差。

g(D,A)=H(D)H(D|A)
假設資料集D有K種分類,特徵A有n種取值可能。

其中資料集D的經驗熵H(D)

H(D)=k=1KPklogPk2 其中Pk為集合D中的任一樣本資料分類k的概率,或者說屬於分類k的樣本所佔的比例。

經驗條件熵H(D|A)

H(D|A)=i=1nPiH(Di) 其中Pi為特徵取值為第i個可取值的概率。Di為特徵A為第i個可取值的樣本集合。

資訊增益比

特徵A對訓練資料集D的資訊增益gR(D,A),定義為其資訊增益g(D,A)與訓練集D的經驗熵H(D)之比。

gR(D,A)=g(D,A)/H(D)

是為了矯正在訓練資料集的經驗熵大時,資訊增益值會偏大,反之,資訊增益值會偏小的問題。

決策樹ID3演算法的思路

ID3演算法就是用資訊增益大小來判斷當前節點應該用什麼特徵來構建決策樹,用計算出的資訊增益最大的特徵來建立決策樹的當前節點。

不足:

ID3演算法雖然提出了新思路,但是還是有很多值得改進的地方。  

a)ID3沒有考慮連續特徵,比如長度,密度都是連續值,無法在ID3運用。這大大限制了ID3的用途。

b)ID3採用資訊增益大的特徵優先建立決策樹的節點。很快就被人發現,在相同條件下,取值比較多的特徵比取值少的特徵資訊增益大。比如一個變數有2個值,各為1/2,另一個變數為3個值,各為1/3,其實他們都是完全不確定的變數,但是取3個值的比取2個值的資訊增益大。如果校正這個問題呢?

c) ID3演算法對於缺失值的情況沒有做考慮

d) 沒有考慮過擬合的問題

ID3 演算法的作者昆蘭基於上述不足,對ID3演算法做了改進,這就是C4.5演算法

決策樹C4.5演算法

上一節我們講到ID3演算法有四個主要的不足,一是不能處理連續特徵,第二個就是用資訊增益作為標準容易偏向於取值較多的特徵,最後兩個是缺失值處理的問和過擬合問題。昆蘭在C4.5演算法中改進了上述4個問題。

對於第一個問題,不能處理連續特徵, C4.5的思路是將連續的特徵離散化。
對於第二個問題,資訊增益作為標準容易偏向於取值較多的特徵的問題。我們引入一個資訊增益比的變數IR(X,Y)IR(X,Y),它是資訊增益和特徵熵的比值。表示式如下:

IR(D,A)=I(A,D)HA(D)

其中D為樣本特徵輸出的集合,A為樣本特徵,對於特徵熵HA(D), 表示式如下:

HA(D)=ni|Di||D|log2|Di||D|

其中n為特徵A的類別數, |Di|為特徵A取第i個值時對應的樣本個數。|D|為總樣本個數。

對於第三個缺失值處理的問題,主要需要解決的是兩個問題,一是在樣本某些特徵缺失的情況下選擇劃分的屬性,二是選定了劃分屬性,對於在該屬性上缺失特徵的樣本的處理。

對於第一個子問題,對於某一個有缺失特徵值的特徵A。C4.5的思路是將資料分成兩部分,對每個樣本設定一個權重(初始可以都為1),然後劃分資料,一部分是有特徵值A的資料D1,另一部分是沒有特徵A的資料D2. 然後對於沒有缺失特徵A的資料集D1來和對應的A特徵的各個特徵值一起計算加權重後的資訊增益比,最後乘上一個係數,這個係數是無特徵A缺失的樣本加權後所佔加權總樣本的比例。

對於第二個子問題,可以將缺失特徵的樣本同時劃分入所有的子節點,不過將該樣本的權重按各個子節點樣本的數量比例來分配。比如缺失特徵A的樣本a之前權重為1,特徵A有3個特徵值A1,A2,A3。 3個特徵值對應的無缺失A特徵的樣本個數為2,3,4.則a同時劃分入A1,A2,A3。對應權重調節為2/9,3/9, 4/9。

對於第4個問題,C4.5引入了正則化係數進行初步的剪枝。具體方法這裡不討論。下篇講CART的時候會詳細討論剪枝的思路。

不足

1)由於決策樹演算法非常容易過擬合,因此對於生成的決策樹必須要進行剪枝。剪枝的演算法有非常多,C4.5的剪枝方法有優化的空間。思路主要是兩種,一種是預剪枝,即在生成決策樹的時候就決定是否剪枝。另一個是後剪枝,即先生成決策樹,再通過交叉驗證來剪枝。後面在下篇講CART樹的時候我們會專門講決策樹的減枝思路,主要採用的是後剪枝加上交叉驗證選擇最合適的決策樹。

2)C4.5生成的是多叉樹,即一個父節點可以有多個節點。很多時候,在計算機中二叉樹模型會比多叉樹運算效率高。如果採用二叉樹,可以提高效率。

3)C4.5只能用於分類,如果能將決策樹用於迴歸的話可以擴大它的使用範圍。

4)C4.5由於使用了熵模型,裡面有大量的耗時的對數運算,如果是連續值還有大量的排序運算。如果能夠加以模型簡化可以減少運算強度但又不犧牲太多準確性的話,那就更好了。

CART分類樹演算法

CART生成二叉決策樹

我們知道,在ID3演算法中我們使用了資訊增益來選擇特徵,資訊增益大的優先選擇。在C4.5演算法中,採用了資訊增益比來選擇特徵,以減少資訊增益容易選擇特徵值多的特徵的問題。但是無論是ID3還是C4.5,都是基於資訊理論的熵模型的,這裡面會涉及大量的對數運算。能不能簡化模型同時也不至於完全丟失熵模型的優點呢?

CART分類樹演算法使用基尼係數來代替資訊增益比,基尼係數代表了模型的不純度,基尼係數越小,則不純度越低,特徵越好。這和資訊增益(比)是相反的。

子集計算基尼不純度,即隨機放置的資料項出現於錯誤分類中的概率。以此來評判屬性對分類的重要程度。

Gini(D)=k=1Kpk(1pk)=1p2k 其中pk為任一樣本點屬於第k類的概率,也可以說成樣本資料集中屬於k類的樣本的比例。

集合D的基尼指數為Gini(D),在特徵A條件下的集合D的基尼指數為

Gini(D|A)=|Di||D|Gini(Di)

其中 |D