本文作者Key,博客園主頁:https://home.cnblogs.com/u/key1994/
本內容為個人原創作品,轉載請注明出處或聯系:zhengzha16@163.com
今天學習了決策樹的分類原理,總體來說理解決策樹要比理解SVM簡單的多,原因有二:
(1) 決策樹的分類思想與人類的思考模式更為相似——即分而治之。
(2) 決策樹在實現時規則非常固定,模式非常單一,降低了其理解難度。
但是,決策樹在選擇最優划分屬性時引入了熵(Entropy)和信息增益(Information Gain)的概念,理解起來比較抽象,因此本文將采用簡單的例子來加深理解。
上圖是本文使用的簡易模型,將該模型數據整理到表格中:
x |
y |
class |
x |
y |
class |
1 |
1 |
cir |
3 |
4 |
tan |
1 |
2 |
cir |
3 |
5 |
tan |
1 |
3 |
cir |
3 |
6 |
tan |
1 |
4 |
tan |
4 |
1 |
cir |
1 |
5 |
tan |
4 |
2 |
tri |
1 |
6 |
tan |
4 |
3 |
tri |
2 |
1 |
cir |
4 |
4 |
tri |
2 |
2 |
cir |
4 |
5 |
tri |
2 |
3 |
cir |
4 |
6 |
tri |
2 |
4 |
tan |
5 |
1 |
cir |
2 |
5 |
tan |
5 |
2 |
tri |
2 |
6 |
tan |
5 |
3 |
tri |
3 |
1 |
cir |
5 |
4 |
tri |
3 |
2 |
cir |
5 |
5 |
tri |
3 |
3 |
cir |
5 |
6 |
tri |
很明顯,在建立決策樹模型時,有兩種思路:
(1) 先按照x坐標分類,然后按照y坐標分類;
(2) 先按照y坐標分類,然后按照x坐標分類。
至於選擇哪一種方案更好,可以根據決策樹的相關理論,分別求出信息增益。
但是,這里我有一個疑問,假如我們選擇方案(1),即先按照x坐標來分類。很明顯,所有樣本的類別有三類,但是x的取值有5個(分別為1,2,3,4,5)。按照決策樹理論,應該選擇如下方式:
根據樣本數據的分布規律可以看出,如果采用如下方式效率更高:
但是,這種分類方法不具有一般性,畢竟不是所有問題都能夠通過肉眼觀察出規律,我們要做的是讓機器自己來決策。Anyway,在這里我們暫且將該問題擱置不管,因為本文討論的內容是熵與信息增益的實質。
接下來,才是本文的核心內容。
比較上面提出的兩種方案,我們很難認為分辨出其好壞。下面我們分別求出信息增益。
方案(1):
首先按照x坐標來分類。
分別計算各個節點的熵:(計算過程省略)
Entropy(parent)=1.58
Entropy(children1)=1
Entropy(children2)=0.65
IG=0.72
方案(2):
首先按照y坐標來分類。
分別計算各個節點的熵:(計算過程省略)
Entropy(parent)=1.58
Entropy(children1)=0.8367
Entropy(children2)=0.971
IG=0.8067
從信息增益的值來看,應該選擇第二種方案來進行分類。但是如果選擇第二種方案,最終的得到的分類器的分類精度將會低於第一種方案(該論述非常容易證明,讀者可以自行計算)。也就是說,從分類器的精度來評判,第二種方案效果更差。那么為什么會出現這種現象呢?
這里我們要從原理上來分析。
什么是熵,從定義上來看,熵的值表征着樣本集合中的純度(purity)大小。如果所有樣本只有一個類別,那么此時的純度非常高,通過計算得到的熵值為0;而如果樣本有多個類別,純度會變低,熵值也會隨之增大。最特殊的情況,就是在所有樣本中,每種類別的數量均相等,此時熵值為1,純度最低。
而信息增益的計算公式為父節點的熵值減各子節點的熵值的加權和,即按照當前屬性來划分時由父節點到子節點的純度變化值。信息增益的值一定不小於零,因為經過划分之后各子節點的純度一定是越來越高的,即各子節點的熵值一定是在變小的,即使加權求和之后還是會小於父節點的熵值。此外,信息增益值越大,說明純度提高越明顯。我們當然希望純度提高速度快一點,那樣我們就能以最快的速度來完成分類器的訓練。
這里要注意,根據信息增益的大小來確定划分屬性時,我們主要考慮的是分類親訓練的速度,而非精度,這也解釋了為什么在以上的示例中,方案二的精度會低於方案一。
看上去這是一個bug,那為什么信息增益理論如此受追捧呢?我們大膽的猜想一下,在實際問題中,一個模型的屬性有可能有多個,假如說有10個,而每個屬性可取值3個,這樣的話我們的模型會非常復雜,計算量也會大增。而實際的問題的復雜程度有可能比我的假設有過之無不及。所以,我們必須要考慮計算速度的問題,即使需要以損失部分精度為代價。而這在機器學習問題中是非常常見的——即尋求計算量與精度的平衡!
此外,如果我們每個樣本點都不想錯誤分類,那么如何來避免overfitting呢?
既然講到決策樹,那就順便說一下我對決策樹算法的一些理解。如有不准確的地方,希望各位讀者批評指正。
首先,雖然決策樹可以用於回歸,但是其主要應用還是進行分類;
其次,使用決策樹算法時,若想取得好的分類效果,一定是以大數據為前提的。只有數據量足夠大,決策樹才能夠便利各種可能出現的情況。而大量的數據又會給訓練帶來挑戰;
最后,決策樹的參數選取也是一個復雜的過程。前面已經證明了基於信息增益來選擇最優划分屬性的方法可能無法取的較好的訓練效果。若想提高決策樹的分類精度,還有很多參數需要提前確定,比如criterion(entropy/gini)、spllitter(random/best)、max_depth(決策樹的深度)、min_samples_split(最小分類樣本數)等等,這些參數的選取過程比較復雜。