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算法的实现相关推荐

  1. 机器学习题5:请简述ID3算法的实现步骤,并利用ID3算法构建天气数据集的决策树模型,实现决策树的可视化。

    ID3算法的实现步骤: 输入:数据集(训练集)S及属性A 输出:属性A对训练数据集S的信息增益 ① 先将S作为根节点,其目标属性y有c个类别属性.假设S中出现的概率,计算数据集S的信息熵. ② 假设属 ...

  2. id3与软件测试,ID3算法的实现

    ##计算利用信息增益作为分类属性的ID3算法 x 'd', 'c', 'd', 'a', 'a', 'a', 'b', 'b'), byrow = F, ncol=3) #计算一列数据的信息熵 Cal ...

  3. python SHA1算法的实现

    关于SHA1的知识点,好多文章介绍的很详细,我在这里分享一下直接用python实现的SHA1算法,和大家一起交流学习 首先和大家介绍一下sha1: SHA-1(英语:Secure Hash Algor ...

  4. python边缘检测代码_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  5. python怎么生成伪代码_Python零基础入门—算法的实现与伪代码

    同学们好.在前面一节课,我们了什么是算法,知道了在一个算法中,要有输入.计算过程.还要有输出.这节课我们来讨论算法的实现. 这节课的内容与前面课程的课后练习有关.在课后练习中要求同学们写出计算长方形面 ...

  6. 素数判定 Miller-Rabin 算法的实现 python

    素数判定 Miller-Rabin 算法的实现 实验目的 通过实验掌握 Miller-Rabin 素数判定的算法. 实验原理 Miller-Rabin primality test | encyclo ...

  7. python 推荐系统算法,Python用户推荐系统minkowski算法的实现

    Python用户推荐系统minkowski算法的实现 #-*- coding: utf-8 -*- ''' python: www.iplaypy.com @author: Jekey 欧几里得距离 ...

  8. python canny检测_python Canny边缘检测算法的实现

    图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用.在空域运算中来说,对图像的锐化就是计算微分.对于数字图像的离散信号, ...

  9. (python代码+讲解)重叠社区发现EAGLE层次算法的实现

    EAGLE是一种基于最大团聚类的层次聚类算法,用来揭示网络的层次化和层次化社区结构.该算法采用一种聚类框架,来处理最大派系. 1.算法的实现:   首先用Bron-Kerbosch算法找到网络中的最大 ...

  10. 国密算法:利用python进行sm2非对称算法的实现,国密算法库gmssl的使用

    我们继续来进行国密算法的演示. 本篇演示sm2非对称算法的实现,国密算法库gmssl的使用. 一 sm2算法的特点: sm2: 即椭圆曲线公钥密码算法,是由国家密码管理局发布的: 非对称加密算法,即有 ...

最新文章

  1. Linux那些事儿 之 戏说USB(6)好戏开始了
  2. OpenCV中minAreaRect()最小外接矩形 cvBoxPoints()计算矩形顶点 RotatedRect和CvBox2D详解
  3. 摄像头光圈大小对景深的影响
  4. 全排列 leetcode java_LeetCode--046--全排列(java)
  5. ios JSON 解析流程(转)
  6. 北漂心中的梦:惬意的生活
  7. 作为职场小白,除了要注意自身的言谈举止
  8. asp.net中Roles和User的异常处理机制的思考
  9. 将一个数据插入表中前校验数据是否存在
  10. 架构师成长计划|如何利用云原生构建一个企业级高可用架构?
  11. K8s高可用集群部署
  12. java keytool下载_Java中Keytool工具的使用总结(一)
  13. Maven安装与配置教程
  14. 基于51单片机+LD3320语音模块+SYN6288语音合成——语音识别智能分类垃圾桶
  15. 计算机软件类自然科学基金标书,国家自然科学基金标书撰写——体会6(转发仅供参考)...
  16. U盘文件都变成exe文件怎么办(已解决)
  17. 织梦建站教程:文章列表隔行换色 隔5行横线
  18. 电子工程师除了挣工资,还可以这样增加收入!
  19. VxWorks中tornado2.2中的编译器支持哪个C语言标准,有哪些标准库?
  20. ionic3 版本更新

热门文章

  1. 简述et代理换ip软件网络功能。
  2. linux iso镜像安装工具,教你制作属于自己的CentOS 6.4一键自动化安装ISO镜像光盘...
  3. 电脑主机组装总结——自己动手,丰衣足食
  4. linux vrrp 配置命令,华为交换机VRRP配置实例收集(转)
  5. 需要TrustedInstaller权限才可以删除解决办法
  6. 东芝复印机2303出现f070_东芝复印机常见故障
  7. v-for中的key
  8. 繁体转简体 java_java 中文简体与繁体的转换
  9. 手把手教你使用QGIS制作地图
  10. 腾讯测试王者荣耀网速的软件,4G用户怎么体验5G速度 腾讯手机管家5G测速帮你一键搞定...