決策樹(Decision Tree)
本文學習內容來自西瓜書和機器學習導論。
什么是決策樹
目的:產生一棵泛化能力強的決策樹。泛化能力強指對非訓練集的樣本進行預測時仍能保持較高的准確性。
思想:分治(divide and conquer)
算法
\((x_1,y_1)\)表示第一個樣本,\(x_1\)為該樣本在各個屬性中值的集合\(\{x_{11},x_{12}...x_{1n}\}\),\(y_1\)指該樣本的類別(好瓜or壞瓜)。
圖中算法為遞歸算法,共有三處可返回遞歸:
- line 2~3:當前節點下的所有樣本均屬於同一類別,將此節點記為葉節點,並標記出分類結果。
- line 5~7:當前節點下屬性值為空(不再有可以用於划分的屬性),或者所有樣本在所有屬性上取值相同,此時無法進行下一步划分,那么將此節點記為葉節點,分類結果為大多數樣本的類別。
- line 11~12:當前無樣本,無法划分,將其記為葉節點,分類結果為其父節點中大多數樣本的類別。
第二點使用的是當前節點的后驗分布。
后驗分布:
其中\(\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人。我們稱第二個樣本集的純度較高。
其中,\(D\)表示所有用於計算樣本。\(p_k\)表示樣本屬於第\(k\)個類別的概率。\(\gamma\)表示樣本中共有多少種不同的類別。
若所有樣本均屬於同一類別,此時我們記:\(0\log_20\equiv0\)。
僅僅了解信息熵是不夠的,我們需要判斷如果使用某個屬性作為划分屬性,那么是否會使分類后的樣本純度提高。
信息增益(Information Gain)
對於某個屬性\(a\)以及樣本集\(D\),我們可以計算信息增益:
其中\(|D|\)表示\(D\)中樣本的數量,\(|D^v|\)表示樣本集中在\(a\)屬性上值為\(v\)的樣本數量
信息增益越大,表示用此屬性進行划分后的樣本集純度提高程度越大。所以我們要找到:
舉個例子,對於西瓜書P76表4.1:
\(\gamma=2\),好瓜or壞瓜
我們選擇屬性“色澤 ”,可以看到:
\(V=3\),分別為“青綠”,“烏黑”,“淺白”。
\(|D_1|=6\),“青綠”,其中好瓜3個,壞瓜3個。
\(|D_2|=6\),“烏黑”,其中好瓜4個,壞瓜2個。
\(|D_3|=5\),“淺白”,其中好瓜1個,壞瓜4個。
則:
然后我們在所有的屬性中找到最優的屬性,作為此節點的划分屬性。然后對分類后的每一個樣本子集遞歸計算最優划分屬性。
但是我們使用信息增益會有什么問題么?看下表
序號 | 居住地 | 學歷 | 性別 |
---|---|---|---|
1 | 北京 | 小學 | 男 |
2 | 北京 | 初中 | 男 |
3 | 北京 | 高中 | 女 |
4 | 北京 | 大學 | 女 |
5 | 上海 | 小學 | 女 |
6 | 上海 | 初中 | 女 |
7 | 上海 | 高中 | 男 |
8 | 上海 | 大學 | 男 |
對於“居住地”屬性來說:
對於“學歷”屬性來說:
之前學的比較淺,單純的知道信息增益傾向於選擇可取值數目較多的屬性,其實這是很片面的!
如上表計算,“學歷”屬性明顯比“居住地”屬性取值要多\((4>2)\),但是通過計算,選擇兩個屬性的信息增益相同,說明選擇這兩個屬性進行划分的效果相同。仔細分析數據,發現這個結論也符合常識。
所以我仔細查了一下信息增益的缺點。當我們只處理離散值時,其實信息增益和之后要說的信息增益率其實差別不大,但是當我們的屬性為離散值的時候就很有幫助了。
如果我們把序號也作為一個侯選屬性,那么很明顯信息增益會選擇序號作為侯選屬性。更直觀的例子:對於中國人這個群體,我們會直接選取身份證號來作為最優划分屬性,但是這樣得到的是廣度很大,深度很淺的一顆分類樹。
這當然不是我們想要的,所以這才是信息增益的缺點所在。
那么如何解決這個問題呢?偉大的學者就搞出了C4.5這個東西。請看下章
Code
使用的jupyter-notebook,可以先下載Anaconda再使用。