一文詳解,決策樹從ID3算法到C4.5算法背後原理。碼字不易,喜歡請點贊,謝謝!!!
一、前言
決策樹算法作爲數據挖掘十大經典算法之一,其實已經在日常編程中,被我們使用到了。比如,我們平時寫代碼的判斷語句這個組合就是個決策樹過程,但是你是否想過先用哪個條件判斷會比較好呢?這個條件確定的過程就是決策樹的關鍵思想了。
上世紀70年代,昆蘭使用信息論中的熵來度量這個過程,昆蘭將這個算法命名爲ID3算法。
二、信息熵和信息增益
-
信息熵
信息熵是1948年,香農提出來的,用來解決信息的量化度量問題。
信息熵中熵度量了事物的不確定性,事物越不確定,其熵值越大。其表達式爲:
其中,n代表取到的不同的離散值,爲取的概率,爲底爲2的對數。
eg1:X取值爲0或1,概率均爲,則其信息熵爲:
eg2:X取值爲0或1或2,概率均爲,則其信息熵爲:
通過這兩個例子可以看出來,事物越不確定,其信息熵越大。 -
聯合熵
上面是一個變量的熵,很容易擴展多聯合熵,其表達式爲:
-
條件熵
在得到聯合熵之後,可以通過公式推導得到條件熵,條件熵類似於條件概率,衡量在已知Y的情況下X的不確定性。
通常直接使用公式來計算條件熵。 -
信息增益
信息增益(Information Gain),就是ID3算法的精髓,根據H(X)表示X的信息熵(即衡量X的不確定性),H(X/Y)表示在已知Y的情況下X的信息熵,那公式:表示的就是在已知Y的情況下,X的不確定性減小的程度,即信息增益,記爲。ID3算法就是選擇信息增益最大的特徵來作爲分類節點。
三、ID3算法思路
- 決策樹ID3算法停止條件
- 設置一個閾值,當最大信息增益小於這個閾值時,停止樹分裂;
- 所有記錄屬於同一類別
- ID3步驟
- 如果節點滿足分裂停止條件,將其設置爲葉子節點
- 選擇信息增益最大的特徵進行分裂
- 重複前面兩步,直到完成決策樹構造
四、ID3算法實例
這裏提供一個網上的數據集,是不同天氣是否打球的例子,其中特徵是outlook、temperature、humidity、windy;分類標籤是play。
一共14個樣本,其中9個yes,5個no,在標籤play的信息熵爲:
然後計算outlook, temperature, humidity, windy每個特徵下的信息熵,下面展示了已知outlook下的信息熵的計算:
所以有:
因此特徵outlook的信息增益爲:
同理可以求得其他特徵的信息增益,然後選擇最大的信息增益作爲分類的節點。一次分裂完成後,樣本被分裂到三個節點:
然後對每個部分執行上面操作,知道完成最後的決策樹,如下圖:
五、ID3算法不足
ID3算法雖然提出瞭解決問題的新思路,但是有很多值得改進的地方,不足點主要有:
- ID3沒有考慮連續特徵
- ID3採用信息增益大的特徵優先建立決策樹的節點。很快就被人發現,在相同條件下,取值比較多的特徵比取值少的特徵信息增益大。比如一個變量有2個值,各爲1/2,另一個變量爲3個值,各爲1/3,其實他們都是完全不確定的變量,但是取3個值的比取2個值的信息增益大。如果校正這個問題呢?
- ID3算法對於缺失值的情況沒有做考慮
- 沒有考慮過擬合的問題
爲了解決ID3算法的這些不足,作者昆蘭對其進行了改進,提出了C4.5算法。
六、C4.5算法
C4.5算法的思路跟ID3基本上一樣,只是針對於ID3算法的不足進行了改進。
-
連續值處理
ID3算法只能處理離散數據,而不能處理連續值。在C4.5裏面,如果m個樣本的特徵A是連續型特徵,將其值從小到大排列,然後取相鄰樣本的平均數,得到m-1個劃分點,其中第個劃分點。對於這m-1個劃分點,分別計算其作爲二元分類時候的信息增益,然後選擇信息增益最大的劃分點作爲該連續特徵的二元離散分類點。比如取到的增益最大的點爲,則小於的值爲類別1,大於的值爲類別2,這樣我們就做到了連續特徵的離散化。要注意的是,與離散屬性不同的是,如果當前節點爲連續屬性,則該屬性後面還可以參與子節點的產生選擇過程。 -
信息增益偏向多取值特徵問題
C4.5針對這個問題,選擇了使用信息增益率(Information Gain Ratio)來選擇特徵,表達式如下:
其中X爲標籤,Y爲特徵,表示特徵Y的信息增益,表示特徵熵,其表達式爲:
其中爲特徵Y在第類中的樣本個數,爲樣本總個數。
則上面案例中,outlook特徵的特徵熵爲:
其信息增益率爲:
-
缺失值處理
這部分主要包含兩種情況:
- 樣本某些特徵缺失的情況下,選擇劃分屬性
這種情況下,對於某個具有缺失值的特徵A,C4.5的方法是將數據分成兩部分,一部分是有特徵A的數據,一部分是沒有特徵A的數據。然後計算有特徵A的數據部分的信息增益率,最後將這個結果乘以一個係數,係數爲有特徵A的樣本所佔總樣本的比例。 - 選定了劃分屬性,對該屬性上的缺失值的處理
對於這個情況,將缺失特徵的樣本劃分爲一類,其餘樣本正常劃分。
- 過擬合問題
通過上面的方法產生的決策樹,可能會對訓數據分類效果很好,但是對預測數據卻不好,即決策樹出現過擬合(Overfitting)問題,訓練誤差(Training Error)小,泛化誤差(Generalization Error 或者 Test Error)大。下圖給出訓練誤差、測試誤差隨決策樹節點數的變化情況:
可以觀察到,當節點數較小時,訓練誤差與測試誤差均較大,即發生了欠擬合(Underfitting)。當節點數較大時,訓練誤差較小,測試誤差卻很大,即發生了過擬合。只有當節點數適中是,訓練誤差居中,測試誤差較小;對訓練數據有較好的擬合,同時對未知數據有很好的分類準確率。
過擬合產生的原因是決策樹模型過於複雜,可能原因如下:
- 訓練數據集中有噪音樣本點,對訓練數據擬合的同時也對噪音進行擬合,從而影響了分類的效果;
- 決策樹的葉子節點中缺乏有分類價值的樣本記錄,也就是說此葉子節點應被剪掉;
對於這個問題,C4.5採用的是正則化係數進行剪枝來解決。通過極小化決策樹的整體損失函數(Loss Function)或代價函數(Cost Function),決策樹的損失函數爲:
式中,表示決策樹的訓練誤差,爲調節參數(正則化係數),爲模型的複雜度(葉子節點數)。當模型越複雜時,訓練的誤差就越小。上述定義的損失正好做了兩者之間的權衡。如果剪枝後損失函數減少了,即說明這是有效剪枝。
具體的決策樹正則化剪枝,之後將分類和迴歸樹(CART)時候再詳細介紹。
七、C4.5算法不足
C4.5雖然改進或者改善了ID3算法的幾個主要的問題,仍然有優化的空間。
- 由於決策樹算法非常容易過擬合,因此對於生成的決策樹必須要進行剪枝。剪枝的算法有非常多,C4.5的剪枝方法有優化的空間。思路主要是兩種,一種是預剪枝,即在生成決策樹的時候就決定是否剪枝。另一個是後剪枝,即先生成決策樹,再通過交叉驗證來剪枝。
- C4.5生成的是多叉樹,即一個父節點可以有多個節點。很多時候,在計算機中二叉樹模型會比多叉樹運算效率高。如果採用二叉樹,可以提高效率。
- C4.5只能用於分類,如果能將決策樹用於迴歸的話可以擴大它的使用範圍。
- C4.5由於使用了熵模型,裏面有大量的耗時的對數運算,如果是連續值還有大量的排序運算。如果能夠加以模型簡化可以減少運算強度但又不犧牲太多準確性的話,那就更好了。
這4個問題在CART樹裏面部分加以了改進。所以目前如果不考慮集成學習話,在普通的決策樹算法裏,CART算法算是比較優的算法了。scikit-learn的決策樹使用的也是CART算法。之後我會學習和分享CART樹的原理。
參考文獻:
李航,《統計學習方法》
https://www.cnblogs.com/pinard/p/6050306.html
https://zhuanlan.zhihu.com/p/26551798
https://www.cnblogs.com/en-heng/p/5013995.html
https://blog.csdn.net/u012897374/article/details/74505024