概述
ID3 算法是構建決策樹算法中一種非常重要的算法,可以說它是學習決策樹算法的基礎吧。比如,下一篇博客要說的 C4.5 決策樹,就是基於 ID3 上的一個改進算法。還有 CART、隨機森林算法,都是後面要講解的。
版權說明
著作權歸作者所有。
商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
本文作者:Q-WHai
發表日期: 2016年7月6日
本文鏈接:http://blog.csdn.net/lemon_tree12138/article/details/51837983
來源:CSDN
更多內容:分類 >> 數據挖掘
引言
如果你是剛剛纔接觸到有關決策樹的相關內容,那麼你可能就會有一些疑問,什麼是決策樹?對於什麼是決策樹這個話題,如果站在編程的角度來類比,我想 if … else 是最貼切的了吧。就比如下面的這樣的一棵最簡單的決策樹。
這是一棵是否出門打球的決策樹,而決策的特徵屬性就是 Weather,如果天氣狀態爲 Sunny、Overcast 則選擇出門打球;如果下雨了那就只能待在家裏了。
如果上面的這棵決策樹是按照我的選擇來構建的,那麼你的選擇又會構建成一棵什麼樣的決策樹呢?也就是說某一棵決策樹只能代表某一種情況,可是我們是想拿構建好的決策樹進行預測的,所以這時,就不能再只按照某一個人的意願來構建決策樹了。我們需要收集大量的訓練數據,並使用這些訓練數據進行構建決策樹。
基礎知識
數據挖掘的基礎是數學,如果數學不太好,就一定要好好補補了(我也是數學不太好的那些人當中的一個)。ID3 算法當然也不例外地涉及了一些數學知識。主要的是兩塊內容:信息熵與信息增益。
信息熵
信息熵簡介
中學時期,我們都有學習過熵的概念,主要是在物理跟化學中。在物理學科中,熵是用來描述分子的混亂程度的,在化學學科中也是類似的,如果我沒有記錯的話,當時熵在化學中的應用主要是某一化合物的加熱這一塊,比如給水加熱,會變化水蒸汽,這時熵就是增大的;還就是化合反應這一塊。
那麼在本文的 ID3 算法中,或者說在數據挖掘中的信息熵要怎麼理解或是怎麼應用呢?這裏不妨打個最簡單的比方,我們說假設有兩篇文章,分別爲:Article_1 和 Article_2,它們的內容如下:
Article_1
信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵
信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵
信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵
信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵信息熵
Article_2
信息論之父 C. E. Shannon 在 1948 年發表的論文“通信的數學理論( A Mathematical Theory of Communication )”中, Shannon 指出,任何信息都存在冗餘,冗餘大小與信息中每個符號(數字、字母或單詞)的出現概率或者說不確定性有關。
Shannon 借鑑了熱力學的概念,把信息中排除了冗餘後的平均信息量稱爲“信息熵”,並給出了計算信息熵的數學表達式。
對於上面的這兩篇文章,我們要怎麼衡量其信息量呢?文章的字數麼?顯然不是的,第一篇文章的字數要比第二篇文章的字數要多,然而其包含的信息量卻要小一些。於是,信息熵的概念就此被引出,結合上面對熵的描述,你也可以理解成信息熵就是信息的混亂程度。
信息熵公式
假如一個隨機變量 X 的取值爲 X = {
信息增益
信息增益簡介
信息增益的功能是描述一個特徵屬性對於總體的重要性,怎麼理解這句話呢?打個比方吧,比如我想出去打球,這裏可能會受到天氣、溫度、心情等等的因素地影響。那麼對於天氣這個特徵屬性而言,有天氣這個屬性跟沒有天氣這個屬性,總體的信息量(也就是信息熵)的變化就是信息增益了。
可能這裏還不太清楚信息增益在決策樹的構建中產生了什麼作用,這個問題我們留到 ID3 算法部分再詳細說明。
信息增益公式
其中 S 爲全部樣本集合,value(T) 是屬性 T 所有取值的集合,v 是 T 的其中一個屬性值,
ID3
決策樹構建分析
ID3 是數據挖掘中的一種非常重要的決策樹構建算法,它是一種監督學習式的機器學習。由於這是一種監督學習,所以必然需要有一定數量的訓練數據集,而每一條訓練數據所形成的決策樹都不一定是完全一樣的。打個比方,假設有如下三條訓練數據:
Day | OutLook | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|---|
1 | Sunny | Hot | High | Weak | No |
2 | Sunny | Hot | High | Strong | No |
3 | Rainy | Mild | High | Weak | Yes |
那麼對於 OutLook 這一特徵屬性而言,就有兩種不同的狀態值:Sunny 和 Rainy。就算是對於同一個 OutLook 狀態值時,其結果分類也是一樣的,這樣我們構建的決策的標準是什麼呢?
訓練數據集
假設我們如下訓練數據集
Day | OutLook | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|---|
1 | Sunny | Hot | High | Weak | No |
2 | Sunny | Hot | High | Strong | No |
3 | Overcast | Hot | High | Weak | Yes |
4 | Rainy | Mild | High | Weak | Yes |
5 | Rainy | Cool | Normal | Weak | Yes |
6 | Rainy | Cool | Normal | Strong | No |
7 | Overcast | Cool | Normal | Strong | Yes |
8 | Sunny | Mild | High | Weak | No |
9 | Sunny | Cool | Normal | Weak | Yes |
10 | Rainy | Mild | Normal | Weak | Yes |
11 | Sunny | Mild | Normal | Strong | Yes |
12 | Overcast | Mild | High | Strong | Yes |
13 | Overcast | Hot | Normal | Weak | Yes |
14 | Rainy | Mild | High | Strong | No |
決策樹構建過程
下面是我根據 ID3 構建決策樹的算法步驟,繪製的決策樹構建過程圖。因爲 ID3 其實是一個迭代的算法,這裏我只繪製了一次迭代的過程,所以是一個局部示圖。
當上面的局部過程中的最後一步計算出了最大信息增益之後,我們要將這個最大信息增益對應的特徵屬性進行移除,並將數據集切分成 N 個部分(其中 N 爲分支狀態數)。
現在假設我們計算出當選擇特徵屬性爲 OutLook 的時候,其信息增益最大,那麼原始數據就會被切分成如下 3 份:
part_sunny
Day | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|
1 | Hot | High | Weak | No |
2 | Hot | High | Strong | No |
3 | Mild | High | Weak | No |
4 | Cool | Normal | Weak | Yes |
5 | Mild | Normal | Strong | Yes |
part_overcast
Day | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|
1 | Hot | High | Weak | Yes |
2 | Cool | Normal | Strong | Yes |
3 | Mild | High | Strong | Yes |
4 | Hot | Normal | Weak | Yes |
part_rainy
Day | Temperature | Humidity | Wind | PlayTennis |
---|---|---|---|---|
1 | Mild | High | Weak | Yes |
2 | Cool | Normal | Weak | Yes |
3 | Cool | Normal | Strong | No |
4 | Mild | Normal | Weak | Yes |
5 | Mild | High | Strong | No |
這樣再把這 3 份數據分別當成上圖中的 data 代入計算。通過這樣循環地迭代,直到數據被全部計算完成。
計算步驟
如果上面信息熵跟信息增益的計算公式,讓你看得有一些不是很懂,沒關係。這裏我會通過幾個示例來分析一下計算過程,這樣你就會更懂一些了。
1. Entropy(S)
2. Entropy(
3. Entropy(S|T)
4. IG(T)
Entropy(S)
對於最初始的 14 條記錄,我們統計了結果分類,其中,Yes = 9,No = 5.
這時當前信息的信息熵計算過程如下:
Entropy(Ti )
假設這時我們需要計算最初始的 14 條記錄中,特徵屬性爲 OutLook 的分支狀態信息熵。首先需要做的是,統計 OutLook 特徵屬性下的結果分類分佈。
Sunny | Overcast | Rainy | |
---|---|---|---|
Yes | 2 | 4 | 3 |
No | 3 | 0 | 2 |
各個特徵屬性下的分支狀態信息熵計算過程如下:
Entropy(S|T)
統計完各個分支狀態的信息熵之後,就需求合併,也就是某一特徵屬性的信息熵了。
IG(T)
我們還是拿上面的數據進行計算。也就是計算 IG(OutLook).
決策樹構建結果
通過上面的訓練數據集及 ID3 構建算法,我們構建了一棵如下的 ID3 決策樹。
Ref
- http://blog.csdn.net/acdreamers/article/details/44661149
- http://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html
GitHub download
此處爲本文的算法實現,採用的編程語言爲 Java。算法也是在不斷重構及優化,如果你對此感興趣,歡迎 star.
- https://github.com/MachineLeanring/MachineLearningID3