基于Python实现ID3算法

1,作业任务 编程实现 ID3 算法,针对下表数据,生成决策树, ID color size act age inflated 1 YELLOW SMALL STRETCH ADULT T 2 YELLOW SMALL STRETCH CHILD T 3 YELLOW SMALL DIP CHILD F 4 YELLOW LARGE STRETCH ADULT T 5 YELLOW LARGE DIP ADULT T 6 YELLOW LARGE DIP CHILD F 7 PURPLE SMALL STRETCH CHILD T 8 PURPLE SMALL DIP ADULT T 9 PURPLE SMALL DIP CHILD F 10 PURPLE LARGE STRETCH CHILD T 问题提示:可设计数据文件格式

本文包含相关资料包-----> 点击直达获取<-------

1.作业任务

编程实现 ID3 算法,针对下表数据,生成决策树。

ID color size act age inflated
1 YELLOW SMALL STRETCH ADULT T
2 YELLOW SMALL STRETCH CHILD T
3 YELLOW SMALL DIP CHILD F
4 YELLOW LARGE STRETCH ADULT T
5 YELLOW LARGE DIP ADULT T
6 YELLOW LARGE DIP CHILD F
7 PURPLE SMALL STRETCH CHILD T
8 PURPLE SMALL DIP ADULT T
9 PURPLE SMALL DIP CHILD F
10 PURPLE LARGE STRETCH CHILD T

问题提示:可设计数据文件格式,如 color 属性取值 YELLOW:0,PURPLE:1 等,程序从指定数据文件中读取训练集数据。

问题拓展:要求将计算各属性信息增益过程及决策树生成过程演示出来。

2.运行环境

  • 编程语言:Python
  • 使用第三方库:Numpy,Matplotlib,Scikit-learn
  • IDE:PyCharm
  • 操作系统:WIndows10

3.算法介绍

决策树(decision tree)是一个树结构(可以是二叉树或非二叉树)。其每个非叶节点表示一个特征属性上的测试,每个分支代表这个特征属性在某个值域上的输出,而每个叶节点存放一个类别。使用决策树进行决策的过程就是从根节点开始,测试待分类项中相应的特征属性,并按照其值选择输出分支,直到到达叶子节点,将叶子节点存放的类别作为决策结果。引用《机器学习》(西瓜书)中的例子:

通过属性来逐渐地把西瓜分到对应的类别中去,决策树的学习过程就是在寻找最优决策方案的过程。

基本的算法流程:

  • 输入:

``` 训练集 D={(x1,y1),(x2,y2),(x3,y3),(x4,y4), ... , (xm,ym)}

属性集 A={a1,a2,a3,a4, ... , a5} ```

  • 过程:

函数TreeGenerate(D, A) 生成节点 if D 中样本全属于同一类别C then 将node标记为C类叶子节点;return end if 从A中选择最优划分属性a*; for a* 的每一个a’ do 为node生成一个分支;另Dv表示D中在a*上取值为a’的end样本子集; if Dv为空 then 将分支结点标记为叶结点,其类别标记为D中样本最多的类;return else 以TreeGenerate(Dv,A\{a*})为分支结点 end if end for

  • 输出:

以 node 为根结点的一棵决策树

ID3 是决策树算法的一种,它是以信息熵和信息增益作为衡量标准

4.程序分析

4.1 制作数据集:

因为 ID 对于实际环境并没有什么参考价值,所以这次作业数据集我将 ID 这个属性去掉

c++ 1.fr = open(r'data/text.txt')   2.listWm = [inst.strip().split(',')[1:] for inst in fr.readlines()[1:]]

通过 python 的切片功能,把每一行数据中的 id 去掉(通过 slide[1:]来实现)

数据集截图:

4.2 输出决策树结果

c++ 1.print(json.dumps(Trees, ensure_ascii=False))   Json格式 { "act": { "DIP": { "age": { "CHILD": "F", "ADULT": "T" } }, "STRETCH": "T" } }

程序运行过程中得出 act 的决策能力大于 age(因为 act 的信息熵 <age 的信息熵)

