决策树笔记

决策树笔记

前言

  为什么会有本笔记?很简单 用“人话”来解读纷繁复杂的知识。我帮你看书、读论文、做实验,你只需要做一个安静的美(男/女)子,默默地看我的文字,就能体会到知识的乐趣

什么是决策树

  我并不想直接回答这个问题,自己看图,一目了然:

   一个白富美在相亲的时候 是通过如下的决策树,来决定一个邀约的男子是否值得去见

   
  好了,为了理解更准确一点,这里强调几点:
  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)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值