資料探勘入門系列教程(三點五)之決策樹
阿新 • • 發佈:2020-03-14
## 資料探勘入門系列教程(三點五)之決策樹
本來還是想像以前一樣,繼續學習《 Python資料探勘入門與實踐 》的第三章“決策樹”,但是這本書上來就直接給我懟了一大串程式碼,對於`決策樹`基本上沒有什麼介紹,可直接把我給弄懵逼了,主要我只聽過決策樹還沒有認真的瞭解過它。
這一章節主要是對決策樹做一個介紹,在下一個章節,將使用決策樹來進行預測分類 。
### 決策樹(Decision Tree)介紹
Decision Tree是一類較為常見的機器學習的方法。它既可以作為分類演算法,也可以作為迴歸演算法。
如何來介紹決策樹,這裡舉一個例子:在大學,你找女朋友的時候,心目中順序應該是這樣的(僅僅是舉一個例子):
- Q:性別要求?
- A:不是女的不要。
- Q:年齡要求?
- A:大於我3歲的不要
- Q:專業要求?
- A:非CS不要
- ……
為了更好的表示上面的這一些問題,我們可以將其畫成一張樹狀圖如下所示:
上面的這棵樹就是我們找女朋友的決策過程,圓角矩形代表了判斷條件,橢圓形代表了決策結果。通過性別,年齡,專業這幾個屬性,最終我們得出了最終的決策。而這棵樹也就被稱之為決策樹。
大家通過上圖會發現有3個東西:
- 根節點:包含樣本的全集
- 內部節點:對應特徵屬性測試
- 葉節點:代表決策的結果
在一棵決策樹中,包含了一個`根節點`,多個`內部節點(判斷條件)` 和若干個`葉子節點`。先說葉子節點,在決策樹中,葉子節點對應了決策結果,決策結果可以有多種型別(圖中是yes和no,也可以為1,2,3)。內部節點和根節點對應的都是`屬性測試`,只不過先後順序不同。
總的來說,決策樹體現的是一種“分而治之”的思想,
那麼這裡就有一個問題,誰來當根節點?誰又來當中間的節點?先後順序又是怎樣的?(這裡先不說演算法流程,從簡單開始說起,然後再說演算法流程)
### 結點的選擇
首先我們需要明白根節點和中間節點是不同的,一個是統領全域性的開始包含所有的樣本。一個是負責區域性的決策,並且隨著決策樹的不斷的進行決策,所包含的樣本逐漸屬於同一個類別,即節點的“純度”越來越高。
那麼,我們如何來尋找合適根節點(也就是屬性)呢?靠感覺?靠感覺當然不行,我們需要一個具體的數值來決定,很幸運,夏農幫助我們做到了。
“資訊熵”(information entropy):可以度量樣本集合中的“純度”。 在資訊世界,熵越高,表示蘊含越多的資訊,熵越低,則資訊越少。 而根節點需要包含所以的樣本,則`根結點的熵最大`。
#### 資訊熵(Information Entropy)
設樣本集合為$D$,第$k$類樣本所佔比例為$p_k(k = 1,2,3,……n)$,則集合$D$的資訊熵為:
$$
Ent(D) = - \sum_{k=1}^{n}p_klog_2p_k\\
Ent(D)越大,則D的純度越小,也就是說集合D越混亂。
$$
現在,我們已經知道一個集合$D$中的資訊熵是多少,那麼我們如何來進行劃分呢?首先,我們需要明確一個劃分的標準(也就是目標),我們當然希望劃分之後,劃分之後的集合的熵越來越小,也就是劃分後的集合越來越純,這裡我們引入資訊增益這個概念。
#### 資訊增益(information gain)
下面是西瓜書中對資訊增益的定義:
> 假設離散屬性$a$有$V$個可能的取值$\{a^1,a^2,a^3……a^V\}$,若以屬性$a$對樣本進行劃分,則有V個分支,其中第$v$個分支包含了$D$中在屬性$a$上取值為$a^v$的樣本,記為$D^v$。我們可以計算出$D^v$的資訊熵,然後考慮到不同分支結點的樣本數不同,給分支結點賦予權重$\frac{|D^v|}{|D|}$,樣本數愈多,則影響力越大,則可以計算出屬性$a$對樣本集$D$進行劃分的“資訊增益”:
>
> $$
> Gain(D,a) = Ent(D) - \sum_{v=1}^V\frac{|D^v|}{|D|}Ent(D^v)
> $$
一般來說,資訊增益越大,則代表劃分後的集合越“純”,也就是說使用$a$屬性來劃分的效果最好,那麼我們就可以使用$a$屬性來進行劃分。*ID3演算法*就是使用資訊增益來作為標準劃分屬性的。
### 決策樹生成演算法流程
下面是來自《西瓜書》的決策樹生成演算法流程:
![](https://img2020.cnblogs.com/blog/1439869/202003/1439869-20200314000242202-1589752613.png)
決策樹生成是一個遞迴的過程,在下面3中情況中,遞迴會返回:
- 當前結點包含的樣本全屬於同一類別,無需劃分
- 當前屬性集為空,或是所有樣本在所有屬性上取值相同,無法劃分
- 當前結點包含的樣本集合為空,不能劃分
演算法可能不是那麼的形象好理解,下面將以實際的例子來展示。
在最上面上面的找女朋友的例子並不是特別的好,屬性太少。這裡以西瓜書中的