Python手搓C4.5决策树+Azure Adult数据集分析

前言

课上的实验

由于不想被抄袭,所以暂时不放完整代码

Adult数据集可以在Azure官网上找到

Azure 开放数据集中的数据集 - Azure Open Datasets | Microsoft Learn

数据集预处理

  1. 删除难以处理的权重属性fnlwgt与意义重复属性educationNum
  2. 去除重复行与空行
  3. 删除包含异常值的数据

处理连续值属性

  1. 年龄数据分箱(使得各个年龄段中高收入人群占比的差异尽量大):
  2. 资本收益数据分箱
  3. 资本支出数据分箱
  4. 某周工作时长数据分箱

处理离散值属性

  1. workclass工作部门,可以把相同的工作部门归为一类避免决策树分叉过多
  2. education学历,可以把学历相近的分为一块,以减少决策树分叉
  3. maritalStatus婚姻状况,将离异、丧偶、分居等归为一类,未婚归为一类,已婚与配偶暂时不在归为一类,再婚归为一类,分四类。
  4. occupation职业,由于不同职业的薪水状况不同,所以只能每个职业都单独作为一类
  5. relationship家庭关系,每种单独分为一类
  6. race种族,每种单独归类
  7. sex性别,分两类
  8. nativeCountry国籍,由于美国人居多,所以分为美国与其他国家两类
  9. income收入,这是我们需要预测的结果,分为 >50K 和 <=50K,由于测试集中的标签多了一个‘.’所以需要单独处理一下

C4.5决策树

其实决策树并没什么太难的地方,主要是使用的python,pandas库在划分数据集时如果使用单行遍历会很慢,此时需要找到符合功能需求的批处理函数

决策树主要分为以下几个模块

1、计算信息熵(D表示数据集,|D|表示数据集大小,Di表示分类结果为i的数据集)

信息熵:

条件信息熵:(按照属性A划分之后的信息熵加权平均数,D(j)表示属性A为j的数据集)

2、获取数据集中的众数。作为叶节点的信息

3、将数据集按照某个关键字划分。这里很坑,如果单行遍历划分回巨慢无比,但是pandas有专门的批处理函数groupby用于划分(划分时间直接从30+s优化到0.0s),但是如果当前值不存在会发生报错,所以要单独加入一个占位的DataFrame

4、决策树划分策略

按照C4.5决策树的划分规则,需要计算信息增益比

信息增益:

信息增益比

所以,在寻找最优划分策略的时候需要枚举每一个未划分的属性,计算划分后的数据集的信息增益比,选择信息增益比最高的属性进行划分即可

5、决策树构建

由于决策树很容易过拟合,所以这里使用了两种剪枝方法,首先设置节点纯度阈值,当递归时节点纯度高于阈值时可以直接选用当前数据集的众数作为节点值,停止递归。然后设置深度阈值,当超过该深度时就取当前数据集的众数作为节点值,停止递归。

构建过程:

由于是进行的递归构建,相当于在对最优决策树做一个先根遍历,首先对于当前节点,在决策树存储矩阵上添加一行,存储当前节点的决策信息;然后将每个儿子返回的矩阵依次append到这个矩阵下方,利用当前的矩阵行数计算儿子行标相对于当前节点行标的增量。完成构建之后,为了后续方便查询,对每个节点的用当前的行数加上儿子节点的增量,就可以算出儿子节点对应的行数。

6、决策树分类过程

对于每个数据组,从决策树根节点开始,选择决策树节点划分的属性,将当前节点id跳转到数据该属性对应值的儿子节点即可,直到跳转到叶子节点停止

运行结果

训练集分类结果(准确率0.833)

测试集分类结果(准确率0.836)

效果还是不错,堪比神经网络?

反思总结

这次实验花费了很长时间在数据集的分析和处理上

包括年龄和资本收支的分箱、离散值归并,并且发现了测试集数据中income标签与训练集不同的问题。

