【面試考】【入門】決策樹演算法ID3,C4.5和CART

忽逢桃林發表於2020-05-24

關於決策樹的purity的計算方法可以參考:
決策樹purity/基尼係數/資訊增益 Decision Trees
如果有不懂得可以私信我,我給你講。

ID3

用下面的例子來理解這個演算法:


下圖為我們的訓練集。總共有14個訓練樣本,每個樣本中有4個關於天氣的屬性,這些屬性都是標稱值。輸出結果只有2個類別,玩(yes)或者不玩(no):
在這裡插入圖片描述

首先先計算整個資料集的熵Entropy:

  • 因為整個資料集只有兩個類別,他們的分佈概率分別是\(\frac{9}{14}\)\(\frac{5}{14}\),所以根據Entropy是:\(Entropy(S)=-(\frac{9}{14}*log_2(\frac{9}{14})+\frac{5}{14}*log_2(\frac{5}{14}))=0.94\)

然後我們要考慮根據哪一個屬性進行分裂,假設根據Outlook屬性進行分裂,我們可以發現Outlook中有三個值,分別是:Sun,Rain,Overcast,分別計算他們的熵:
\(Entropy(S_{sun})=-(\frac{2}{5}*log_2(\frac{2}{5})+\frac{3}{5}*log_2(\frac{3}{5}))=0.971\)
\(Entropy(S_{overcast})=-(\frac{4}{4}*log_2(\frac{4}{4})+\frac{0}{4}*log_2(\frac{0}{4}))=0\)
\(Entropy(S_{rain})=-(\frac{3}{5}*log_2(\frac{3}{5})+\frac{2}{5}*log_2(\frac{2}{5}))=0.971\)
計算完三個Entropy後,來計算資訊增益Information Gain:
\(IG(S,Outlook)=Entropy(S)-(\frac{5}{14}*Entropy(S_{sun})+\frac{5}{14}*Entropy(S_{overcast})+\frac{5}{14}*Entropy(S_{rain}))=0.246\)

用同樣的道理,我們可以求出來剩下的幾個特徵的資訊增益:
\(IG(S,Wind)=0.048\)
\(IG(S,Temperature)=0.0289\)
\(IG(S,Humidity)=0.1515\)
因為outlook這個作為劃分的話,可以得到最大的資訊增益,所以我們就用這個屬性作為決策樹的根節點,把資料集分成3個子集,然後再在每一個子集中重複上面的步驟,就會得到下面這樣的決策樹:
在這裡插入圖片描述

ID3的缺點

  1. 如果樣本中存在一個特徵,這個特徵中所有值都不相同(比方說是連續值的特徵),這樣可以想想的出假設用這個特徵作為劃分,那麼資訊增益一定是非常大的,因為所有的劃分中都只會包含一個樣本;對於具有很多值的屬性它是非常敏感的,例如,如果我們資料集中的某個屬性值對不同的樣本基本上是不相同的,甚至更極端點,對於每個樣本都是唯一的,如果我們用這個屬性來劃分資料集,它會得到很大的資訊增益,但是,這樣的結果並不是我們想要的。
  2. ID3不能處理連續值屬性;
  3. ID3演算法不能處理具有缺失值的樣本;
  4. 非常容易過擬合。

C4.5

對於有很多值得特徵,ID3是非常敏感的,而C4.5用增益率Gain ratio解決了這個問題,先定義內在價值Intrinsic Value:

\[IV(S,a)=-\sum_{v\in values(a)}{\frac{|x\in S|value(x,a)=v|}{|S|}*log_2(\frac{|x\in S|value(x,a)=v|}{|S|})} \]

這個公式怎麼理解呢?

  • S就是資料集樣本,\(|S|\)就是樣本數量;
  • a是某一個特徵,比方說Outlook或者是Wind,然後\(v\in values(a)\)就是v就是a這個特徵中的某一個值;
  • \(|x\in S|value(x,a)=v|\)這個就是某一個特徵a是v的樣本數量;
    然後決策樹之前使用資訊增益Information Gain來作為分裂特徵的選擇,現在使用增益率IG rate:

\[IGR(S,a)=\frac{IG(S,a)}{IV(S,a)} \]

可想而知,如果存在一個特徵,比方說一個學生的學號(每一個學生的學號都不相同),如果用ID3選擇學號進行分裂,那麼一定可以達到非常大的資訊增益,但是其實這是無意義過擬合的行為。使用C4.5的話,我們要計算IGR,這個學號的特徵的內在價值IV是非常大的,所以IGR並不會很大,所以模型就不會選擇學號進行分裂。

此外。C4.5可以處理連續值得劃分,下面,我舉例說明一下它的解決方式。假設訓練集中每個樣本的某個屬性為:{65, 70, 70, 70, 75, 78, 80, 80, 80, 85, 90, 90, 95, 96}。現在我們要計算這個屬性的資訊增益。我們首先要移除重複的值並對剩下的值進行排序:{65, 70, 75, 78, 80, 85, 90, 95, 96}。接著,我們分別求用每個數字拆分的資訊增益(比如用65做拆分:用≤65和>65≤65和>65做拆分,其它數字同理),然後找出使資訊增益獲得最大的拆分值。因此,C4.5演算法很好地解決了不能處理具有連續值屬性的問題。

C4.5如何處理缺失值

  • 如果是訓練資料中出現了缺失資料,那麼就會考慮這個缺失資料所有可能的值。比方說一開始的資料庫中,D1的Outlook變成了缺失值,那麼D1的Outlook就會有\(\frac{4}{13}\)的概率是Sun,有\(\frac{4}{13}\)的概率是Overcast,有\(\frac{5}{13}\)的概率是Rain,然後其實也可以理解為這個樣本就會變成3個樣本,這三個樣本有著不同的權重。
  • 如果是在預測資料中出現了缺失資料,那麼同樣的,認為這個資料的這個缺失資料可能是任何可能的值,這個概率就是看決策樹中Outlook劃分的子集的樣本數量。這個地方可能有點難懂,不理解的可以看這個博文:
    機器學習筆記(7)——C4.5決策樹中的缺失值處理

C4.5對決策樹的剪枝處理
有兩種剪枝處理方法,一個是預剪枝,一個是後剪枝,兩者都是比較驗證集精度,區別在於:

  • 預剪枝:從上到下進行剪枝,如果精度沒有提升,那麼就剪掉,這個處理在訓練模型的過程中進行;
  • 後剪枝:從下到上進行剪枝,如果剪掉精度可以提升,就剪掉,這個處理過程是在模型訓練結束之後再進行的。
    通常來說後者會比前者保留更多的分支,欠擬合的風險小,但是訓練時間的開銷會大一些。
    更具體地內容推薦這篇博文,講的清晰易懂(沒有必要看懂這個博文中的Python實現過程,畢竟現在sklearn庫中都封裝好了):
    機器學習筆記(6)——C4.5決策樹中的剪枝處理和Python實現

CART

分類迴歸樹Classification and Regression Trees與C4.5的演算法是非常相似的,並且CART支援預測迴歸任務。並且CART構建的是二叉樹。

相關文章