每天一算法——決策樹之ID3算法

機器學習 GitHub 科技 極客碼農 2017-05-02
  • 決策樹是什麼?

決策樹是依據現有的訓練數據,而建立的一種預測模型。通俗來說,決策樹就是讓我們對事件作出決策的一棵樹。

現實生活中可能出現這樣的場景——媒人要給女孩介紹對象。那可能出現如下對話:

女孩:這個男的多大了?

媒人:25。

女孩:長得好看嗎?

媒人:挺帥的。

女孩:每個月收入高不高?

媒人:還不錯,挺高的。

女孩:他是公務員嗎?

媒人:是啊,在國稅局上班。

女孩:好的,我可以去見見。

上面的對話內容,女孩根據自己的要求,提出問題,這是很典型的一個決策。通過對年紀、外表、收入水平和是否公務員對男人作出決策:見和不見。

假設現在這個女孩對男人有如下要求:

1、年齡在30歲以下

2、長相至少在中等以上

3、高收入或者中等以上的公務員

我們就可以用下圖來表示女孩的決策邏輯:

每天一算法——決策樹之ID3算法

這個圖基本上是一個決策樹,說是“基本上”,假如可以把一些條件量化,例如收入、長相,那就是真正的決策樹了。

決策樹的通常用在分類上,例如上面的見與不見,是對男人的兩種分類結果。


  • 決策樹具體實例

每天一算法——決策樹之ID3算法

上表天氣預報數據表,屬性outlook、temperature、humidity、windy分別為天氣、溫度、溼度、是否有風,play為是否出去遊玩。

我們想要根據這個訓練數據,構建我們的決策樹模型。然後根據模型,當我們給出overcast(陰天)、cool(冷)、normal(氣溫正常)、true(有風)的情況時,我們對其是否出去遊玩做出我們的預測。

  • 決策樹的構建

對比女孩的決策樹,這裡我們同樣需要為我們的天氣預測構建一個決策樹,我們的屬性有outlook、temperature、humidity、windy。我們屬性的選擇進行排序很重要,我們希望的是作為第一個屬性的決策,可以很大程度的區分開是否去遊玩。

這裡的很大程度我們用純度來表示,一個屬性如果越“純”,說明這個屬性越能區分開分類結果。屬性純度的計算有多種算法,今天我們要講的就是其中一種——ID3算法。


  • ID3算法

這裡我們需要有一點信息論的知識,具體看《信息的度量——信息熵》。在信息論中,信息增益越大,純度就越高。信息增益是針對每個特徵(指屬性,例如溫度)而言,系統有這個特徵和沒這個特徵時,兩者的差值所帶來的信息量,即信息增益

ID3算法的原理就是以信息增益來度量特徵,選擇信息增益最大的特徵進行分裂。算法有點類似貪婪算法,每次選擇都選擇信息增益最大。

在信息熵的文章中,我們講了信息熵的計算公式。這裡我們還需要用到條件熵,即在某種特徵情況下的信息熵。這裡我們結合信息熵,對兩個公式重新給下定義:

每天一算法——決策樹之ID3算法

數學公式大家有興趣自己推到,反覆推敲就好。我這裡再解釋下幾個概念的含義:

自信息量I(Xi)即為Xi事件發生所帶來的信息量大小。

信息熵H(X)即為X事件的平均信息量,同樣可解釋成對信息量的期望值。

條件熵H(X|Y)為在條件變量Y發生的情況下,X事件的信息熵。

信息增益上面解釋過,為具體某個特徵下信息熵的差值,我們成為信息增益。公式如下:

ID3算法,即遍歷所有的特徵屬性(天氣、溫度、溼度等),每次取出最大信息增益,然後生成一顆決策樹,此樹可對數據做出預測。


  • 實際代碼

我接觸這個算法也是研究了很久,需要很多基礎知識,很多東西我也是一知半解。不過我也盡力把他搞懂,並用大白話把他解釋清楚,不過具體公式的地方,還是跑不了的。

下面我們結合上面天氣的數據,預測是否出去遊玩,寫出我們的實際代碼(用Python實現)。

首先看下我們的測試數據——數據文件trainning_data.csv

每天一算法——決策樹之ID3算法

我們把函數定義都放在DecisionTree.py中,

每天一算法——決策樹之ID3算法

每天一算法——決策樹之ID3算法

構建決策樹函數:

每天一算法——決策樹之ID3算法

每天一算法——決策樹之ID3算法

我發現代碼多了很不好整理,就給大家貼了幾個關鍵性函數,大家如果非常感興趣。我可以提交到Github上,分享給大家。

後面看下對天氣數據進行構建決策樹後的結果:

每天一算法——決策樹之ID3算法

可以看到,算法只對outlook、humidity、windy這幾個屬性進行決策,說明在這次數據中,其他屬性對分類的結果沒有影響。


決策樹是我個人對機器學習算法的一個入門,我整理了很久,這樣講不知道效果好不好。希望大家能給我一個回饋,謝謝大家的支持。

相關推薦

推薦中...