基于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://bishedaima.com/yuanma/36145.html

相关推荐

  • 企业级工位管理系统

    这是一个🔥🔥基于SpringBoot框架的企业级工位管理系统设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    1 1 1
  • 非物质文化网站

    这是一个🔥🔥基于SpringBoot框架的非物质文化网站设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    5 1 2
  • 基于JSP和SQL Server 2005的医院网上预约挂号系统

    基于JSP和SQL Server 2005的医院网上预约挂号系统 摘 要 近几年,受多重社会经济因素影响,我国医院如何做到就诊方便,步骤简单,成为社会普遍关注的焦点
    2024年05月14日
    8 1 1
  • 基于javaweb的停车场管理系统源码

    这是一个🔥🔥基于javaweb的停车场管理系统源码🔥🔥的项目源码,开发语言Java,开发环境Idea/Eclipse,这个 停车场管理系统开发技术栈为JSP项目,可以作为毕业设计课程设计作业使用JavaWeb技术构建一个B/S架构的停车场管理系统
    2024年05月23日
    10 1 1
  • Python实现的基于Scrapy爬虫框架和Django框架的新闻采集和订阅系统

    Python实现的基于Scrapy爬虫框架和Django框架的新闻采集和订阅系统 摘要 随着互联网的迅速发展,互联网大大提升了信息的产生和传播速度
    2024年05月14日
    2 1 1
  • 文章发布系统(jsp)

    Article-Publishing-System 随着计算机技术的迅速发展,网络正以一种前所未有的冲击力影响着人类的生产和生活,网络的快速发展,颠覆了传统的信息传播方式
    2024年05月14日
    149 1 20
  • 基于SpringBoot框架的共享汽车管理系统

    这是一套采用Java语言编写的🚗💨共享汽车管理系统的源代码,基于流行的SpringBoot框架构建,我们运用了SpringBoot与Vue技术栈进行开发,支持Idea或Eclipse集成开发环境
    2024年05月23日
    13 1 2
  • 高校心理教育辅导平台

    这是一个🔥🔥基于SpringBoot框架的高校心理教育辅导平台设计与实现🔥🔥的项目源码,开发语言Java,框架使用的SpringBoot+vue技术,开发环境Idea/Eclipse
    2024年05月23日
    4 1 1
  • ssm架构

    dfhxtxtxr 更富有创意天大鱼大肉的v不管成功发行股份幸福感新股发行发光效果如下如果想让共享富贵下功夫的人地广人稀官方唱歌唱歌唱歌的一天的火锅吃瓜吃瓜他的烟台大樱桃一天到黑哥唱歌唱歌的泰国第一天衬托出同样的态度一天的太阳媳妇关心他人 参考文献 基于SSM框架的B2C电商平台的设计与实现(华东交通大学·卢庆胜) 基于SSVH框架的综合集中告警WEB系统的研究与实现(西南交通大学·蔚晓娟) 基于Struts和Hibernate的J2EE Web应用的研究与实现(华东师范大学·张国梁) 基于SSM框架的投资项目经济评价系统分析与实现(山东大学·白春强) 基于SSM的综合医养平台的设计与实现(吉林大学·宋恩旭) 基于轻量级J2EE架构的工程管理信息系统的设计与实现(暨南大学·谢运佳) 基于SSM的综合医养平台的设计与实现(吉林大学·宋恩旭) 基于B/S结构的汽车营销服务管理系统的研究与实现(武汉科技大学·王恒青) 基于SSM框架的资产证券化系统的设计与实现(西安电子科技大学·贾田田) 基于SSI框架的开发配置管理系统的设计与实现(山东大学·冯峰) 基于J2EE/UML的企业建模系统的研究(浙江大学·丁勇) 基于OAuth2
    2024年05月14日
    7 1 2
  • 基于SpringBoot框架的疾病防控综合系统

    这是一套采用🔥🔥SpringBoot框架构建的全面疾病防控系统源代码,编程语言为Java,并结合了Vue技术,开发工具为Idea或Eclipse,此疾病防控平台适用于毕业设计或课程实践项目
    2024年05月23日
    2 1 1

发表回复

登录后才能评论