1.def createTree(dataSet, labels):   2.    classList = [example[-1] for example in dataSet]  # 类别向量   3.    if classList.count(classList[0]) == len(classList):  # 如果只有一个类别,返回   4.        return classList[0]   5.    if len(dataSet[0]) == 1:  # 如果所有特征都被遍历完了,返回出现次数最多的类别   6.        return majorityCnt(classList)   7.    bestFeat,bestGain = chooseBestFeatureToSplit(dataSet)  # 最优划分属性的索引   8.    bestFeatLabel = labels[bestFeat]  # 最优划分属性的标签   9.    print("当前最佳属性%s,信息熵%f" % (bestFeatLabel,bestGain))   10.    myTree = {bestFeatLabel: {}}   11.    del (labels[bestFeat])  # 已经选择的特征不再参与分类   12.    featValues = [example[bestFeat] for example in dataSet]   13.    uniqueValue = set(featValues)  # 该属性所有可能取值,也就是节点的分支   14.    for value in uniqueValue:  # 对每个分支,递归构建树   15.        subLabels = labels[:]   16.        myTree[bestFeatLabel][value] = createTree(   17.            splitDataSet(dataSet, bestFeat, value), subLabels)   18.    return myTree

根据当前属性计算信息增益的值,并将结果输出出来

4.3 可视化决策树:

1.def plotTree(myTree, parentPt, nodeTxt):   2.    numLeafs = getNumLeafs(myTree)   3.    depth = getTreeDepth(myTree)   4.    firstStr = list(myTree.keys())[0]   5.    cntrPt = (plotTree.xOff + (1.0 + float(numLeafs)) / 2.0 / plotTree.totalW,   6.              plotTree.yOff)   7.    plotMidText(cntrPt, parentPt, nodeTxt)   8.    plotNode(firstStr, cntrPt, parentPt, decisionNode)   9.    secondDict = myTree[firstStr]   10.    plotTree.yOff = plotTree.yOff - 1.0 / plotTree.totalD   11.    for key in secondDict.keys():   12.        if type(secondDict[key]).__name__ == 'dict':   13.            plotTree(secondDict[key], cntrPt, str(key))   14.        else:   15.            plotTree.xOff = plotTree.xOff + 1.0 / plotTree.totalW   16.            plotNode(secondDict[key], (plotTree.xOff, plotTree.yOff),   17.                     cntrPt, leafNode)   18.            plotMidText((plotTree.xOff, plotTree.yOff), cntrPt, str(key))   19.    plotTree.yOff = plotTree.yOff + 1.0 / plotTree.totalD

使用第三方库 matplotlib 画图

5.界面截图与分析

5.1 通过图来大致观察一下不同属性的划分情况:

color:

size:

act:

age:

5.2 查看属性对于结果的划分影响:

color:

此属性出现了四个柱,说明不能完全划分

size:

此属性同上,不能完全划分

act:

从图中可以看出,STRETCH 全部为 T,说明此属性可以连接叶子节点

age:

从图中可以看出,ADULT 全部为 T,说明此属性可以连接叶子节点

5.3 程序运行控制台输出结果:

5.4 决策树可视化结果:

通过输出的结果可以知道,act 属性对于结果的划分最彻底,其次是 age 属性

根据可视化图可知

c++ act = STRETCH => T act = DIP and age = CHILD => F act = DIP and age = ADULT => T

6.心得体会

  • 首先通过本次实验我学习了一下决策树的可视化的方式
  • 通过这次试验,我将以前学习过的决策树相关的知识复习了一遍
  • 这次实验的数据量有限,而且都是离散化数据,所以我并没有做整体的数据分布的分析
  • 因为决策树算法与分析线性相关性分析联系不大,所以我并没有衡量不同属性间的相关性
  • 通过这次实验,我对机器学习的相关项目的流程有了更加清晰的认识,这也对我日后做病理图像相关的机器学习打下了基础

7.参考资料

[1] 《DEEPLEARNING》,[美]lan Goodfellow [加]Yoshua Bengio [加]Aaron Courville 人民邮电出版社

[2] 《机器学习》,周志华,清华大学出版社

[3] 《Python数据可视化之matplotlib》,刘大成,电子工业出版社

[4] 《统计学习方法》,李航,清华大学出版社

[5] 《机器学习实战》,Peter Harrington,人民邮电出版社

[6] 《阿里云天池大赛赛题解析机器学习篇》,天池平台,电子工业出版社

[7] 《Python 袖珍指南》,Mark Lutz, 中国电力出版社

