【機器學習】算法原理詳細推導與實現(七):決策樹算法


【機器學習】算法原理詳細推導與實現(七):決策樹算法

在之前的文章中,對於介紹的分類算法有邏輯回歸算法朴素貝葉斯算法,這類算法都是二分類的分類器,但是往往只實際問題中\(y\)不僅僅只有\(\{0,1\}\),當出現一個新的類別\(y=2\)時,之前的分類器就不太適用,這里就要介紹一個叫做決策樹的新算法,該算法對於多個目標的離散特征往往有比較好的分類效果,用以解決\(x\)是離散型的數據,這是判別模型,也是一個生成學習算法。

ID3決策樹

假設當前網上有很多機器學習的教程,我想學機器學習,但是不知道哪一個教程比較好;又或者想買一個榴蓮,不知道哪一只肉比較厚實,不知道該挑那一只,對於這種不確定性就叫做熵。

當一個事情有多種可能情況時,這件事情對於觀察人而言具體是哪種情況的不確定性叫做熵。

信息

當你不知道選擇哪一篇教程來學習機器學習時,有人和你說TTyb的機器學習教程很好,這個人對你提供的TTyb的機器學習教程很好就是信息;又或者在買榴蓮的時候,賣榴蓮的人和你說這個榴蓮的肉肯定很厚實,賣榴蓮的人和你說的這個榴蓮的肉肯定很厚實就是信息。當某件事情存在不確定性,能夠消除觀察人對於某件事情的不確定性,也就是前面說的熵,能夠消除不確定性的事物叫做信息。

信息有很多種表現形式,能夠調整不確定的概率的事物可以叫做信息

例如賣榴蓮的老板說有很大概率這個榴蓮的肉可能很厚實;能夠排除干擾的事物可以叫做信息,例如賣榴蓮的老板說這個榴蓮殼厚,肉肯定小不要選擇這個;能夠確定情況的事物可以叫做信息,賣榴蓮的老板說這個榴蓮肉肯定很厚實,開了不厚實算我的。

熵和信息數量相等,意義相反,獲取信息意味着消除了不確定性熵。

信息熵

假設有4個榴蓮只有一個肉是厚實的,老板和你說榴蓮A的肉不厚實,給你提供了\(0.4bit\)的信息,榴蓮B的肉不厚實,給你提供了\(0.6bit\)的信息,榴蓮C的肉不厚實,給你提供了\(1bit\)的信息,最后讓你確定了榴蓮D肉是厚實的。老板每次都給你提供了一次信息,為什么提供的信息量卻是不一樣的?信息是如何量化的?回想一下什么東西有單位,質量、溫度等物理量,信息也是一個物理量,要測量這個物理量,不妨回想一下我們是怎樣測量質量的,“千克”最初又是怎么被定義出來的。

其實我們最初並不知道千克的質量,而是選定了一個參照物,把這個物體的質量就稱為千克。當想要測量其他物體的質量時,就看這個物體的質量相當於多少個參照物體的質量,這里的“多少個”便是千克,如果參照物體換成“斤”,那么單位就會變化。

測量信息也是一樣,既然信息消除的是不確定性,那么就選擇另外一個事件的不確定性作為參照事件,當想要測量其他事件的信息時,就看待測事件的不確定性相當於“多少個”參照事件的不確定性,這里的多少個便是信息量。即待測物體質量為\(m\),參照物體個數(信息量)為\(n\),參照物體質量(千克)為\(x\),那么:

\[m=n\times x \]

均勻分布的信息熵

當選擇的參照物事件是像拋硬幣這樣,只有兩種等概率情況的事件時,測得的信息量的單位就被稱為比特(bit),然而測量參照物體個數(信息量)\(n\)時,我們是用待測物體質量\(m\)除以參照物體質量(千克)\(x\),即:

\[n=\frac{m}{x} \]

可是測量信息時卻不能用除法,因為拋擲3個硬幣能夠產生的等可能結果並非\(3\times 2=6\),而是\(2^3=8\)種,也就是說信息量不是線性關系,而是指數關系:

|正正正|反正正|
|正反正|正正反|
|反反正|反正反|
|正反反|反反反|

所以當知道可能情況的個數\(m\),想求這些情況相當於多少個\(n\)參照事件\(x\)所產生的,用指數運算的反函數,即對數運算計算:

\[n=log_xm \]

而這里硬幣只有正面和反面,那么這里的參照事件\(x=2\),公式變換為:

\[n=log_2m \]