决策树构建过程中花费了许多时间去查询pandas的批处理函数,如果之前有pandas库调用的基础会好很多。

决策树存储结构选用numpy是不太合适的,因为每一个节点的结构儿子个数是不定的,如果按照最多分支数来设置矩阵的列数会有很多空间是浪费的。使用list+dict保存每个节点的数据,用json文件存储读取应该会方便一些。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/169923.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百度文心一言4.0——使用及API测试

登录百度智能云&#xff1a;百度智能云 文心一言4.0使用 开通付费&#xff1a; 创建应用&#xff1a; 自行创建应用名称&#xff1a; 对话测试&#xff1a; API测试 ERNIE-Bot-4 API&#xff1a;ERNIE-Bot-4 打开链接查看自己的API Key&#xff0c;Secret Key。 可参…

Ivs+keepalived:高可用集群

Ivskeepalived:高可用集群 keepalived为lvs应运而生的高可用服务。lvs的调度器无法做高可用&#xff0c;keepalived这个软件就是为了实现调度器的高可用。 注意&#xff1a;keepalived不是专门为lvs集群服务的&#xff0c;也可以做其他代理服务器的高可用。 lvs的高可用集群&a…

CSS 两栏布局

目录 CSS两栏布局&#xff08;左列定宽&#xff0c;右列自适应宽&#xff09; 方法一&#xff1a;浮动margin 方法二&#xff1a;定位margin 方法三&#xff1a;浮动BFC 方法四&#xff1a;Flex布局 方法五&#xff1a;able布局 CSS两栏布局&#xff08;左列不定宽&#…

模拟计算器编程教程,中文编程开发语言工具编程实例

模拟计算器编程教程&#xff0c;中文编程开发语言工具编程实例 中文编程系统化教程&#xff0c;不需英语基础。学习链接 ​​​​​​https://edu.csdn.net/course/detail/39036 课程安排&#xff1a;初级1 1 初级概述 2 熟悉构件取值赋值 3 折叠式菜单滑动面板编程 4 自定…

万宾科技智能井盖传感器怎么使用?

时代在进步&#xff0c;科技在更新&#xff0c;人们身边的万事万物都在随着时代的脚步不断的前进。各种各样高科技技术在城市基础设施建设的过程中得到应用&#xff0c;很多智能产品不仅施工方便&#xff0c;而且可以向政府部门提供精准的数据&#xff0c;提高了相关管理人员的…

Django 地址接口开发

应用 Mixin 混合类进行收货地址接口开发 python ../manage.py startapp address继承了mixins扩展类&#xff0c;进到里面可以稍微看下源码 该方法帮我们实现了获取验证及保存的功能 address/views from rest_framework.generics import GenericAPIView from rest_framewo…

STM32:GPIO功能描述和工作方式

一、STM32控制原理概要 IO端口位的基本结构 在STM32有特定功能的内存单元&#xff0c;即"寄存器"。寄存器是程序与硬件电路通信的桥梁。寄存器按照每32位二进制0/1数据为一组。存储着芯片特定电路的相关信息。我们就是通过程序对寄存器中的数据进行修改&#xff0c;…

pycharm转移缓存目录

原来的缓存目录为C:\Users\86176\AppData\Local\JetBrains&#xff0c;各种配置文件、缓存文件随着pycharm的使用堆积在这里&#xff0c;导致C盘逐渐爆满。 因此需要将缓存目录转移至D盘。首先需要了解缓存目录的知识。 PyCharm 和其他 JetBrains 的 IDE 通常会有两个关键的目…

QSPI介绍

0 Preface/Foreword 1 QSPI介绍 硬件连接框图如下&#xff1a; QSPI接口的Display data format&#xff08;显示数据格式&#xff09; 包含以下几种&#xff1a; 16.7M colors RGB 8,8,8-bits input262K colors, RGB 6,6,6-bits input65K colors, RGB 5,6,5-bits input256 c…

Mac运行Docker报错

