【Python】ID3算法的实现
ID3算法的实现
- ID3实现
- 首先定义一个ID3DTree类来封装算法
- 数据导入函数
- 执行决策树函数
- 决策树主方法
- 构建决策树:创建决策树主程序
- 计算出现次数最多的类别标签
- 计算最优特征
- 计算信息熵
- 划分数据集
- 训练决策树
- 持久化决策树
- 决策树分类
- 算法评估
ID3实现
首先定义一个ID3DTree类来封装算法
# coding:utf-8
#Python3.7.2
from numpy import *
import math
import copy
import _pickle as pickleclass ID3DTree(object):def __init__(self):self.tree = {}self.dataSet = []self.labels = []
数据导入函数
def loadDataSet(self, path, labels):recordlist = []fp = open(path, 'rb')content = fp.read()fp.close()rowlist = content.splitlines()recordlist = [row.split('\t') for row in rowlist if row.strip()]self.dataSet = recordlistself.labels = labels
执行决策树函数
def train(self):labels = copy.deepcopy(self.labels)self.tree = self.buildTree(self.dataSet, labels)
决策树主方法
构建决策树:创建决策树主程序
def buildTree(self, dataSet, lebels):cateList = [data[-1] for data in dataSet]if cateList.count(cateList[0]) == len(cateList):return cateList[0]if len(dataSet[0]) == 1:return self.maxCate(cateList)bestFeat = self.getBestFeat(dataSet)bestFeatLabel = labels[bestFeat]tree = {bestFeatLabel: {}}del(labels[bestFeat])uniqueVals = set([data[bestFeat] for data in dataSet])for value in uniqueVals:subLabels = labels[:]splitDataset = self.splitDataset(dataSet, bestFeat, value)subTree = self.buildTree(splitDataset, subLabels)tree[bestFeatLabel][value] = subTreereturn tree
计算出现次数最多的类别标签
def maxCate(self, cateList):items = dict([(cateList.count(i), i) for i in cateList])return items[max(items.keys())]
计算最优特征
def getBestFeat(self, dataSet):numFeatures = len(dataSet[0])-1baseEntropy = self.computeEntropy(dataSet)bestInfoGain = 0.0bestFeature = -1for i in range(numFeatures):uniqueVals = set([data[i] for data in dataSet])newEntropy = 0.0for value in uniqueVals:subDataSet = self.splitDataset(dataSet, i, value)prob = len(subDataSet)/float(len(dataSet))newEntropy += prob*self.computeEntropy(subDataSet)infoGain = baseEntropy-newEntropyif(infoGain > bestInfoGain):bestInfoGain = infoGainbestFeature = ireturn bestFeature
计算信息熵
def computeEntropy(self, dataSet):datalen = float(len(dataSet))cateList = [data[-1] for data in dataSet]items = dict([(i, cateList.count(i)) for i in cateList])infoEntropy = 0.0for key in items:prob = float(items[key])/dataleninfoEntropy -= prob*math.log(prob, 2)return infoEntropy
划分数据集
def splitDataset(self, dataSet, axis, value):rtnList = []for featVec in dataSet:if featVec[axis] == value:rFeatVec = featVec[:axis]rFeatVec.extend(featVec[axis+1:])rtnList.append(rFeatVec)return rtnList
训练决策树
数据集下载:
链接: 数据集下载
提取码:1tgp
dtree = ID3DTree()
dtree.loadDataSet("数据集.dat", ["age", "revenue", "student", "credit"])
dtree.train()
print(dtree.tree)
执行结果:
{'age': {'1': 'yes', '0': {'student': {'1': 'yes', '0': 'no'}}, '2': {'credit': {'1': 'no', '0': 'yes'}}}}
输出的结果是一个数据字典,我们将此字典转换为树状的形式
可以看到图中创建的决策树结构与json相同,说明算法正确。
持久化决策树
ID3类也提供了专门的方法用于保存决策树到文件,并可从文件读取决策树到内存。
def storeTree(self,inputTree,filename): # 存储树到文件fw = open(filename,'w')pickle.dump(inputTree,fw)fw.close()def grabTree(self,filename): # 从文件抓取树fr = open(filename)return pickle.load(fr)
执行代码如下。
dtree.storeTree(dtree.tree,"data.tree")mytree = dtree.grabTree("data.tree")print mytre
执行结果如下。
{'age': {'1': 'yes', '0': {'student': {'1': 'yes', '0': 'no'}}, '2': {'credit': {'1': 'no', '0': 'yes'}}}
决策树分类
最后我们给出决策树的分类器代码。
def predict(self,inputTree,featLabels,testVec): # 分类器 root = inputTree.keys()[0] # 树根节点secondDict = inputTree[root] # value-子树结构或分类标签featIndex = featLabels.index(root) # 根节点在分类标签集中的位置key = testVec[featIndex] # 测试集数组取值 valueOfFeat = secondDict[key] if isinstance(valueOfFeat, dict): classLabel = self.predict(valueOfFeat, featLabels, testVec) # 递归分类else: classLabel = valueOfFeatreturn classLabel
下面我们随机给出一个潜在客户,即一个行向量,使用学习出的决策树进行分类。执行预测代码如下。
dtree = ID3DTree()labels = ["age","revenue","student","credit"]vector = ['0','1','0','0'] # ['0','1','0','0','no']mytree = dtree.grabTree("data.tree")print "真实输出 ","no","->","决策树输出",dtree.predict(mytree,labels,vector)
算法评估
D3算法是比较早的机器学习算法,在1979年Quinlan就提出了该算法的思想。它以信息熵为度量标准,划分出决策树特征节点,每次优先选取信息量最多的属性,也就是使信息熵变为最小的属性,以构造一棵信息熵下降最快的决策树。
但是ID3在使用中也暴露出了一些问题。
- ID3算法的节点划分度量标准采用的是信息增益,信息增益偏向于选择特征值个数较多的特征。而取值个数较多的特征并不一定是最优的特征,所以需要改进选择属性的节点划分度量标准。
- ID3算法递归过程中需要依次计算每个特征值的,对于大型数据会生成比较复杂的决策树:层次和分支都很多,而其中某些分支的特征值概率很小,如果不加忽略就会造成过拟合的问题。即决策树对样本数据的分类精度较高,但在测试集上,分类的结果受决策树分支的影响很大。
【Python】ID3算法的实现相关推荐
- 机器学习题5:请简述ID3算法的实现步骤,并利用ID3算法构建天气数据集的决策树模型,实现决策树的可视化。
ID3算法的实现步骤: 输入:数据集(训练集)S及属性A 输出:属性A对训练数据集S的信息增益 ① 先将S作为根节点,其目标属性y有c个类别属性.假设S中出现的概率,计算数据集S的信息熵. ② 假设属 ...
- id3与软件测试,ID3算法的实现
##计算利用信息增益作为分类属性的ID3算法 x 'd', 'c', 'd', 'a', 'a', 'a', 'b', 'b'), byrow = F, ncol=3) #计算一列数据的信息熵 Cal ...
- python SHA1算法的实现
关于SHA1的知识点,好多文章介绍的很详细,我在这里分享一下直接用python实现的SHA1算法,和大家一起交流学习 首先和大家介绍一下sha1: SHA-1(英语:Secure Hash Algor ...
- python边缘检测代码_python Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...
- python怎么生成伪代码_Python零基础入门—算法的实现与伪代码
同学们好.在前面一节课,我们了什么是算法,知道了在一个算法中,要有输入.计算过程.还要有输出.这节课我们来讨论算法的实现. 这节课的内容与前面课程的课后练习有关.在课后练习中要求同学们写出计算长方形面 ...
- 素数判定 Miller-Rabin 算法的实现 python
素数判定 Miller-Rabin 算法的实现 实验目的 通过实验掌握 Miller-Rabin 素数判定的算法. 实验原理 Miller-Rabin primality test | encyclo ...
- python 推荐系统算法,Python用户推荐系统minkowski算法的实现
Python用户推荐系统minkowski算法的实现 #-*- coding: utf-8 -*- ''' python: www.iplaypy.com @author: Jekey 欧几里得距离 ...
- python canny检测_python Canny边缘检测算法的实现
图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...
- (python代码+讲解)重叠社区发现EAGLE层次算法的实现
EAGLE是一种基于最大团聚类的层次聚类算法,用来揭示网络的层次化和层次化社区结构.该算法采用一种聚类框架,来处理最大派系. 1.算法的实现: 首先用Bron-Kerbosch算法找到网络中的最大 ...
- 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用
我们继续来进行国密算法的演示. 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用. 一 sm2算法的特点: sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的: 非对称加密算法,即有 ...
最新文章
- Linux那些事儿 之 戏说USB(6)好戏开始了
- OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解
- 摄像头光圈大小对景深的影响
- 全排列 leetcode java_LeetCode--046--全排列(java)
- ios JSON 解析流程(转)
- 北漂心中的梦:惬意的生活
- 作为职场小白,除了要注意自身的言谈举止
- asp.net中Roles和User的异常处理机制的思考
- 将一个数据插入表中前校验数据是否存在
- 架构师成长计划|如何利用云原生构建一个企业级高可用架构?
- K8s高可用集群部署
- java keytool下载_Java中Keytool工具的使用总结(一)
- Maven安装与配置教程
- 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
- 计算机软件类自然科学基金标书,国家自然科学基金标书撰写——体会6(转发仅供参考)...
- U盘文件都变成exe文件怎么办(已解决)
- 织梦建站教程:文章列表隔行换色 隔5行横线
- 电子工程师除了挣工资,还可以这样增加收入!
- VxWorks中tornado2.2中的编译器支持哪个C语言标准,有哪些标准库?
- ionic3 版本更新
热门文章
- 简述et代理换ip软件网络功能。
- linux iso镜像安装工具,教你制作属于自己的CentOS 6.4一键自动化安装ISO镜像光盘...
- 电脑主机组装总结——自己动手,丰衣足食
- linux vrrp 配置命令,华为交换机VRRP配置实例收集(转)
- 需要TrustedInstaller权限才可以删除解决办法
- 东芝复印机2303出现f070_东芝复印机常见故障
- v-for中的key
- 繁体转简体 java_java 中文简体与繁体的转换
- 手把手教你使用QGIS制作地图
- 腾讯测试王者荣耀网速的软件,4G用户怎么体验5G速度 腾讯手机管家5G测速帮你一键搞定...