決策樹筆記

決策樹筆記

前言

 爲什麼會有本筆記?很簡單 用“人話”來解讀紛繁複雜的知識。我幫你看書、讀論文、做實驗,你只需要做一個安靜的美(男/女)子,默默地看我的文字,就能體會到知識的樂趣

什麼是決策樹

  我並不想直接回答這個問題,自己看圖,一目瞭然:

   一個白富美在相親的時候 是通過如下的決策樹,來決定一個邀約的男子是否值得去見

   
  好了,爲了理解更準確一點,這裏強調幾點:
  1)決策樹一定是“樹” 但不一定是二叉樹,也可能是“多叉樹”。例如“收入”這個節點
  2)你問我到底什麼是“樹”?好吧,暫且推薦一篇文章:http://blog.csdn.net/xiazdong/article/details/7296257


決策樹的前世今生

   要講決策樹(Decision Tree)  有一個大牛不可不提:Ross Quinlan(注意發音  Quinlan:昆蘭)

https://en.wikipedia.org/wiki/Ross_Quinlan

  ID3、C4.5以及C4.5的升級版C5.0的發明者。


   這三個名字稀奇古怪的算法都是什麼東東?

   ID3算法(全名 Iterative Dichotomiser3 (ID3) algorithm中文名迭代二叉樹3代)。這個算法的基本思想是依據奧卡姆剃刀原理(Occam's Razor, Ockham's Razor)構造最小的決策樹。提出時間:1986年

   C4.5算法是基於ID3算法的原則又進行了擴展和改進,採用GainRatio來加以改進方法,選取有最大GainRatio的分割變量作爲準則,避免ID3算法過度配適的問題。提出時間:1993年

   然後呢,這個C5.0是對C4.5的改進,主要爲了處理大數據的需要,在執行效率和內存使用方面進行了改進。提出時間:1998年。

   當然  C5.0和C4.5還有一個本質區別  C5.0是商用版本,不再是開源免費版本。 

   咱們這個牛教授昆蘭(Ross Quinlan)研究決策樹研究了十幾年,而在本文中,我們將通過非常有限的時間,將昆蘭的思想精髓一一吸收。  

    

   



理論基礎


----------------------------------------------------------------------------

克勞德•香農被公認爲是二十世紀最聰明的人之一,威廉•龐德斯通在其2005年出版的《財富公式》一書中是這樣描寫克勞德.香農:貝

爾實驗室和MIT有很多人將香農和愛因斯坦相提並論,而其他人則認爲這種對比是不公平的——對香農是不公平

----------------------------------------------------------------------------



信息論之父 香農 在 1948年發表的論文“通信的數學理論(A Mathematical Theory of Communication  推薦中文版鏈接:http://wenku.baidu.com/link?url=M76O27JPJgrTpbc92Fu1AumkSAXcnEQ7t9UPPZGRHypZgKI_1keIkaDL9E55OHyeLoUpK6KeRUsEWkNRsIrBkAnARNQAF37QuWkU6cHbLEO  中指出,任何信息都存在冗餘,冗餘大小與信息中每個符號(數字、字母或單詞)的出現概率或者說不確定性有關。

Shannon 借鑑了熱力學的概念,把信息中排除了冗餘後的平均信息量稱爲“信息熵”,並給出了計算信息熵的數學表達式。


熵(entropy)

from math import log
def createDataSet():
    dataSet = [[1, 1, 'yes'],
               [1, 1, 'yes'],
               [1, 0, 'no'],
               [0, 1, 'no'],
               [0, 1, 'no']]
    labels = ['no surfacing','flippers']
    return dataSet, labels
 
def calcShannonEnt(dataSet):
    numEntries = len(dataSet)
    labelCounts = {}
    for featVec in dataSet: #the the number of unique elements and their occurance
        currentLabel = featVec[-1]
        if currentLabel not in labelCounts.keys(): labelCounts[currentLabel] = 0
        labelCounts[currentLabel] += 1
    shannonEnt = 0.0
    for key in labelCounts:
        prob = float(labelCounts[key])/numEntries
        shannonEnt -= prob * log(prob,2) #log base 2
    return shannonEnt


信息增益(information gain)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章