Mac运行Docker报错 &#x1f4d4; 千寻简笔记介绍 千寻简笔记已开源&#xff0c;Gitee与GitHub搜索chihiro-notes&#xff0c;包含笔记源文件.md&#xff0c;以及PDF版本方便阅读&#xff0c;且是用了精美主题&#xff0c;阅读体验更佳&#xff0c;如果文章对你有帮助请帮我点…

LabVIEW应用开发——控件的使用(四)

接上文&#xff0c;这篇介绍时间控件。 LabVIEW应用开发——控件的使用&#xff08;三&#xff09; 1、时间控件Time Stamp control 在日常软件开发场景中&#xff0c;时间也是一种常用的控件&#xff0c;用于表达当前时间的显示、对下设置时间、时间同步等等场景。LabVIEW专门…

Python实战小项目分享

Python实战小项目包括网络爬虫、数据分析和可视化、文本处理、图像处理、聊天机器人、任务管理工具、游戏开发和网络服务器等。这些项目提供了实际应用场景和问题解决思路&#xff0c;可以选择感兴趣的项目进行实践&#xff0c;加深对Python编程的理解和掌握。在实践过程中&…

数据与视图的完美契合:Vue响应式的交织魅力

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

水电站与数据可视化:洞察未来能源趋势的窗口

在信息时代的浪潮中&#xff0c;数据可视化正成为推动能源领域发展的重要工具。今天&#xff0c;我们将带您一起探索水电站与数据可视化的结合&#xff0c;如何成为洞察未来能源趋势的窗口。水电站作为传统能源领域的重要组成部分&#xff0c;它的运行与管理涉及大量的数据。然…

在行首,行尾添加文本,替换文本中的空格、制表符等

本文使用&#xff1a;notepad进行演示&#xff0c;其他编辑器有类似的功能也可使用。 替换文本中的空格、制表符 当我们在查看环境变量的时候&#xff0c;往往用肉眼去看这种格式的是相当痛苦的。 -DDATABASE_DRIVER_CLASS_NAMExxx -DDATABASE_URLxxx -DDATABASE_USERNAMExxx …

python网络爬虫实例

目录 1、访问百度 2、输入单词百度翻译 3、豆瓣电影排行榜 4、豆瓣电影top250 5、下载美女壁纸 1、访问百度 from urllib.request import urlopen url"http://www.baidu.com" respurlopen(url)with open("mybaidu.html",mode"w") as f:f.wr…

MSQL系列(八) Mysql实战-SQL存储引擎

Mysql实战-SQL存储引擎 前面我们讲解了索引的存储结构&#xff0c;BTree的索引结构&#xff0c;我们一般都知道Mysql的存储引擎有两种&#xff0c;MyISAM和InnoDB,今天我们来详细讲解下Mysql的存储引擎 文章目录 Mysql实战-SQL存储引擎1.存储引擎2.MyISAM的特点3. InnoDB的特…

JS中面向对象的程序设计

面向对象&#xff08;Object-Oriented&#xff0c;OO&#xff09;的语言有一个标志&#xff0c;那就是它们都有类的概念&#xff0c;而通过类可以创建任意多个具有相同属性和方法的对象。但在ECMAScript 中没有类的概念&#xff0c;因此它的对象也与基于类的语言中的对象有所不…

机器学习-模型评估与选择

文章目录 评估方法留出法交叉验证自助法 性能的衡量回归问题分类问题查准率、查全率与F1ROC与AUC 在机器学习中&#xff0c;我们通常面临两个主要问题&#xff1a;欠拟合和过拟合。欠拟合指模型无法在训练数据上获得足够低的误差&#xff0c;通常是因为模型太简单&#xff0c;无…

Java项目_家庭记账(简易版)

文章目录 简介代码实现 简介 该项目主要用来练习&#xff0c;Java的变量&#xff0c;运算符&#xff0c;分支结构和循环结构的知识点。 程序界面如下&#xff1a; 登记收入 登记支出 收支明细 程序退出 代码实现 package project;import java.util.Scanner;import sta…