上面的式子代表,在拋硬幣的實驗中,假設8個不確定情況就相當於3個硬幣拋出來結果\(3=log_28\),即信息量為\(3bit\);4個不確定情況就相當於2個硬幣拋出來結果\(2=log_24\),即信息量為\(2bit\)

一般分布的信息熵

而上面講的時拋擲硬幣,被測事件的所有可能情況都是等概率事件,但是如果存在如下假設,這里有4個榴蓮,只有一個榴蓮的肉是厚實的,其他3個榴蓮的肉是不厚實的

那么買到肉是厚實榴蓮的不確定性(信息熵)為\(log_24=2bit\),因為這里可能情況的個數\(m=4\),所以不確定性是\(2bit\)。但是如果老板和你說最大的那個(最右邊圓圈)榴蓮有50%概率是肉厚的,那么從概率上來說買最大的那個(最右邊圓圈)是肉厚的概率為\(\frac{1}{2}\),取出不是肉厚的概率是\(\frac{1}{3}\times \frac{1}{2}\),這里代表剩下3個榴蓮要瓜分剩下的\(\frac{1}{2}\)概率,所以剩下3個榴蓮每個的概率是\(\frac{1}{6}\),這時候各個情況的概率不一樣了:

這時該如何計算總信息量了呢?這時候就要分別測量每種可能情況的信息量后,乘以他們各自發生的概率再相加即可,即這時候買到肉厚的榴蓮的不確定性(信息熵)為:

\[\frac{1}{6}log_2m_1+\frac{1}{6}log_2m_2+\frac{1}{6}log_2m_3+\frac{1}{2}log_2m_4 \]

不過怎么測量每種情況的信息量\(log_2m\)呢,怎么知道概率為\(\frac{1}{6}\)的情況的不確定性相當於拋擲多少個硬幣所產生的不確定性呢?我們確實沒有辦法用\(log_2m\)這個公式了,但是我們知道\(1%\)會發生的情況,相當於從100個等概率情況中確定實際情況,即\(p=1%=frac{1}{100}\),概率的倒數等於等概率情況的個數,即\(m=\frac{1}{100}=\frac{1}{p}\),用概率的倒數\(\frac{1}{p}\)替換等概率情況的個數\(m\)后,我們就可以計算每種情況的信息量了:

\[m_1=\frac{1}{\frac{1}{6}},m_2=\frac{1}{\frac{1}{6}},m_3=\frac{1}{\frac{1}{6}},m_4=\frac{1}{\frac{1}{2}} \]

再用每個情況的信息量乘以對應事件發生的概率,再相加后就能算出總信息量了:

\[\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{2}log_2\frac{1}{\frac{1}{2}}=1.79bit \]

由此可得到,任何隨機變量\(X\)信息熵為:

\[H(X)=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} \]

信息增益

既然任何隨機變量\(X\)信息熵為:

\[H(X)=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} \]

那么假設\(p\)是隨機變量\(X\)發生的概率,如果存在多個變量\(X\)\(Y\),則他們的聯合熵為:

\[H(X,Y)=\sum_{i=1}^n p(x_i,y_i)log_2p(x_i,y_i) \]

其中\(p(x_i,y_i)\)代表事件\(X=x\)\(Y=y\)一起出現的聯合概率。有了聯合熵,又可以得到條件熵的表達式\(H(X|Y)\),條件熵類似於條件概率,當事件\(Y\)發生過后,事件\(X\)還剩下的不確定性(信息熵):

\[\begin{split} H(X|Y)&=\sum_{y} p(y)H(X|Y=y) \\ &=-\sum_{y} p(y)\sum_{x}p(x|y)log(p(x|y)) \\ &=-\sum_{y}\sum_{x}p(x,y)log(p(x|y)) \\ &=-\sum_{x,y}p(x,y)log(p(x|y)) \end{split} \]

其中\(H(X|Y)=H(X,Y)−H(Y)\),信息熵和信息增益的關系如下圖所示:

左邊的橢圓代表隨機變量\(X\)的信息熵\(H(X)\),右邊的橢圓代表隨機變量\(Y\)的信息熵\(H(Y)\),中間重合的部分就是信息增益\(I(X,Y)\), 左邊的橢圓去掉重合部分就是\(H(X|Y)\),右邊的橢圓去掉重合部分就是\(H(Y|X)\),兩個橢圓的並就是\(H(X,Y)\),由此可以得到信息增益的公式為:

\[I(X,Y)=H(X)−H(X|Y) \]