参考文献

  • 理财论坛的设计与实现(吉林大学·王雷)
  • 基于群体影响的深度对抗生成推荐算法(中国地质大学(北京)·宿永伟)
  • 基于Web和数据挖掘的智能教学系统的研究与开发(首都师范大学·乔向杰)
  • 基于Django的课程推荐系统的设计与实现(华中科技大学·羊雪玲)
  • 基于网络爬虫的基金信息抽取与分析平台(华南理工大学·陈亮华)
  • 理财论坛的设计与实现(吉林大学·王雷)
  • 基于网络爬虫的基金信息抽取与分析平台(华南理工大学·陈亮华)
  • 基于Web的人脸识别系统的研究与实现(中南民族大学·范忠)
  • 基于J2EE的人力资源管理系统的设计与实现(大连海事大学·苑馨研)
  • 基于数据仓库技术的油田生产经营管理系统研究(中国石油大学·邰伟民)
  • 网络信息代理的设计与实现(广东工业大学·陈旨明)
  • 基于项目语义的协同过滤推荐算法研究(浙江工业大学·张政)
  • 个性化音乐推荐系统的设计与实现(华中科技大学·余梦琴)
  • 基于J2EE的远程网络教育系统研究与实现(电子科技大学·陈南荪)
  • 数据预测的图形化编程及应用(青海师范大学·林连海)

本文内容包括但不限于文字、数据、图表及超链接等)均来源于该信息及资料的相关主题。发布者:源码导航 ,原文地址:https://m.bishedaima.com/yuanma/36145.html

相关推荐

  • 基于JSP和MySQL实现的网上商城系统

    基于JSP和MySQL实现的网上商城系统 摘 要 网上商城系统开发存在的两个问题就是后台的管理与消费者操作的方便性,系统从数据库开发的基本内容入手
    2024年05月14日
    17 1 2
  • 教师工作量管理系统

    这是一个🔥🔥基于SpringBoot框架的教师工作量管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    4 1 1
  • 动漫人物分类识别之Python

    动漫人物分类识别 Python & Deep Learning 101 Assignment #2 来源 一开始定题的时候大家都很纠结,想了几天都没有很好的想法
    2024年05月14日
    2 1 1
  • 自然语言处理作业之Python

    自然语言处理作业 实验内容: 实现基于词典的分词方法和统计分词方法:两类方法中各实现一种即可; 对分词结果进行词性标注,也可以在分词的同时进行词性标注; 对分词及词性标注结果进行评价
    2024年05月14日
    1 1 1
  • 使用 Python 实现的网站变化监测系统

    使用 Python 实现的网站变化监测系统 很多时候我们都有监测某个网站变化的需求,比如是否发布新通知了,是否有新更新了等,之前使用过 Chrome 的几个插件来实现这个功能
    2024年05月14日
    3 1 1
  • SSM实现值班管理系统排班管理系统

    值班管理系统是现代组织中不可或缺的一部分,其对于人力资源的合理调配和工作效率的提升至关重要,随着信息技术的迅速发展,基于Spring,SpringMVC和MyBatis的值班管理系统(SSM实现值班管理系统)逐渐成为研究和应用的热点
    2024年05月07日
    9 1 4
  • 基于SpringBoot框架的秒杀系统

    这是一套采用Java语言编写的🔥🔥SpringBoot框架为核心的秒杀系统源代码🔥🔥,该项目运用了SpringBoot和Vue技术栈,支持Idea或Eclipse开发环境
    2024年05月23日
    3 1 1
  • 基于springboot+mysql+Shiro实现的宠物医院管理系统

    基于springboot+mysql+Shiro实现的宠物医院管理系统 1,项目介绍 系统主要为用户提供了管理员权限的用户,实现了前台查看客户信息,在线添加预约等;后台管理医生坐诊信息
    2024年05月14日
    6 1 1
  • 基于Python实现RRT与双向RRT算法

    1, 算法概述 1,1 RRT快速拓展随机数算法 RRT 的思想是快速扩张一群像树一样的路径以探索(填充)空间的大部分区域,伺机找到可行的路径,虽然不知道出路在哪里
    2024年05月14日
    3 1 1
  • 基于SpringBoot框架的房地产销售管理系统

    这是一套采用Java语言编写的🏡🏡房地产销售管理系统的源代码,基于流行的SpringBoot框架,我们利用了SpringBoot和Vue,js的技术栈进行开发,支持使用Idea或Eclipse作为集成开发环境
    2024年05月23日
    3 1 1

发表回复

登录后才能评论