决策树的生成,采用ID3算法(也包含了C4.5算法),使用python实现,更新了tree的保存和图示。

介绍摘自李航《统计学习方法》。

5.2.3 信息增益比

信息增益值的大小是相对于训练数据集而言的,并没有绝对意义。在分类问题困难时,也就是说在训练数据集的经验熵大的时候,信息增益值会偏大。反之,信息增益值会偏小。使用信息增益比(information gain ratio)可以对这一问题进行校正。这是特征选择的另一准则。

定义5.3(信息增益比) 特征A对训练数据集D的信息增益比gR(D,A)定义为其信息增益g(D,A)与训练数据集D的经验熵H(D)之比:

5.3.2 C4.5的生成算法

C4.5算法与ID3算法相似,C4.5算法对ID3算法进行了改进。C4.5在生成的过程中,用信息增益比来选择特征。

算法5.3(C4.5的生成算法)

输入:训练数据集D,特征集A,阈值ε;

输出:决策树T。

(1)如果D中所有实例属于同一类Ck,则置T为单结点树,并将Ck作为该结点的类,返回T;

(2)如果A=Ø,则置T为单结点树,并将D中实例数最大的类Ck作为该结点的类,返回T;

(3)否则,按式(5.10)计算A中各特征对D的信息增益比,选择信息增益比最大的特征Ag

(4)如果Ag的信息增益比小于阈值,则置T为单结点树,并将D中实例数最大的类Ck作为该结点的类,返回T;

(5)否则,对Ag的每一可能值ai,依Ag=ai将D分割为子集若干非空Di,将Di中实例数最大的类作为标记,构建子结点,由结点及其子结点构成树T,返回T;