回到最初的問題,當4個榴蓮中不知道那個是肉厚的榴蓮的時候,隨機變量\(X=肉厚\),不確定性(信息熵)的套用公式為:

\[\begin{split} H(X)&=\sum_{i=1}^n p_ilog_2\frac{1}{p_i} \\ &=\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}} \\ &=2 \end{split} \]

假設每個榴蓮從左到右記為隨機變量\(X1\)\(X2\)\(X3\)\(X4\),老板告訴說最大的那個\(X4\)(最右邊圓圈)榴蓮有50%概率是肉厚的,即提供了信息\(Y\),求肉厚的信息熵。這時候先計算的信息熵為條件熵\(H(X|Y)\)

\[\begin{split} H(X|Y)&=H(X1)+H(X2)+H(X3)+H(X4|Y=y) \\ &=\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{6}log_2\frac{1}{\frac{1}{6}}+\frac{1}{2}log_2\frac{1}{\frac{1}{2}} \\ &=1.79bit \end{split} \]

最后由總的不確定性(信息熵)減去后面的不確定性(信息熵),得到老板說的話“最大的那個(最右邊圓圈)榴蓮有50%概率是肉厚的”提供的信息為:

\[\begin{split} I(X,Y)&=H(X)−H(X|Y) \\ &=2-1.79 \\ &=0.21bit \end{split} \]

提供的信息\(0.21bit\)也叫做信息增益

ID3決策樹算法步驟

輸入的是\(m\)個樣本,樣本輸出集合為\(X\),每個樣本有\(n\)個離散特征,特征集合即為\(Y\),輸出為決策樹\(T\)。例如存在樣本如下所示:

天氣 氣溫 濕度 風力 外出
晴朗 高溫 無風
晴朗 高溫 有風
多雲 高溫 無風
下雨 溫暖 無風
下雨 寒冷 正常 無風

