ID3算法 决策树的生成(2)
决策树的生成,采用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。
- # coding:utf-8
- import matplotlib.pyplot as plt
- import numpy as np
- import pylab
- def createDataSet(): #贷款申请样本数据表
- dataset = [["青年", "否", "否", "一般", "拒绝"],
- ["青年", "否", "否", "好", "拒绝"],
- ["青年", "是", "否", "好", "同意"],
- ["青年", "是", "是", "一般", "同意"],
- ["青年", "否", "否", "一般", "拒绝"],
- ["中年", "否", "否", "一般", "拒绝"],
- ["中年", "否", "否", "好", "拒绝"],
- ["中年", "是", "是", "好", "同意"],
- ["中年", "否", "是", "非常好", "同意"],
- ["中年", "否", "是", "非常好", "同意"],
- ["老年", "否", "是", "非常好", "同意"],
- ["老年", "否", "是", "好", "同意"],
- ["老年", "是", "否", "好", "同意"],
- ["老年", "是", "否", "非常好", "同意"],
- ["老年", "否", "否", "一般", "拒绝"],
- ]
- labels = ["年龄", "有工作", "有房子", "信贷情况"]
- return dataset, labels
- def getList(dataset,index=-1):#返回每层列表
- alist=[i[index] for i in dataset]
- aset=list(set(alist))
- acount=[alist.count(aset[j]) for j in range(len(aset))]
- return alist,aset,acount
- def getdH(account): #计算H(D)
- t=np.sum(account)
- return np.sum([-float(a)/t*np.log2(float(a)/t) for a in account])
- def getdaH(acount,ad): #计算H(D,A)
- t=np.sum(acount)
- 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)])
- def gethaD(acount): #计算Ha(D)
- t=np.sum(acount)
- return np.sum([ -float(a)/t*np.log2(float(a)/t) for a in acount])
- def getaH(dataset,index,c4_5=0): #计算g(D,A),若c4_5=1则采用信息增益比
- dlist,dset,dcount= getList(dataset,-1)
- hd=getdH(dcount)
- alist,aset,acount=getList(dataset,index)
- ad=[[[dlist[i] for i in range(len(dlist)) if dataset[i][index]==j].count(k) for k in dset] for j in aset]
- if c4_5:
- return 0 if gethaD(acount)==0 else (hd-getdaH(acount,ad))/gethaD(acount)
- else:
- return hd-getdaH(acount,ad)
- def ID3(dataset,labels,tree=[]):#ID3算法
- dlist,dset,dcount= getList(dataset,-1)
- if len(dset)<2 :
- tree.append([dset[0],0])
- return
- adlist=[[getaH(dataset,i),i] for i in range(len(dataset[0])-1)]
- t1= max(adlist,key=lambda x: x[0])
- tree.append([labels[t1[1]],2])
- alist,aset,acount=getList(dataset,t1[1])
- for a in aset:
- tree.append([a,1])
- ID3([i for i in dataset if i[t1[1]]==a],labels,tree)
- return tree
- def showT(tree):#根据Tree列表绘制图像
- import sys
- reload(sys)
- sys.setdefaultencoding('utf-8')
- pylab .mpl.rcParams['font.sans-serif'] = ['SimHei']
- fig1 = plt.figure(1, (6, 6))
- ax = fig1.add_axes([0, 0, 1, 1], frameon=False, aspect=1.)
- x,y=0.5,0.85
- for i in range(len(tree)):
- if tree[i][1]==2:
- fig1.text(x,y, tree[i][0],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
- ax.arrow(x,y-0.02, 0.09,-0.11, head_width=0.01, head_length=0.02, fc='k', ec='k')
- ax.arrow(x,y-0.02, -0.09,-0.11, head_width=0.01, head_length=0.02, fc='k', ec='k')
- x+=0.05
- y-=0.1
- if i>1:tree[i-2][1]-=1
- elif tree[i][1]==1:
- fig1.text(x+0.05,y, tree[i][0],ha="center",size=21)
- x+=0.05
- y-=0.1
- else:
- fig1.text(x,y, tree[i][0],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
- x-=0.25
- y+=0.1
- j=i-2
- while tree[j][1]==0:
- j=j-2
- x+=0.1
- y+=0.2
- tree[j][1]-=1
- ax.xaxis.set_visible(False)
- ax.yaxis.set_visible(False)
- plt.draw()
- plt.show()
- dataset,labels=createDataSet()
- tree= ID3(dataset,labels) #[["有房子",2],["否",1],["有工作",2],["否",1],["拒绝",0],["是",1],["同意",0],["是",1],["同意",0]]
- showT(tree)
ID3算法 决策树的生成(2)的更多相关文章
- ID3算法 决策树的生成(1)
# coding:utf-8 import matplotlib.pyplot as plt import numpy as np import pylab def createDataSet(): ...
- ID3算法 决策树 C++实现
人工智能课的实验. 数据结构:多叉树 这个实验我写了好久,开始的时候从数据的读入和表示入手,写到递归建树的部分时遇到了瓶颈,更新样例集和属性集的办法过于繁琐: 于是参考网上的代码后重新写,建立决策树类 ...
- Python 实现基于信息熵的 ID3 算法决策树模型
版本说明 Python version: 3.6.6 |Anaconda, Inc.| (default, Jun 28 2018, 11:21:07) [MSC v.1900 32 bit (Int ...
- 决策树---ID3算法(介绍及Python实现)
决策树---ID3算法 决策树: 以天气数据库的训练数据为例. Outlook Temperature Humidity Windy PlayGolf? sunny 85 85 FALSE no ...
- 02-21 决策树ID3算法
目录 决策树ID3算法 一.决策树ID3算法学习目标 二.决策树引入 三.决策树ID3算法详解 3.1 if-else和决策树 3.2 信息增益 四.决策树ID3算法流程 4.1 输入 4.2 输出 ...
- 决策树笔记:使用ID3算法
决策树笔记:使用ID3算法 决策树笔记:使用ID3算法 机器学习 先说一个偶然的想法:同样的一堆节点构成的二叉树,平衡树和非平衡树的区别,可以认为是"是否按照重要度逐渐降低"的顺序 ...
- 数据挖掘之决策树ID3算法(C#实现)
决策树是一种非常经典的分类器,它的作用原理有点类似于我们玩的猜谜游戏.比如猜一个动物: 问:这个动物是陆生动物吗? 答:是的. 问:这个动物有鳃吗? 答:没有. 这样的两个问题顺序就有些颠倒,因为一般 ...
- 决策树 -- ID3算法小结
ID3算法(Iterative Dichotomiser 3 迭代二叉树3代),是一个由Ross Quinlan发明的用于决策树的算法:简单理论是越是小型的决策树越优于大的决策树. 算法归 ...
- 决策树-预测隐形眼镜类型 (ID3算法,C4.5算法,CART算法,GINI指数,剪枝,随机森林)
1. 1.问题的引入 2.一个实例 3.基本概念 4.ID3 5.C4.5 6.CART 7.随机森林 2. 我们应该设计什么的算法,使得计算机对贷款申请人员的申请信息自动进行分类,以决定能否贷款? ...
随机推荐
- <转>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 ...
- FMDB数据库中的一些操作
#pragma mark - 数据库的操作 - (BOOL)judgeModel:(TaskResourceModel *)model isInArray:(NSArray *)shopArray { ...
- PAT 05-树8 Huffman Codes
以现在的生产力,是做不到一天一篇博客了.这题给我难得不行了,花了两天时间在PAT上还有测试点1没过,先写上吧.记录几个做题中的难点:1.本来比较WPL那块我是想用一个函数实现的,无奈我对传字符串数组无 ...
- Java 嵌套作用域
在C/C++中,当一个块处于另一个块作用域内的时候,内层定义的变量会把外层的变量隐藏, 遵循所谓的就近原则. 在Java中,在内层定义与外层同名的变量是禁止的! 如下: int i = 0; for( ...
- [IE兼容性] Table 之边框 (IE6 IE7 IE8(Q) 中 cellspacing 属性在重合的边框模型的表格中仍然有效)
在 IE6 IE7 IE8(Q) 中,在通过 border-collapse:collapse 使用表格的重合边框模型后,其 cellspacing 属性仍然有效: 在 其他浏览器 中,此时的 cel ...
- The 1st day with Python
刚开始实践python,遇到比较多的问题就是函数名.变量名输入错误,比较给力的按无论shell还是terminal给出的错误提示,按图索骥都能在网上找到相关解决办法,简单的自己也能顿悟. 典型的一个是 ...
- 玩转无线电 -- 温哥华天车 RFID 票务系统
0x00 前言 如今物联网 RFID系统已经完全融入了我们的生活当中. 从楼宇门禁到 Apple Pay. 可以说其身影是无处不在.很多网友也分享了自己对RFID系统的安全测试心得.不过大多还是基于门 ...
- linux centos安装编译phantomjs 2.0的方法
phantomjs 2.0最新版的官方不提供编译好的文件下载,只能自己编译,有教程但是过于简单,特别是服务器上要安装N多的支持.折腾到现在终于装好了并且能正常运行了,截图mark一下: linux c ...
- 爆破unabexcm5fl(已补上注册机)
系统 : Windows xp 程序 : unabexcm5fl 程序下载地址 :http://pan.baidu.com/s/1pJYaNUV 要求 : 爆破 使用工具 :OD 可在“PEDIY C ...
- 14、C#基础整理(函数)
函数 1.概念:是一个带有输入参数.输出参数.返回值的代码块. 2.写法: 修饰符 返回值类型 函数名(输入参数,输入参数) { 方法段 return 返回值; } 3.注释: (1)输入参数格式 ...