刚刚写过一篇决策树实现的案列,树结构采用python自带的字典作为存储决策树的数据结构,为了下一步便于实现预剪枝和后剪枝,老叔认为采用自定义数据结构可能会更便于操作,也更灵活,可以在节点随意添加自己认为重要的元素。节点定义如下:

class Node(object):#定义节点类,类数据为样本列表,以及剩余属性列表def __init__(self, node_dataset, node_A):#节点的样本集合,可有可无self.node_dataset = node_dataset#节点的剩余特征集合self.node_A = node_A#叶结点标记,如果是叶结点,self.label为叶结点的标签值self.label = None#根结点标记,如果是根结点,self.ai_best为结点样本的最优增益特征self.ai_best = None#将子节点的指针为字典,key为特征标签,value为子节点地址self.child = {}

这时,决策树生成函数其实和字典差不多,不同的是此次函数返回的是一个根节点的地址,而不是字典。代码如下:

def TreeGenerate(node_dataset, A):#data,A生成节点node = Node(node_dataset, A)#如果样本标签相同,标记该节点为叶节点,节点标签为样本标签,并且返回节点指针if is_the_same_jugement(node_dataset):#节点标签为样本标签node.label =node_dataset[0]["标签"]return node#如果样本判别的剩余属性数量为0,将样本标签定义为数量最多的样本对应的标签,并且返回节点指针if len(A) == 0  or is_the_same_labels(node_dataset, A):node.label = argmax_jugement(node_dataset)return node#从A中选择最优划分属性a_bestai_best = select_ai(node_dataset, A)#将最优特征记录到节点内node.ai_best = ai_best#以ai_best属性将节点样本分类sub_node_datasets= classfide_by_ai_best(node_dataset,ai_best)#移除A中本次使用的最优特征A.remove(ai_best)#遍历ai_best 特征的标签值for ai_best_value in  sub_node_datasets.keys():#注意此时必须使用切片复制的方法,若直接采用sub_A = A,则sub_A中删除最优特征时,A中元素也会删除对应最优特征,#,导致同一个根节点的不同分支,随着递归进行,可选的剩余特征越来越少sub_A = A[:]#获取最大增益特征的标签值对应的样本列表sub_node_dataset =  sub_node_datasets[ai_best_value]#如果最大增益特征的某一个标签值对应的样本列表为空,将分支结点定为叶结点,判别标签标记为父节点的样本最多的类标签if len(sub_node_dataset) == 0:sub_node = Node(sub_node_dataset, A)sub_node.label = argmax_jugement(node_dataset)#节点的子节点指针设置为空sub_node.child = None#把根节点的指针指向本节点node.child[ai_best_value] = sub_node#继续生成下一个特征标签子节点continue  #递归调用本函数,函数自变量为子样本列表和剩余特征列表,函数返回判别标签node.child[ai_best_value] = TreeGenerate(sub_node_dataset, sub_A)return node

为了利用现成的画图程序,可以把节点结构的决策树转换为轻量级的字典,转换代码如下:

def node_to_dic(node):"""Function : 把自定义数据结构转换为字典结构Input: node: 按照自定义的节点生成的决策树Output: 字典结构的决策树"""#定义字典存储决策树my_tree = {}#如果是叶结点,直接返回样本标签if node.label:return node.label#如果是根结点,以该节点的最优特征作为字典中的key,value为一个嵌套字典,嵌套字典的key为最优特征的不同标签,#value为递归调用本函数返回的字典if node.ai_best:my_tree = {node.ai_best:{}}for ai_best_value in node.child.keys():my_tree[node.ai_best][ai_best_value] =  Travel(node.child[ai_best_value])return my_tree

运行一下

my_tree =  node_to_dic(mynode)
my_tree
{'纹理': {'清晰': {'根蒂': {'蜷缩': '好瓜','稍蜷': {'色泽': {'青绿': '好瓜','乌黑': {'触感': {'硬滑': '好瓜', '软粘': '坏瓜'}},'浅白': '好瓜'}},'硬挺': '坏瓜'}},'稍糊': {'触感': {'硬滑': '坏瓜', '软粘': '好瓜'}},'模糊': '坏瓜'}}

结果与直接采用字典结构是一样的
此时可以方便的用现成的画图程序会出树结构

总结:采用自定义数据结构,可以更加灵活的决定节点存储的内容,比如还可以在节点内添加父节点指针,这在剪枝操作是概念非常清晰,也更容易实现。

