決策樹(Decision Tree)&ID3


決策樹(Decision Tree)

本文學習內容來自西瓜書和機器學習導論。

什么是決策樹

目的:產生一棵泛化能力強的決策樹。泛化能力強指對非訓練集的樣本進行預測時仍能保持較高的准確性。

思想:分治(divide and conquer)

算法

\((x_1,y_1)\)表示第一個樣本,\(x_1\)為該樣本在各個屬性中值的集合\(\{x_{11},x_{12}...x_{1n}\}\)\(y_1\)指該樣本的類別(好瓜or壞瓜)。

圖中算法為遞歸算法,共有三處可返回遞歸

  1. line 2~3:當前節點下的所有樣本均屬於同一類別,將此節點記為葉節點,並標記出分類結果。
  2. line 5~7:當前節點下屬性值為空(不再有可以用於划分的屬性),或者所有樣本在所有屬性上取值相同,此時無法進行下一步划分,那么將此節點記為葉節點,分類結果為大多數樣本的類別
  3. line 11~12:當前無樣本,無法划分,將其記為葉節點,分類結果為其父節點中大多數樣本的類別

第二點使用的是當前節點的后驗分布。

后驗分布:

\[g(\theta|x)=c_xL(\theta,x)g(\theta) \]

其中\(\theta\)為我們要估計的參數,這里可以理解為用於判斷樣本類別的函數,\(x\)為已知的參數,可以理解為我們現在對這些樣本的屬性值和類別都已知。\(c_x\)\(f(x)\)的倒數,這里可視為常數。\(L(\theta,x)\)為最大似然估計。\(g(\theta)\)為先驗分布。

第三點把父節點的樣本分布作為當前節點的先驗分布。

以上是我對西瓜書上內容的理解,不太准確,希望大神不吝賜教。

然后我們來介紹決策樹的第一個算法:ID3。

ID3(Iterative Dichotomiser 3)

如何選擇最優划分屬性

在非葉節點中,我們需要找到一個屬性,通過樣本在該屬性上取值的不同,將其分類,最終得到我們的決策樹。

那么如何來評判這個屬性是否適合用來划分樣本集呢?

信息熵(Information Entropy)

信息熵度量樣本的純度,信息熵越小代表樣本越純。

樣本 性別
{1,2,3}
{4,5,6}
樣本 性別
{1,2,3,4,5}
{6}

以上兩個樣本集均為6個人,第一個樣本集男女各為3人,第二個樣本集男生達到5人,女生只有1人。我們稱第二個樣本集的純度較高。

\[Ent(D) = -\sum_{k=1}^\gamma p_k \log_2p_k \]

其中,\(D\)表示所有用於計算樣本。\(p_k\)表示樣本屬於第\(k\)個類別的概率。\(\gamma\)表示樣本中共有多少種不同的類別。

若所有樣本均屬於同一類別,此時我們記:\(0\log_20\equiv0\)

僅僅了解信息熵是不夠的,我們需要判斷如果使用某個屬性作為划分屬性,那么是否會使分類后的樣本純度提高。

信息增益(Information Gain)

對於某個屬性\(a\)以及樣本集\(D\),我們可以計算信息增益:

\[Gain(D,a)=Ent(D)-\sum_{v=1}^V\frac{|D^v|}{|D|}·Ent(D^v) \]

其中\(|D|\)表示\(D\)中樣本的數量,\(|D^v|\)表示樣本集中在\(a\)屬性上值為\(v\)的樣本數量

信息增益越大,表示用此屬性進行划分后的樣本集純度提高程度越大。所以我們要找到:

\[a^*=\mathop{\arg\max}_aGain(D,a) \]

舉個例子,對於西瓜書P76表4.1:

\(\gamma=2\),好瓜or壞瓜

\[Ent(D) = -\frac{8}{17}·\log_2\frac{8}{17}-\frac{9}{17}·\log_2\frac{9}{17} \]

我們選擇屬性“色澤 ”,可以看到:

\(V=3\),分別為“青綠”,“烏黑”,“淺白”。

\(|D_1|=6\),“青綠”,其中好瓜3個,壞瓜3個。

\[Ent(D_1)=-\frac{3}{6}·\log_2\frac{3}{6}-\frac{3}{6}·\log_2\frac{3}{6} \]

\(|D_2|=6\),“烏黑”,其中好瓜4個,壞瓜2個。

\[Ent(D_2)=-\frac{4}{6}·\log_2\frac{4}{6}-\frac{2}{6}·\log_2\frac{2}{6} \]

\(|D_3|=5\),“淺白”,其中好瓜1個,壞瓜4個。

\[Ent(D_3)=-\frac{1}{5}·\log_2\frac{1}{5}-\frac{4}{5}·\log_2\frac{4}{5} \]

則:

\[Gain(D=全集,a=“色澤”)=Ent(D)-\frac{6}{17}Ent(D_1)-\frac{6}{17}Ent(D_2)-\frac{5}{17}Ent(D_3) \]

然后我們在所有的屬性中找到最優的屬性,作為此節點的划分屬性。然后對分類后的每一個樣本子集遞歸計算最優划分屬性。

但是我們使用信息增益會有什么問題么?看下表

序號 居住地 學歷 性別
1 北京 小學
2 北京 初中
3 北京 高中
4 北京 大學
5 上海 小學
6 上海 初中
7 上海 高中
8 上海 大學

對於“居住地”屬性來說:

\[\begin{align} Gain(D,a_1)&= Ent(D)-0.5*(-0.5\log_20.5-0.5\log_20.5)*2 \\ &= Ent(D)-1 \end{align} \]

對於“學歷”屬性來說:

\[\begin{align} Gain(D,a_2)&=Ent(D)-0.25*(-2*0.5\log_20.5)*4\\ &= Ent(D)-1 \end{align} \]

之前學的比較淺,單純的知道信息增益傾向於選擇可取值數目較多的屬性,其實這是很片面的!

如上表計算,“學歷”屬性明顯比“居住地”屬性取值要多\((4>2)\),但是通過計算,選擇兩個屬性的信息增益相同,說明選擇這兩個屬性進行划分的效果相同。仔細分析數據,發現這個結論也符合常識。

所以我仔細查了一下信息增益的缺點。當我們只處理離散值時,其實信息增益和之后要說的信息增益率其實差別不大,但是當我們的屬性為離散值的時候就很有幫助了

如果我們把序號也作為一個侯選屬性,那么很明顯信息增益會選擇序號作為侯選屬性。更直觀的例子:對於中國人這個群體,我們會直接選取身份證號來作為最優划分屬性,但是這樣得到的是廣度很大,深度很淺的一顆分類樹。

這當然不是我們想要的,所以這才是信息增益的缺點所在。

那么如何解決這個問題呢?偉大的學者就搞出了C4.5這個東西。請看下章

Code

Code

使用的jupyter-notebook,可以先下載Anaconda再使用。

參考

1.https://www.zhihu.com/question/22928442?sort=created


免責聲明!

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



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