(6)对结点i,以Di为训练集,以A-{Ag}为特征集,递归地调用步(1)~步(5),得到子树Ti,返回Ti

  1. # coding:utf-8
  2. import matplotlib.pyplot as plt
  3. import numpy as np
  4. import pylab
  5.  
  6. def createDataSet(): #贷款申请样本数据表
  7. dataset = [["青年", "否", "否", "一般", "拒绝"],
  8. ["青年", "否", "否", "好", "拒绝"],
  9. ["青年", "是", "否", "好", "同意"],
  10. ["青年", "是", "是", "一般", "同意"],
  11. ["青年", "否", "否", "一般", "拒绝"],
  12. ["中年", "否", "否", "一般", "拒绝"],
  13. ["中年", "否", "否", "好", "拒绝"],
  14. ["中年", "是", "是", "好", "同意"],
  15. ["中年", "否", "是", "非常好", "同意"],
  16. ["中年", "否", "是", "非常好", "同意"],
  17. ["老年", "否", "是", "非常好", "同意"],
  18. ["老年", "否", "是", "好", "同意"],
  19. ["老年", "是", "否", "好", "同意"],
  20. ["老年", "是", "否", "非常好", "同意"],
  21. ["老年", "否", "否", "一般", "拒绝"],
  22. ]
  23. labels = ["年龄", "有工作", "有房子", "信贷情况"]
  24. return dataset, labels
  25.  
  26. def getList(dataset,index=-1):#返回每层列表
  27. alist=[i[index] for i in dataset]
  28. aset=list(set(alist))
  29. acount=[alist.count(aset[j]) for j in range(len(aset))]
  30. return alist,aset,acount
  31.  
  32. def getdH(account): #计算H(D)
  33. t=np.sum(account)
  34. return np.sum([-float(a)/t*np.log2(float(a)/t) for a in account])
  35.  
  36. def getdaH(acount,ad): #计算H(D,A)
  37. t=np.sum(acount)
  38. return np.sum([[0 if j==0 else -a*float(j)/t/a*np.log2(float(j)/a) for j in b] for a,b in zip(acount,ad)])
  39.  
  40. def gethaD(acount): #计算Ha(D)
  41. t=np.sum(acount)
  42. return np.sum([ -float(a)/t*np.log2(float(a)/t) for a in acount])
  43.  
  44. def getaH(dataset,index,c4_5=0): #计算g(D,A),若c4_5=1则采用信息增益比
  45. dlist,dset,dcount= getList(dataset,-1)
  46. hd=getdH(dcount)
  47. alist,aset,acount=getList(dataset,index)
  48. ad=[[[dlist[i] for i in range(len(dlist)) if dataset[i][index]==j].count(k) for k in dset] for j in aset]
  49. if c4_5:
  50. return 0 if gethaD(acount)==0 else (hd-getdaH(acount,ad))/gethaD(acount)
  51. else:
  52. return hd-getdaH(acount,ad)
  53.  
  54. def ID3(dataset,labels,tree=[]):#ID3算法
  55. dlist,dset,dcount= getList(dataset,-1)
  56. if len(dset)<2 :
  57. tree.append([dset[0],0])
  58. return
  59. adlist=[[getaH(dataset,i),i] for i in range(len(dataset[0])-1)]
  60. t1= max(adlist,key=lambda x: x[0])
  61. tree.append([labels[t1[1]],2])
  62. alist,aset,acount=getList(dataset,t1[1])
  63. for a in aset:
  64. tree.append([a,1])
  65. ID3([i for i in dataset if i[t1[1]]==a],labels,tree)
  66. return tree
  67.  
  68. def showT(tree):#根据Tree列表绘制图像
  69. import sys
  70. reload(sys)
  71. sys.setdefaultencoding('utf-8')
  72. pylab .mpl.rcParams['font.sans-serif'] = ['SimHei']
  73. fig1 = plt.figure(1, (6, 6))
  74. ax = fig1.add_axes([0, 0, 1, 1], frameon=False, aspect=1.)
  75. x,y=0.5,0.85
  76. for i in range(len(tree)):
  77. if tree[i][1]==2:
  78. fig1.text(x,y, tree[i][0],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
  79. ax.arrow(x,y-0.02, 0.09,-0.11, head_width=0.01, head_length=0.02, fc='k', ec='k')
  80. ax.arrow(x,y-0.02, -0.09,-0.11, head_width=0.01, head_length=0.02, fc='k', ec='k')
  81. x+=0.05
  82. y-=0.1
  83. if i>1:tree[i-2][1]-=1
  84. elif tree[i][1]==1:
  85. fig1.text(x+0.05,y, tree[i][0],ha="center",size=21)
  86. x+=0.05
  87. y-=0.1
  88. else:
  89. fig1.text(x,y, tree[i][0],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
  90. x-=0.25
  91. y+=0.1
  92. j=i-2
  93. while tree[j][1]==0:
  94. j=j-2
  95. x+=0.1
  96. y+=0.2
  97. tree[j][1]-=1
  98. ax.xaxis.set_visible(False)
  99. ax.yaxis.set_visible(False)
  100. plt.draw()
  101. plt.show()
  102.  
  103. dataset,labels=createDataSet()
  104. tree= ID3(dataset,labels) #[["有房子",2],["否",1],["有工作",2],["否",1],["拒绝",0],["是",1],["同意",0],["是",1],["同意",0]]
  105. showT(tree)

ID3算法 决策树的生成(2)的更多相关文章

  1. ID3算法 决策树的生成(1)

    # coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...

  2. ID3算法 决策树 C++实现

    人工智能课的实验. 数据结构:多叉树 这个实验我写了好久,开始的时候从数据的读入和表示入手,写到递归建树的部分时遇到了瓶颈,更新样例集和属性集的办法过于繁琐: 于是参考网上的代码后重新写,建立决策树类 ...

  3. Python 实现基于信息熵的 ID3 算法决策树模型

    版本说明 Python version: 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:21:07) [MSC v.1900 32 bit (Int ...

  4. 决策树---ID3算法(介绍及Python实现)

    决策树---ID3算法   决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no ...

  5. 02-21 决策树ID3算法

    目录 决策树ID3算法 一.决策树ID3算法学习目标 二.决策树引入 三.决策树ID3算法详解 3.1 if-else和决策树 3.2 信息增益 四.决策树ID3算法流程 4.1 输入 4.2 输出 ...

  6. 决策树笔记:使用ID3算法

    决策树笔记:使用ID3算法 决策树笔记:使用ID3算法 机器学习 先说一个偶然的想法:同样的一堆节点构成的二叉树,平衡树和非平衡树的区别,可以认为是"是否按照重要度逐渐降低"的顺序 ...

  7. 数据挖掘之决策树ID3算法(C#实现)

    决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...

  8. 决策树 -- ID3算法小结

          ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...

  9. 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)

    1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...

随机推荐

  1. <转>thinkphp的各种内部函数 D()、F()、S()、C()、L()、A()、I()详解

    D.F.S.C.L.A.I 他们都在functions.php这个文件家下面我分别说明一下他们的功能 D() 加载Model类M() 加载Model类 A() 加载Action类L() 获取语言定义C ...

  2. FMDB数据库中的一些操作

    #pragma mark - 数据库的操作 - (BOOL)judgeModel:(TaskResourceModel *)model isInArray:(NSArray *)shopArray { ...

  3. PAT 05-树8 Huffman Codes

    以现在的生产力,是做不到一天一篇博客了.这题给我难得不行了,花了两天时间在PAT上还有测试点1没过,先写上吧.记录几个做题中的难点:1.本来比较WPL那块我是想用一个函数实现的,无奈我对传字符串数组无 ...

  4. Java 嵌套作用域

    在C/C++中,当一个块处于另一个块作用域内的时候,内层定义的变量会把外层的变量隐藏, 遵循所谓的就近原则. 在Java中,在内层定义与外层同名的变量是禁止的! 如下: int i = 0; for( ...

  5. [IE兼容性] Table 之边框 (IE6 IE7 IE8(Q) 中 cellspacing 属性在重合的边框模型的表格中仍然有效)

    在 IE6 IE7 IE8(Q) 中,在通过 border-collapse:collapse 使用表格的重合边框模型后,其 cellspacing 属性仍然有效: 在 其他浏览器 中,此时的 cel ...

  6. The 1st day with Python

    刚开始实践python,遇到比较多的问题就是函数名.变量名输入错误,比较给力的按无论shell还是terminal给出的错误提示,按图索骥都能在网上找到相关解决办法,简单的自己也能顿悟. 典型的一个是 ...

  7. 玩转无线电 -- 温哥华天车 RFID 票务系统

    0x00 前言 如今物联网 RFID系统已经完全融入了我们的生活当中. 从楼宇门禁到 Apple Pay. 可以说其身影是无处不在.很多网友也分享了自己对RFID系统的安全测试心得.不过大多还是基于门 ...

  8. linux centos安装编译phantomjs 2.0的方法

    phantomjs 2.0最新版的官方不提供编译好的文件下载,只能自己编译,有教程但是过于简单,特别是服务器上要安装N多的支持.折腾到现在终于装好了并且能正常运行了,截图mark一下: linux c ...

  9. 爆破unabexcm5fl(已补上注册机)

    系统 : Windows xp 程序 : unabexcm5fl 程序下载地址 :http://pan.baidu.com/s/1pJYaNUV 要求 : 爆破 使用工具 :OD 可在“PEDIY C ...

  10. 14、C#基础整理(函数)

    函数 1.概念:是一个带有输入参数.输出参数.返回值的代码块. 2.写法: 修饰符  返回值类型  函数名(输入参数,输入参数) { 方法段 return 返回值; } 3.注释: (1)输入参数格式 ...