当前位置: 首页 > news >正文

第四章-决策树

 代码如下:

import numpy as np
import pandas as pd
data=pd.read_excel("西瓜数据集.xlsx")
D=data
A=D.columns[1:-1]#列标签作为属性集,除去编号,和好瓜(它们不是特征)
class TreeNode:def __init__(self):self.mark=None#如果mark=-1 则该节点是叶子节点,否则是分支决策节点self.decision=None#如果是叶子节点,则是类别(好瓜:是or否),如果是分支决策节点,则是划分的属性self.chids={}#用字典存储分支的孩子{属性值:分支节点}
def Max_class(D):#取D数据集中类别的最多的那个类max_class=D["好瓜"].iloc[0]max_value=0for i in set(D["好瓜"]):#{否,是}count=np.sum(D["好瓜"]==i)#统计类别个数if max_value<count:max_value=countmax_class=ireturn max_class#返回最多的那个类名称def Ent(D):#数据集的熵,当前样本的纯度ent_d=0for i in set(D["好瓜"]):#{是,否}class_num=np.sum(D["好瓜"]==i)#统计某类样本的个数pk=class_num/D.shape[0]#计算该类在数据集中的占比ent_d+=pk*np.log2(pk)#计算某类的熵,并累加return -1*ent_d#返回最终的数据集熵值def Gain(D,a):dv_ent_sum=0for v in set(D[a]):site=np.where(D[a]==v)#得到符合条件样本的下标Dv=D.iloc[site]#通过iloc函数取出对应下标的样本,组成子集DvDv_div_D=Dv.shape[0]/D.shape[0]#计算|Dv|/|D|的值ent_dv=Ent(Dv)#得到某个属性取值Dv子集的信息熵dv_ent_sum+=Dv_div_D*ent_dv#得到a属性总的信息熵return Ent(D)-dv_ent_sumdef AttChoice(D,A):#获得信息增益最大的那个属性max_gain_a=A[0]#假定好的是第0个属性max_gain=0#假定信息增益取值为0for a in A:#循环找到最大信息增益的属性print(a,"的信息增益为:",Gain(D,a))if max_gain<Gain(D,a):max_gain=Gain(D,a)max_gain_a=aprint("当前选择的最优属性决策是:",max_gain_a)return max_gain_a#返回信息增益最大的属性def TreeGenerate(D, A, node):if len(set(D['好瓜'])) == 1:  # 如果类别集合长度==1则说明只有一类print(D)print("样本集合已经非常纯了,全是同类样本!选择最多那个类即可!")node.mark = -1  # 标记为-1 ,是叶子节点node.decision = Max_class(D)  # 把数据集中最多的那个类作为分类结果if node.decision == "是":print("是【好瓜】")else:print("是【坏瓜】")print("==========返回了===========")returnif len(A) == 0 or np.sum(D[A].values[:] == D[A].values[0]) == D[A].shape[0] * D[A].shape[1]:print("没有可以选择的属性来作为决策,需要立即得到分类结果,或者样本的属性取值都一样,无需分类,选择最多的那个类即可!")node.mark = -1  # 标记为-1 ,是叶子节点node.decision = Max_class(D)  # 把数据集中最多的那个类作为分类结果if node.decision == "是":print("是【好瓜】")else:print("是【坏瓜】")print("==========返回了===========")returngood_a = AttChoice(D, A)  # 从A中选择最优划分属性good_afor a_v in set(D[good_a]):print("当前选择的分支属性是:", a_v)node_c = TreeNode()  # 生成分支节点node.chids[a_v] = node_c  # 链接分支Dv = D.iloc[np.where(D[good_a] == a_v)]  # 得到属性good_a 取值为a_v的样本集if Dv.shape[0] == 0:  # 判断Dv是否为空print("当前分支的样本数是0,无法分类,直接选择样本集最多的类作为分类结果。")node_c.mark = -1  # 标记为叶子节点node_c.decision = Max_class(D)print("==========返回了===========")returnelse:node.mark = 1  # 不是分类节点(叶子节点),赋值为非-1的值即可node.decision = good_a  # node节点为分支决策节点,节点的值为最优划分属性即可TreeGenerate(Dv, np.delete(A, np.where(A == good_a)), node_c)  # 递归,下一层,同样是决策树,只是数据集更小,属性越少node = TreeNode()
Root = node
TreeGenerate(D,A,node)
print("測試一下")
for i in range(0,data.shape[0]-1):test_sample=D.iloc[i]print("=============START==================")print("类别应该是:",test_sample["好瓜"])root=Rootwhile(root.mark!=-1):#如果不是叶子节点(需要我们对属性进行决策)a_v=test_sample[root.decision]#利用决策树的decision来获取要决策的属性root=root.chids[a_v]#mark==-1的时候结束,说明可以输出最终的分类了print("分类结果:",root.decision)print("==============END===================")

数据集数据如下:

相关文章:

  • 用人工智能写2024年高考作文
  • MFC 教程-回车时窗口退出问题
  • Springboot集成SSE消息推送
  • 浅谈word格式:.doc和.docx的优缺点及区别
  • 7.数据集处理库Hugging Face Datasets
  • 2024泰迪智能科技大数据实训室方案
  • C# Winform内嵌窗体(在主窗体上显示子窗体)
  • 二十、OOP之理解《匿名内部类》
  • boost asio异步服务器(3)增加发送队列实现全双工通信
  • 离散数学答疑 6
  • 為什麼使用代理API?
  • 数组中的map方法
  • Qt-5.15.0 离线文档 html
  • Vue2+Vue3知识补充
  • Python爬取城市空气质量数据
  • [译] React v16.8: 含有Hooks的版本
  • 3.7、@ResponseBody 和 @RestController
  • Android框架之Volley
  • classpath对获取配置文件的影响
  • Druid 在有赞的实践
  • gulp 教程
  • js数组之filter
  • Less 日常用法
  • Nodejs和JavaWeb协助开发
  • Phpstorm怎样批量删除空行?
  • scrapy学习之路4(itemloder的使用)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 关于Flux,Vuex,Redux的思考
  • 力扣(LeetCode)357
  • 聊聊flink的TableFactory
  • 手机app有了短信验证码还有没必要有图片验证码?
  • 数据可视化之 Sankey 桑基图的实现
  • 自定义函数
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 阿里云API、SDK和CLI应用实践方案
  • # Redis 入门到精通(八)-- 服务器配置-redis.conf配置与高级数据类型
  • # Redis 入门到精通(九)-- 主从复制(1)
  • # 数据结构
  • #define用法
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • $().each和$.each的区别
  • $.ajax()
  • (42)STM32——LCD显示屏实验笔记
  • (C语言)输入自定义个数的整数,打印出最大值和最小值
  • (HAL)STM32F103C6T8——软件模拟I2C驱动0.96寸OLED屏幕
  • (Oracle)SQL优化基础(三):看懂执行计划顺序
  • (react踩过的坑)antd 如何同时获取一个select 的value和 label值
  • (第一天)包装对象、作用域、创建对象
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (独孤九剑)--文件系统
  • (分类)KNN算法- 参数调优
  • (面试必看!)锁策略
  • (四)JPA - JQPL 实现增删改查
  • (原創) 未来三学期想要修的课 (日記)
  • (转)Spring4.2.5+Hibernate4.3.11+Struts1.3.8集成方案一