西瓜书决策树实现(基于ID3)补充——采用自定义数据结构实现相关推荐

  1. 西瓜书决策树实现(基于ID3)——采用字典数据结构

    一.前言 这段时间疫情不那么严重,回公司上班了.平时工作比较忙,而且重点在学习数学.很久没有更新,最近实现<西瓜书>决策树,贴出来给大家共享.西瓜数据集2.0如下:在这里插入代码片 ['青 ...

  2. 决策树挑出好西瓜(基于ID3、CART)

    决策树挑出好西瓜(基于ID3.CART) 一.决策树 1. 介绍 2. 决策树事件处理流程 3. 理论基础 二.ID3决策树及Python实现 1. 数据处理 2. 步骤 3. 决策树实现 4. 分析 ...

  3. 西瓜书重温(四): 决策树手推版

    1. 写在前面 今天复习的决策树模型, 对应的是西瓜书的第四章内容, 关于决策树模型,重要性不言而喻了, 这个是后面集成学习模型的基础, 集成学习里面不管是bagging家族里面的代表随机森林,还是b ...

  4. ++代码实现 感知机的原理_决策树ID3原理及R语言python代码实现(西瓜书)

    决策树ID3原理及R语言python代码实现(西瓜书) 摘要: 决策树是机器学习中一种非常常见的分类与回归方法,可以认为是if-else结构的规则.分类决策树是由节点和有向边组成的树形结构,节点表示特 ...

  5. 决策树挑出好西瓜(基于ID3、C4.6、CART实现)

    文章目录 一.决策树介绍 利用信息增益选择最优划分属性 二.实现针对西瓜数据集的ID3算法代码,并输出可视化结果. 1.西瓜数据集 2. 代码实现 (1)建立决策树 (2)绘制决策树 三.C4.5方法 ...

  6. 《机器学习》西瓜书课后习题4.3——python实现基于信息熵划分的决策树算法(简单、全面)

    <机器学习>西瓜书课后习题4.3--python实现基于信息熵划分的决策树算法 <机器学习>西瓜书P93 4.3 试编程实现基于信息熵进行划分选择的决策树算法,并为表4.3中数 ...

  7. 决策树入门【西瓜书】

    当一个有经验的老农看一个瓜是不是好瓜时,他可能会先看下瓜的颜色,一看是青绿的,心想有可能是好瓜:接着他又看了下根蒂,发现是蜷缩着的,老农微微点头,寻思着五成以上是好瓜:最后他又敲了下瓜,一听发出浑浊的 ...

  8. 【机器学习】西瓜书_周志华,python实现基于信息熵进行划分选择的决策树算法

    python:实现基于信息熵进行划分选择的决策树算法 本文主要介绍本人用python基于信息熵进行划分选择的决策树代码实现,参考教材为西瓜书第四章--决策树.ps.本文只涉及决策树连续和离散两种情况, ...

  9. 【DataWhale学习】Day10~13-4章决策树——西瓜书学习摘录笔记

    [DataWhale学习]Day10~13-4章决策树--西瓜书学习摘录笔记 本文参考了周志华老师的西瓜书,李航老师的统计学习方法,谢文睿大佬的南瓜书(无推导尿点,仅加深理解食用) 决策树模型 ​ 决 ...

最新文章

  1. VA01销售订单增强MV45AFZZ注意点
  2. JZOJ 5606. 【NOI2018模拟3.27】Yja
  3. 如何使用代码给product创建distribution chain
  4. 那些视觉上骗了你的东西,你上当了吗?
  5. 2021年石家庄七中高考成绩查询入口,石家庄市教育考试院官网2020中考查分:成绩查询入口...
  6. 黑马程序员-java-高新技术中《九》
  7. Android的ListFragment和Fragment的使用
  8. 秀拍客电脑版 v1.0正式版
  9. 各大物联网平台对比之百度IoT云平台
  10. 求2+22+222+2222+.....的N项之和
  11. 提高禁毒意识,vr全景直观感受毒品危害
  12. 【ES】1318- 这些 ES7-ES12 的知识点你都掌握了吗?
  13. 浅谈移动端Vin码识别技术
  14. bzoj1755 [Usaco2005 qua]Bank Interest
  15. B. Sereja and Mirroring
  16. [转]:Quartus II LPM使用指南-FIFO篇
  17. 启动tomcat出来两个窗口 NOTE: Picked up JDK_JAVA_OPTIONS: --add-opens=java.base/java.lang=ALL-UNNAMED --add-
  18. 常用的计算机病毒检测方法都有哪些?
  19. 农夫、狼、羊过河问题
  20. (六) carla中导入AdditionalMaps

热门文章

  1. 《ABP Framework 极速开发》 - 教程首发
  2. 学校计算机保管制度,学校计算机室安全管理制度
  3. 花80万造企业新掌门人 主教吃喝玩乐
  4. 饿死胆小的,撑死胆大的------简评百度收购91无线
  5. 李阳疯狂英语900句(546-674)
  6. 为魅族M8手机开发软件《M8空中警报》(M8AirAlarm) ,已开源
  7. 计算机软件实习项目二 —— 贪吃蛇游戏 (代码实现) 12-16
  8. 批量查验发票真伪的智能化解决方案
  9. 浅谈Node.js模块系统
  10. 第七章 : Git 介绍 (上)[Learn Android Studio 汉化教程]