ID3算法 决策树的生成(1)
介绍摘自李航《统计学习方法》
决策树(decision tree)是一种基本的分类与回归方法。本章主要讨论用于分类的决策树。决策树模型呈树形结构,在分类问题中,表示基于特征对实例进行分类的过程。它可以认为是if-then规则的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。其主要优点是模型具有可读性,分类速度快。学习时,利用训练数据,根据损失函数最小化的原则建立决策树模型。预测时,对新的数据,利用决策树模型进行分类。决策树学习通常包括3个步骤:特征选择、决策树的生成和决策树的修剪。这些决策树学习的思想主要来源于由Quinlan在1986年提出的ID3算法和1993年提出的C4.5算法,以及由Breiman等人在1984年提出的CART算法。
5.1 决策树模型与学习
5.1.1 决策树模型
定义5.1(决策树) 分类决策树模型是一种描述对实例进行分类的树形结构。决策树由结点(node)和有向边(directed edge)组成。结点有两种类型:内部结点(internal node)和叶结点(leaf node)。内部结点表示一个特征或属性,叶结点表示一个类。
用决策树分类,从根结点开始,对实例的某一特征进行测试,根据测试结果,将实例分配到其子结点;这时,每一个子结点对应着该特征的一个取值。如此递归地对实例进行测试并分配,直至达到叶结点。最后将实例分到叶结点的类中。
图5.1是一个决策树的示意图。图中圆和方框分别表示内部结点和叶结点。
5.1.2 决策树与if-then规则
可以将决策树看成一个if-then规则的集合。将决策树转换成if-then规则的过程是这样的:由决策树的根结点到叶结点的每一条路径构建一条规则;路径上内部结点的特征对应着规则的条件,而叶结点的类对应着规则的结论。决策树的路径或其对应的if-then规则集合具有一个重要的性质:互斥并且完备。这就是说,每一个实例都被一条路径或一条规则所覆盖,而且只被一条路径或一条规则所覆盖。这里所谓覆盖是指实例的特征与路径上的特征一致或实例满足规则的条件。
5.3 决策树的生成
本节将介绍决策树学习的生成算法。首先介绍ID3的生成算法,然后再介绍C4.5中的生成算法。这些都是决策树学习的经典算法。
5.3.1 ID3算法
ID3算法的核心是在决策树各个结点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根结点(root node)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点的特征,由该特征的不同取值建立子结点;再对子结点递归地调用以上方法,构建决策树;直到所有特征的信息增益均很小或没有特征可以选择为止。最后得到一个决策树。ID3相当于用极大似然法进行概率模型的选择。
算法5.2(ID3算法)
输入:训练数据集D,特征集A,阈值ε;
输出:决策树T。
(1)若D中所有实例属于同一类Ck,则T为单结点树,并将类Ck作为该结点的类标记,返回T;
(2)若A=Ø,则T为单结点树,并将D中实例数最大的类Ck作为该结点的类标记,返回T;
(3)否则,按算法5.1计算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([-a*1.0/t*np.log2(a*1.0/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*j*1.0/t/a*np.log2(j*1.0/a) for j in b] for a,b in zip(acount,ad)]) def getaH(dataset,index): #计算g(D,A)
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]
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])
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]])
alist,aset,acount=getList(dataset,t1[1])
for a in aset:
tree.append(a)
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, (8, 10))
ax = fig1.add_axes([0, 0, 1, 1], frameon=False, aspect=1.)
m=len(tree)/2
n=len(tree)-1
xy=[[0.5+j*0.05,0.85-j*0.1] for j in range(m+1)]
for j in range(m):
if j%2!=0:
fig1.text(xy[j][0]+0.03,xy[j][1], tree[j],ha="center",size=21)
else:
fig1.text(xy[j][0],xy[j][1], tree[j],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
ax.arrow(xy[j][0],xy[j][1]+0.06-0.025*j, 0.09,-0.15, head_width=0.01, head_length=0.02, fc='k', ec='k')
fig1.text(xy[m][0],xy[m][1], tree[m],ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
for j in range(m+1,n+1):
if j%2!=0:
fig1.text(xy[n-j][0]-0.15,xy[n-j][1], tree[j],ha="center",size=21)
else:
fig1.text(xy[n-j][0]-0.12,xy[n-j][1]-0.2, tree[j],
ha="center",size=21,bbox=dict(boxstyle="square", fc="w", ec="k"))
ax.arrow(xy[n-j][0],xy[n-j][1]+0.06-0.025*(n-j), -0.09,-0.15,
head_width=0.01, head_length=0.02, fc='k', ec='k')
ax.xaxis.set_visible(False)
ax.yaxis.set_visible(False)
plt.draw()
plt.show() dataset,labels=createDataSet()
tree= ID3(dataset,labels) #["有房子","否","有工作","否","拒绝","是","同意","是","同意"]
showT(tree)
ID3算法 决策树的生成(1)的更多相关文章
- ID3算法 决策树的生成(2)
# 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中Session用法详解
在ThinkPHP封装了Session类,用户可以直接使用,常用的方法有: Session::set(name, value):注册 session . Session::is_set(name):检 ...
- 解决win7资源监视器不能开启
刚开始时是这样,点击开始监控,无效 需要开始服务即可解决
- (转)js的左右滑动触屏事件
原文:http://blog.sina.com.cn/s/blog_6a0a183f0100zsfk.html (2012-01-20 08:55:53) 转载▼ 标签: 移动设备 触屏事件 杂谈 分 ...
- javascript树形菜单简单实例
参考博客地址:http://chengyoyo2006.blog.163.com/blog/static/8451734820087843950604/ <!DOCTYPE HTML PUBLI ...
- Spring MVC配置文件解释
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28
php大力力 [001节]2015-08-21.php在百度文库的几个基础教程新手上路日记 大力力php 大力同学 2015-08-21 15:28 话说,嗯嗯,就是我自己说,做事认真要用表格,学习技 ...
- android中string.xml引起的常见编译错误
1.遇到如下错误的时候说明你需要在单引号签名加转义字符(\): 1 Description Resource Path Location Type error: Apostrophe not prec ...
- 学学数据库,记记sql
(1)Truncate 和 Drop 和 Delete 1. TRUNCATE TABLE 在功能上与不带 Where 子句的 Delete 语句相同:二者均删除表中的全部行.但 TRUNCATE T ...
- 【题解】【区间】【二分查找】【Leetcode】Insert Interval & Merge Intervals
Given a set of non-overlapping intervals, insert a new interval into the intervals (merge if necessa ...
- dedecms SQL数据库连接信息注解(借鉴)
<?php $cfg_dbhost = 'localhost'; //数据库地址,这里的localhost指的是本机$cfg_dbname = 'hunuo'; //数据库名$cfg_dbuse ...