則樣本數量\(m=5\);輸出集合為或者,即\(X_1=是,X_2=否\);每個樣本的離散特征為\(n=4\),即天氣氣溫濕度風力;特征集合為\(Y\),當離散特征\(Y'\)天氣時,特征集合\(Y_i\){晴朗,多雲,下雨}。算法的過程為:

  1. 計算\(m\)中的各個特征(一共\(n\)個)對輸出\(X\)的信息增益,選擇信息增益最大的特征\(Y'\),其中\(Y' \in Y\)
  2. 按特征\(Y'\)的不同取值\(Y_i\)將對應的樣本輸出\(X\)分成不同的類別\(X_i\),其中\(i \in n\)。每個類別產生一個子節點。對應特征值為\(Y_i\)。返回增加了節點的數\(T\)
  3. 對於所有的子節點,令\(X=X_i,m=m−\{Y'\}\)遞歸調用1-2步,得到子樹\(T_j\)並返回。

C4.5決策樹

ID3算法雖然提出了新思路,但是還是有如下4點需要改進的地方:

  1. ID3沒有考慮連續特征,比如長度、密度都是連續值,無法在ID3運用,這大大限制了ID3的用途。--數據分箱即可解決
  2. ID3采用信息增益大的特征優先建立決策樹的節點,但信息增益准則對可取值數目較多的屬性有所偏好。
  3. 算法對於缺失值的情況沒有做考慮。--特征工程即可解決
  4. 沒有考慮過擬合的問題。--預剪枝和后剪枝

對於上面的第2點需要做一下解釋。從上面可以知道,ID3信息增益的計算公式為:

\[I(X,Y)=H(X)−H(X|Y) \]

信息增益的大小取決於隨機變量\(Y\)信息熵的大小,\(H(X|Y)\)越小則信息增益越大,而什么情況下\(H(X|Y)\)會有極小的信息熵呢?舉一個極端的例子,如果上面的例子中,變量天氣的特征互不相同變成:

天氣 氣溫 濕度 風力 外出
大晴 高溫 無風
小晴 高溫 有風
多雲 高溫 無風
大雨 溫暖 無風
小雨 寒冷 正常 無風

那么天氣的信息熵會等於0,計算如下,當天氣為大晴時,\(\frac{1}{1}\)的概率不外出,\(0\)的概率外出,那么大晴的信息熵\(H(X=外出|Y=大晴)\)為:

\[\begin{split} H(X=外出|Y=大晴)&=\frac{1}{1}log_2\frac{1}{\frac{1}{1}}+0log_20 \\ &=0 \end{split} \]

同理天氣條件下其他特征的信息熵都是\(0\),那么天氣的信息熵\(H(X=外出|Y=天氣)=0\),得到天氣的信息增益就最大了。也就是說決策樹給天氣這個屬性下的離散特征都單獨分成了一個子類,也就是說有多少種天氣情況就有多少種取值,那么原數據集中有多少個離散特征,就會被划分為多少個子類。雖然這種划分毫無意義,但是從信息增益准則來講,這就是最好的划分結果。

對於這種結果看似完美划分了隨機變量的特征,然而根據大數定律,只有當樣本數足夠多的時候,頻率才可以准確的近似概率。也就是說,樣本數越少,對概率的估計結果的方差就會越大,結果也就越不准。想象一下做拋硬幣實驗來近似正面向上的概率,如果只拋兩次,那么得到的正面向上的概率可能會非常離譜。而如果拋1萬次,不論何時何地幾乎總能得到近似0.5的概率。

而C4.5就是為了解決信息增益准則對可取值數目較多的屬性有所偏好這種問題,由此提出了信息增益比,計算公式為:

\[Ir=(X,Y)=\frac{I(X,Y)}{IV(Y)} \]

其中\(IV(Y)\)計算方式為:

\[IV(Y)=\sum_yp_ylogp_y \]

\(p_y\)等於隨機變量\(Y=y\)的概率。當信息熵\(H(X|Y)\)最小時,也就是分類各不相等的時候,\(IV(Y)\)也相對最小,這樣就減輕了划分行為本身的影響。

cart決策樹

基尼系數

有一個盒子里面放着小球,如果小球的顏色都是綠色,那么代表綠色的概率是\(p_綠=1\),我們可以稱隨機變量\(X=綠\)是純正的:

如果盒子里面的小球包含不同的顏色,不同顏色發生的概率為\(p_1,p_2,...\),我們可以稱隨機變量\(X\)不純正的:

假設某組樣本存在多個隨機變量\(X_1,X_2,...,X_n\),他們各自發生的概率是\(\{p_1,p_2,...,p_n\}\),那么這組樣本的純正程度可以使用基尼系數(Gini)衡量:

\[Gini=1-p_1^2-p_2^2-...-p_n^2 \]

假設一個盒子存在3種顏色的小球,他們的概率是:\(\{\frac{1}{3},\frac{1}{3},\frac{1}{3}\}\),那么基尼系數為:\(Gini=1-(\frac{1}{3})^2-(\frac{1}{3})^2-(\frac{1}{3})^2=0.6666\)。其他情況的基尼系數計算:

\(\{\frac{1}{10},\frac{2}{10},\frac{7}{10}\}\),\(\{1,0,0\}\)

計算的基尼系數為:

\[Gini=1-(\frac{1}{10})^2-(\frac{2}{10})^2-(\frac{7}{10})^2=0.46 \]

\[Gini=1-(1)^2-(0)^2-(0)^2=0 \]

基尼系數越大,代表樣本越不純凈;基尼系數越小,代表樣本越純凈,最終會找出\(Gini\)指數最小的來作為最優的划分點

剪枝

決策樹算法為了避免過擬合和簡化決策樹模型,提出了剪枝的方法,剪枝分為預剪枝和后剪枝,剪枝的原理如下:

  • 預剪枝:在構造決策樹的同時進行剪枝,也就是在節點划分前進行判斷。所有決策樹的構建方法,都是在無法進一步降低熵的情況下才會停止創建分支的過程,為了避免過擬合,可以設定一個閾值,熵減小的數量小於這個閾值,即使還可以繼續降低熵,也停止繼續創建分支。但是這種方法實際中的效果並不好。

  • 后剪枝:在決策樹生長完全構造好了過后,對樹進行剪枝。剪枝的過程是對擁有同樣父節點的一組節點進行檢查,判斷如果將其合並,熵的增加量是否小於某一閾值。如果確實小,則這一組節點可以合並一個節點。后剪枝是目前最普遍的做法。

常見的剪枝有REP(Reduced Error Pruning)、PEP(Pessimistic Error Pruning)、CCP(Cost Complexity Pruning)和MEP(Minimum Error Pruning)算法,以下分別進行說明。

Reduced-Error Pruning(REP,錯誤率降低剪枝)

REP是最簡單粗暴的一種后剪枝方法,其目的減少誤差樣本數量。該算法是從下往上依次遍歷所有的子樹,直至沒有任何子樹可以替換使得在驗證集上的表現得以改進時,算法就可以終止。

假設樹\(T\)存在很多結點\(t\),其中\(t \in T\)\(e(t)\)表示節點\(t\)下訓練樣本誤判的數量,則有訓練樣本誤判總數量\(f(T)\)為:

\[f(T)=-\sum_{t \in T}e(t) \]

假設樹\(T\)去掉某個節點\(t'\)變成樹\(T'\),則有訓練樣本誤判總數量\(f(T')\)為:

\[f(T')=-\sum_{t \in T'}e(t) \]

如果誤判的數量降低,即剪枝之后使得誤差降低:

\[f(T) \leqslant f(T') \]

那么代表剪枝后能使誤差降低,剪枝成功。反復進行上面的操作,從底向上的處理結點,刪除那些有害的結點,直到進一步修剪不能減低誤差為止。例如:存在如下一棵樹:

Step 1: 將節點4刪掉替換成8和9,測試在驗證集上的表現,若表現更好,則將節點4刪掉並替換成8和9的並集,若表現不好則保留原樹的形狀
Step 2: 將節點2刪掉替換成8、9和5,測試在驗證集上的表現
Step 3: 將節點3刪掉替換成6和7,測試在驗證集上的表現

REP是最簡單的后剪枝方法之一,不過由於使用獨立的驗證集,如果數據量較少(數據要分為訓練集、驗證集、測試集三份),那么在使用驗證集進行剪枝的時候,可能會在驗證集出現的稀有實例,卻在測試集中沒有出現,那么就會存在過度剪枝的情況。如果數據集較小,通常不考慮采用REP算法。盡管REP有這個缺點,但還是能夠解決一定程度的過擬合問題。

Pesimistic-Error Pruning(PEP,悲觀錯誤剪枝)

上文的REP方法思想簡單且易於使用,不過最大的問題在於它需要一個新的驗證集來修正我們的決策樹在,PEP方法中不需要新的驗證集,並且PEP是自上而下剪枝的。PEP的剪枝是把一顆子樹(具有多個葉子節點)的分類用一個葉子節點來替代,如下所示:

原來子樹1可以分成(4,5,6,7)多個類,但是剪枝變成只能分成一個類(1)。同樣的樣本子集,如果用子樹分類可以分成多個類,准確率肯定要高一些,而用單顆葉子節點來分的話只能分成一個類,准確肯定要低一些,所以\(PEP\)的誤判率肯定是上升的。訓練數據也帶來錯分誤差偏向於訓練集,為了解決這一問題,給每個子葉節點加入修正項\(\frac{1}{2}\)。具有\(T\)個節點的樹的錯誤率為:

\[E(T) = \sum_{t \in T}\frac{e(t)+1/2}{N(t)} \]

去掉節點\(K\)個子葉節點之后T′個節點的樹的錯誤率為:

\[E(T')=\sum_{t \in T, excep K}\frac{e(t)+1/2K}{N(t)} \]

其中\(e(t)\)表示節點\(t\)下訓練樣本誤判的數量,\(N(t)\)表示節點\(t\)下訓練樣本的總數量。

PEP悲觀錯誤剪枝剪枝法定義,如果 E(剪枝后誤判數均值)−E(剪枝前誤判數均值)<std(剪枝前誤判數標准差),則可以剪枝,假設在子樹中每一個樣本的誤判服從一個二項分布\(B(N,p)\),其中\(N\)表示子樹所包含的所有樣本個數。

所以,在剪枝前,其期望的誤判數為:

\[e(t)=N(t)∗E(t) \]

其誤判的標准差為:

\[std(t)=\sqrt{N(t)∗E(T)*(1-E(T))} \]

當剪枝后的誤判數小於剪枝前的誤判數一個標准差之后,就決定剪枝:

\[e(t')-e(t)<std(t)=\sqrt{N(t)\times E(T)\times (1-E(T))} \]

例如:存在如下一棵樹:

對於節點T4而言,剪枝前后的計算過程如下:

已知\(E(T7)=0 ;E(T8)=2;E(T9)=1;E(T10)=1;E(T4)=7;N(t)=20\),所以,剪枝前的誤判概率為:

\[E(T)=\frac{(0+2+1+1)+4∗0.5}{20}=0.3 \]

所以:

\[e(t)=20*0.3=6 \]

\[std(t)=\sqrt{20*0.3*(1-0.3)}=2.05 \]

在我們對T4進行剪枝后,即將T4直接作為葉節點,剪枝后的誤判概率:

\[E(T')=\frac{7+0.5}{20}=0.375 \]

剪枝后的誤判期望數為:

\[e(t')=20*0.375=7.5 \]

\[7.5-2.05<6 \]

因此滿足條件,所以我們將把T4節點剪枝

Cost-Complexity Pruning(CCP,代價復雜度剪枝)

該算法為子樹\(T_t\)定義了代價(cost)和復雜度(complexity),以及一個可由用戶設置的衡量代價與復雜度之間關系的參數\(\alpha\),其中,代價指在剪枝過程中因子樹\(T_t\)被葉節點替代而增加的錯分樣本,復雜度表示剪枝后子樹\(T_t\)減少的葉結點數,\(\alpha\)則表示剪枝后樹的復雜度降低程度與代價間的關系,定義為:

\[α= \frac{R(t)−R(T_t)}{∣N∣−1}​ \]

其中,

  • \(|N|\):子樹\(T_t\)中的葉節點數;
  • \(R(t)\):結點\(t\)的錯誤代價,計算公式為\(R(t)=r(t)*p(t)\);
  • \(r(t)\)為結點t的錯分樣本率,\(p(t)\)為落入結點t的樣本占所有樣本的比例;
  • \(R(T_t)\):子樹\(T_t\)錯誤代價,計算公式為\(R(T_t)=\sum R(i)\)\(i\)為子樹\(T_t\)的葉節點。

CCP算法可以分為兩個步驟,
Step 1: 按照上述公式從下到上計算每一個非葉節點的αα值,然后每一次都剪掉具有最小αα值的子樹。從而得到一個集合\(\{T_0,T_1,T_2,...,T_M\}\),其中,\(T_0\)表示完整的決策樹,\(T_M\)表示根節點
Step 2: 根據真實的錯誤率在集合\(\{T_0,T_1,T_2,...,T_M\}\)選出一個最好的決策樹

假設在下圖中有數據100條,從下往上開始計算:

先以節點T4為例,那么可以得到:

\[R(t)=r(t)*p(t)=\frac{7}{9+7}*\frac{9+7}{100}=\frac{7}{100} \]

\[R(T_t)=\sum R(i)=R(7)+R(8)+R(6)=\frac{2}{3+2}*\frac{3+2}{100}+\frac{0}{0+2}*\frac{0+2}{100}+\frac{3}{6+3}*\frac{6+3}{100}=\frac{5}{100} \]

\[α= \frac{R(t)−R(T_t)}{∣N∣−1}​=\frac{\frac{7}{100}-\frac{5}{100}}{3-1}=\frac{1}{100} \]

REP PEP CCP
剪枝方式 自底向上 自頂向下 自底向上
計算復雜度 0(n) 0(n) o(n2)
誤差估計 驗證集上誤差估計 使用連續糾正 標准誤差

總結

對一般三種決策樹進行總結,區分如下所示:

算法 支持模型 特征選擇 連續值處理 確實值處理 剪枝
ID3 分類 信息增益 不支持 不支持 不支持
C4.5 分類 信息增益比 支持 支持 支持
CART 分類、回歸 基尼系數 支持 支持 支持

實例

假設觀測到歷史有如下一組信息:

天氣 氣溫 濕度 風力 外出
晴朗 高溫 無風
晴朗 高溫 有風
多雲 高溫 無風
下雨 溫暖 無風
下雨 寒冷 正常 無風
下雨 寒冷 正常 有風
多雲 寒冷 正常 有風
晴朗 溫暖 無風
晴朗 寒冷 正常 無風
下雨 溫暖 正常 無風
晴朗 溫暖 正常 有風
多雲 溫暖 有風
多雲 高溫 正常 無風
下雨 溫暖 有風

計算邏輯

可以看到這個樹的根節點是外出,而根節點往下的一個節點,該怎么定義用哪一個條件呢?決策樹構建樹節點的條件在於:該節點能最大程度的提供有用的信息,使得不確定性(信息熵)減少得最快。也就是說,天氣、氣溫、濕度、風力這四個條件,哪一個條件為結果外出提供更多的信息:

要計算哪一個條件能提供更多的信息,只要計算根節點和另一節點的信息熵差值,就是提供的信息增益了。由上面的表格可以知道,外出的概率為\(\frac{9}{14}\),不外出的概率是\(\frac{5}{14}\),很顯然這是一個不均勻分布,要使用一般分布的信息熵計算:

\[\sum p_ilog_2\frac{1}{p_i} \]

則根節點外出的信息熵\(H(X=外出)\)為:

\[\begin{split} H(X=外出)&=\frac{9}{14}log_2\frac{1}{\frac{9}{14}}+\frac{5}{14}log_2\frac{1}{\frac{5}{14}} \\ &=0.940 \end{split} \]

接着分別計算各個條件的信息熵,先計算天氣各個情況的信息熵:

  • 天氣為晴朗時,2/5的概率外出,3/5的概率不外出,晴朗的信息熵\(H(X=外出|Y=晴朗)\)為:

\[\begin{split} H(X=外出|Y=晴朗)&=\frac{2}{5}log_2\frac{1}{\frac{2}{5}}+\frac{3}{5}log_2\frac{1}{\frac{3}{5}} \\ &=0.971 \end{split} \]

  • 天氣為多雲時,0的概率外出,0的概率不外出,信息熵\(H(X=外出|Y=多雲)\)為:

\[\begin{split} H(X=外出|Y=多雲)&=0+0 \\ &=0 \end{split} \]

  • 天氣為下雨時,3/5的概率外出,2/5的概率不外出,信息熵\(H(X=外出|Y=下雨)\)為:

\[\begin{split} H(X=外出|Y=下雨)&=\frac{3}{5}log_2\frac{1}{\frac{3}{5}}+\frac{2}{5}log_2\frac{1}{\frac{2}{5}} \\ &=0.971 \end{split} \]

而天氣是 晴朗 的概率為5/14,天氣是 多雲 的概率為4/14,天氣是 下雨 的概率為5/14,所以 天氣 的信息熵\(H(X=外出|Y=天氣)\)為:

\[\begin{split} H(X=外出|Y=天氣)&=\frac{5}{14} \times H(X=外出|Y=晴朗)+0 \times H(X=外出|Y=多雲)+\frac{4}{14} \times H(X=外出|Y=下雨) \\ &=\frac{5}{14} \times 0.971+0 \times 0+\frac{4}{14} \times 0.971 \\ &=0.693 \end{split} \]

天氣的信息增益\(I(X=外出,Y=天氣)\)為:

\[\begin{split} I(X=外出,Y=天氣)&=H(X=外出)-H(X=外出|Y=天氣) \\ &=0.940-0.693 \\ &=0.247 \end{split} \]

同理計算得到,氣溫的信息熵\(H(X=外出|Y=氣溫)\)為:

\[\begin{split} H(X=外出|Y=氣溫)&=\frac{4}{14}H(X=外出|Y=高溫)+\frac{6}{14}H(X=外出|Y=溫暖)+\frac{4}{14}H(X=外出|Y=寒冷) \\ &=\frac{4}{14}(\frac{2}{4}log_2\frac{1}{\frac{2}{4}}+\frac{2}{4}log_2\frac{1}{\frac{2}{4}})+\frac{6}{14}(\frac{4}{6}log_2\frac{1}{\frac{4}{6}}+\frac{2}{6}log_2\frac{1}{\frac{2}{6}})+\frac{4}{14}(\frac{3}{4}log_2\frac{1}{\frac{3}{4}}+\frac{1}{4}log_2\frac{1}{\frac{1}{4}}) \\ &=\frac{4}{14}\times 1.0+\frac{6}{14}\times 0.918296+\frac{4}{14}\times 0.811278 \\ &=0.911 \end{split} \]

氣溫的信息增益\(I(X=外出,Y=氣溫)\)為:

\[\begin{split} I(X=外出,Y=氣溫)&=H(X=外出)-H(X=外出|Y=氣溫) \\ &=0.940-0.911 \\ &=0.029 \end{split} \]

濕度的信息熵\(H(X=外出|Y=濕度)\)為:

\[\begin{split} H(X=外出|Y=濕度)&=\frac{7}{14}H(X=外出|Y=高)+\frac{7}{14}H(X=外出|Y=正常) \\ &=\frac{7}{14}\times (\frac{6}{7}log_2\frac{1}{\frac{6}{7}}+\frac{1}{7}log_2\frac{1}{\frac{1}{7}})+\frac{7}{14}\times (\frac{3}{7}log_2\frac{1}{\frac{3}{7}}+\frac{4}{7}log_2\frac{1}{\frac{4}{7}}) \\ &=\frac{7}{14}\times 0.591673+\frac{7}{14}\times 1.159856 \\ &=0.788 \end{split} \]

濕度的信息增益\(I(X=外出,Y=濕度)\)為:

\[\begin{split} I(X=外出,Y=濕度)&=H(X=外出)-H(X=外出|Y=濕度) \\ &=0.940-0.788 \\ &=0.152 \end{split} \]

風力的信息熵\(H(X=外出|Y=風力)\)為:

\[\begin{split} H(X=外出|Y=風力)&=\frac{6}{14}E_{有風}+\frac{8}{14}E_{無風} \\ &=\frac{6}{14}\times (\frac{3}{6}log_2\frac{1}{\frac{3}{6}}+\frac{3}{6}log_2\frac{1}{\frac{3}{6}})+\frac{8}{14}\times (\frac{6}{8}log_2\frac{1}{\frac{6}{8}}+\frac{2}{8}log_2\frac{1}{\frac{2}{8}}) \\ &=\frac{6}{14}\times 1.0+\frac{8}{14}\times 0.811278 \\ &=0.892 \end{split} \]

風力的信息增益\(I(X=外出,Y=風力)\)為:

\[\begin{split} I(X=外出,Y=風力)&=H(X=外出)-H(X=外出|Y=風力) \\ &=0.940-0.892 \\ &=0.048 \end{split} \]

可以看到,信息增益:\(I(X=外出,Y=天氣)>I(X=外出,Y=濕度)>I(X=外出,Y=風力)>I(X=外出,Y=氣溫)\),所以對是否外出提供信息最多的條件是天氣。也就是說在決定是否外出的時候,天氣是最重要的一個影響因素,天氣的好壞很大程度決定了當天是否會外出,減少是否外出的不確定性。

但是天氣分為多雲、下雨、晴朗,由數據集可以知道多雲的時候,無論氣溫、濕度和風力如何,都會外出;而下雨和晴朗的時候,會根據氣溫、濕度和風力的情況再來決定是否外出,因此決策樹的構造變成了:

而下雨和晴朗的時候,會根據氣溫、濕度和風力的情況再來決定是否外出,這時就需要計算:

下雨時,選擇信息增益最大的屬性(氣溫、濕度或風力)來作為下一個節點
晴朗時,選擇信息增益最大的屬性(氣溫、濕度或風力)來作為下一個節點

天氣=下雨的情況下:

由前面知道\(H(X=外出,Y=下雨)=0.971\),在下雨時氣溫、濕度和風力外出情況如下所示:

天氣 氣溫 濕度 風力 外出
下雨 溫暖 無風
下雨 寒冷 正常 無風
下雨 寒冷 正常 有風
下雨 溫暖 正常 無風
下雨 溫暖 有風

氣溫的信息熵\(H(X_1=外出,X_2=下雨|Y=氣溫)\)為:

\[\begin{split} H(X_1=外出,X_2=下雨|Y=氣溫)&=H(X_1=外出,X_2=下雨|Y=溫暖)+H(X_1=外出,X_2=下雨|Y=寒冷) \\ &=\frac{3}{5}\times (\frac{2}{3}log_2\frac{1}{\frac{2}{3}}+\frac{1}{3}log_2\frac{1}{\frac{1}{3}})+\frac{2}{5}\times (\frac{1}{2}log_2\frac{1}{\frac{1}{2}}+\frac{1}{2}log_2\frac{1}{\frac{1}{2}}) \\ &=0.951 \end{split} \]

同理可得 濕度的信息熵\(H(X_1=外出,X_2=下雨|Y=濕度)=0.951\)風力的信息熵\(H(X_1=外出,X_2=下雨|Y=風力)=0\)

天氣=晴朗的情況下:

\(H(X_1=外出,X_2=晴朗|Y=濕度)\)最大,那么新得到的樹形如下所示:

而上面卻發現沒有氣溫選項?因為在其他三個的條件下就能決定是否外出了,氣溫對於外出沒有直接影響。

計算代碼

將文本轉化為數字:

data[data == u'晴朗'] = 2
data[data == u'多雲'] = 1
data[data == u'下雨'] = 0
data[data == u'高溫'] = 2
data[data == u'溫暖'] = 1
data[data == u'寒冷'] = 0
data[data == u'高'] = 1
data[data == u'正常'] = 0
data[data == u'有風'] = 1
data[data == u'無風'] = 0
data[data == u'是'] = 1
data[data == u'否'] = 0

基於信息熵來計算:

# 建立決策樹模型,基於信息熵
dtc = DTC(criterion='entropy')
dtc.fit(x_train, y_train)

預測:

print(dtc.predict(x_test))
print(dtc.score(x_test, y_test))

這里樣本比較小,所以得到的准確率分數為1.0

數據和代碼下載請關注公眾號【 機器學習和大數據挖掘 】,后台回復【 機器學習 】即可獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM