1994年美国人口普查数据 分类预测与集成学习

news2024/12/26 10:59:21

       对于分类预测学习任务,从指定的数据源读取数据,对数据进行必要的处理,选取合适的特征,构造分类模型,确定一个人的年收入是否超过50K。

       数据来源:1994年美国人口普查数据库。数据存放在data目录中,其中,adult.data存放训练数据,adult.test存放测试数据。

     (下载地址:https://archive.ics.uci.edu/ml/datasets/Adult )

特征列介绍:

age:年龄,整数

workclass:工作性质,字符串,包含少数几种取值,例如:Private、State-gov等

education:教育程度,字符串,包含少数几种取值,例如:Bachelors、Masters等

education_num:受教育年限,整数

maritial_status:婚姻状况,字符串,包含少数几种取值,例如:Never-married、Divorced等

occupation:职业,字符串,包含少数几种取值,例如:Sales、Tech-Support等

relationship:亲戚关系,字符串,包含少数几种取值,例如:Husband、Wife等

race:种族,字符串,包含少数几种取值,例如:White、Black等

sex:性别,字符串,包含少数几种取值,例如:Female, Male

capital_gain:资本收益,浮点数

capital_loss:资本损失,浮点数

hours_per_week:每周工作小时数,浮点数

native_country:原籍,包含少数几种取值,例如:United-States, Mexico等

分类标签列:income  >50K   ≤50K

数据探查

熟悉数据,查看数据结构和数据分布情况

  • 读取数据文件,查看行列信息

行列信息结果:

  • 查看数值类型列的数据描述信息

对于数值类型的列,可以分别查看每列的基本统计信息,例如:数据个数、均值、标准差、极值、四分位数、中位数

  • 以可视化的方式查看数值类型的取值分布情况

在上一步骤中,capital_gain和capital_loss列的极小值、四分位数均为0,而极大值很大,这意味着其数据主要分布在0附近。可以通过分箱统计的方式查看数值分布情况。

直方统计图是很直观的查看数值分布的方法。下面的代码将所有数值分成20个区间,然后统计每个区间中的数据个数。

  • 查看文本类型列的取值

对于文本类型的列,观察文本的取值有哪些,unique函数用于提取出数据集合中的唯一值。

可以发现,某些列(例如:workclass, occupation,native_country等)包含'?'这样的字符,可视为缺失值。后续应处理此类缺失值;训练数据的wage_class包括两个值:<=50K 和 >50K 而测试数据的是:<=50K. 和 >50K. 后续应使二者统一。

  • 查看文本类型的取值分布情况

首先,对一个包含多个文本列名的列表text_columns使用一个for循环遍历这个列表。在循环中,使用plt.subplot()函数创建一个子图,将多个图形绘制到一个平面上。然后,提取train_data数据集中对应于当前文本列名的数据,并计算每个值的计数。

  • 观察某行数据及单个字段

上面的探查中,发现workclass字段的第一个字符为空格符,进一步可以发现,所有的文本字段第一个字符均为空格。为便于数据处理,后续应设法将多余的空格去除

  • 分析education取值与wage_class的对应数量关系

通过查看某个特征的若干种取值分别对应着多少个特定分类的样本,可以大致了解哪些取值在样本中比重较大,哪些取值比重较小。

可以看到,当education为Doctorate, Masters或Prof-school时,收入>50K的样本数要超过<=50K的数量;而其余取值则相反。这可能意味着,上述3种取值对于收入是否超过50K有较大影响。

pandas.crosstab是用于生成交叉表的函数。在数据分析中,交叉表(也称为列联表)是一种特殊的二维表格,用于汇总和分组两个或多个变量之间的数据。 pandas.crosstab可以接受多个数组,并将它们转换为交叉表。

数据清洗

  • 去除所有文本字段首尾的多余空格

train_data.dtypes属性记录了数据集中所有列的类型信息,包括列下标索引(index)及对应的类型名称,train_data.dtypes[index] 返回指定下标索引的列的类型。此处仅匹配类型为文本字符串(object)的列。

train_data[column_index].str.strip()用于将指定列数据转换成字符串,然后调用strip函数去除首尾空格

  • 统一分类标签

训练数据和测试数据的wage_class字段的值应统一,将测试数据集中的标签列更改成与训练数据集的一致,即:去掉原始标签值最后的"."号

  • 处理'?'字段

对于训练数据集,用'?'标记的字段,视为无效值,本例中直接移除含有无效值的样本行。

对于测试数据集,带'?'的数据,用出现次数最多的值(文本字段)填充。

pandas.replace是一个用于替换DataFrame或Series中特定值的函数。给定一个DataFrame或Series,可以使用replace方法将其中的某些值替换为其他值。

pandas.dropna是一个用于去除DataFrame或Series中空值的函数。给定一个DataFrame或Series,可以使用dropna方法从中移除包含缺失数据(NA或NaN)的行或列。

数据预处理 

  • 文本字段转换成数值字段的方法试验

workclass的取值是文本类型,但模型训练需要的特征必须是数值,因此需要转换

通过Categorical函数,可将文本转换成数值。相同的文本值被赋予相同的数值,并且从1,2,3...依次增长

pandas.Categorical是pandas库中的一个数据类型,用于表示具有有限数量的不同值的数据。它可以用于对离散数据进行处理和分析,例如将字符串、整数或其他数据类型转换为分类变量。通过将数据转换为Categorical对象,我们可以更有效地利用内存,同时提高分析效率,因为Categorical对象在内部使用整数编码来表示不同的分类变量。此外,Categorical对象还支持许多方便的方法,如排序、聚合和查找唯一值等。

下面是一个示例,展示如何使用pandas.Categorical将字符串列转换为分类变量:

在下面的示例中,我们首先创建了一个包含字符串的DataFrame,然后将其"fruits"列转换为Categorical对象。最后,我们打印了转换后的"fruits"列,可以看到它现在被存储为三个不同的类别:apple、banana和cherry。

  • 将所有文本列均转换成数值编码

将训练数据和测试数据合并起来进行编码。

模型训练

1. 准备工作

准备好训练特征数据集、标签数据集和测试特征数据集、标签数据集,预设超参数。

2.使用XGBoost模型训练,并且优选出最佳的模型参数

先固定learning_rate和subsample,以便优选另外两个超参数:max_depth, min_child_weight。

训练过程截图:

3. 计算模型性能

针对测试数据进行预测,分别计算每个类别的精确度、召回率和F1值

4. 再次调整超参数

在上述最优超参数{‘max_depth’: 3, ‘min_child_weight’: 5},条件下调整learning_rate, 以及subsample并选出最优超参数

5. 寻找最优的模型训练迭代停止时机

利用前述选定的最佳参数:{'max_depth': 3, 'min_child_weight': 5, 'learning_rate': 0.05, 'subsample': 0.8},构建最有XGBoost模型

XGBoost模型训练时,如果迭代次数过多会进入过拟合。表现就是随着迭代次数的增加,测试集上的测试误差开始下降;当开始过拟合或者过训练时,测试集上的测试误差开始上升,或者波动

通过设置early_stopping_rounds可指定停止训练的时机。当测试集上的误差在early_stopping_rounds轮迭代之内都没有降低的话,就停止训练

通过best_iteration属性可获得最佳的迭代次数

6. 计算最终模型的性能

特征分析

1. 查看各个特征之间的相关性

绘制数据集中每两个特征(列)之间的相关性热力图,可观察到sex和relationship的负相关性很强(黑色方格),education和education_num的正相关性也比较强(白色方格),因此可以各保留1个特征 * 去掉部分强相关特征后,对建模结果几乎们没有影响,但应该能减少计算量。

2. 去除强相关的冗余特征

本例中去除education_num,保留education特征;去除relationship,保留sex特征。

预测并计算性能:

3. 将age特征分箱处理

考虑到age(年龄)是连续的自然数值,在一定程度上,考虑年龄区间可能会比年龄值本身更有意义

numpy.digitize方法用于将数据集划分到指定的区间中,并重新赋给区间编号值

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

详细讲解Element UI 中丰富的表单控件(图文解析)

目录 前言1. 文本框、文本域2. 下拉框 (Select)3. 单选框 (Radio)4. 复选框 (Checkbox)5. 日期控件 (Date Picker)6. 图片上传 (Image Upload)7. 文件上传 (File Upload)8. 富文本控件 (Rich Text Editor) 前言 Element UI 一个基于 Vue.js 2.0 的桌面端组件库&#xff0c;提供…

数据库并发控制技术

1.数据库中为什么要采用并发控制&#xff1f;并发控制技术能保证事务的哪些特性&#xff1f; 因为多个事务的并发操作会对数据库产生影响&#xff0c;当多个事务同时访问一个数据时就会互相干扰。并发控制技术能保证事务的一致性&#xff0c;隔离性。一致性是指事务要么全部运…

如何恢复苹果手机数据?盘点3个实用恢复方法!

苹果手机数据丢失固然是一件很痛心的事&#xff0c;但是在这个信息发达的网络时代&#xff0c;想要恢复数据其实也并不复杂。只要用对方法&#xff0c;是有很大概率能够恢复的。那么针对iPhone用户来说&#xff0c;苹果数据恢复的方法是什么呢&#xff1f;下来让我们一起来看看…

GPT-4系列模型,在文档理解中的多维度评测

著名云数据平台Snowflake的研究人员发布了一篇论文&#xff0c;主要对OpenAI的GPT-4系列模型进行了研究&#xff0c;查看其文本生成、图像理解、文档摘要等能力。 在DocVQA、InfographicsVQA、SlideVQA和DUDE数据集上对GPT-4、GPT-4 V、GPT-4 Turbo V OCR等进行了多维度测试。…

【QT】

通信服务端实现 widget.h文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QTcpServer>//服务器类 #include <QMessageBox>//消息 #include <QTcpServer> #include <QList> #include <QTcpSocket> QT_BEGIN_NAMESPAC…

室内农场种植之新型LED照明技术的研究:AS7341光谱控制器

一、功能说明 单片机采用STC8H1K17型号&#xff0c;搭载51内核&#xff0c;配备OLED显示屏&#xff0c;用于展示波长与定时时间信息。设备支持手动与定时两种操作模式&#xff0c;定时时间范围设定为5至99秒之间。用户可通过按键实现手动模式与定时模式之间的切换。 在手动模…

EOS Black灵魂回响黑色联机需要加速吗 超好用的联机加速器推荐

灵魂回响黑色是一款全新的MMORPG游戏&#xff0c;游戏在提供沉浸感超强的剧情的同时&#xff0c;也带来了压倒性的游戏画质。同时&#xff0c;游戏的职业系统十分自由&#xff0c;从人物属性到装备属性、到技能搭配、甚至到职业都可以任意DIY&#xff0c;把角色养成发挥到了极致…

本地大模型服务 Ollama:从安装到使用

文章目录 前言一、下载安装1.1 官网安装1.2 压缩包安装1.3 docker 安装二、命令行使用2.1 常用命令2.2 模型列表2.3 使用三、Open-WebUI3.1 安装3.2 修改语言3.3 使用参考前言 Ollama 是专为在本地机器上便捷部署和运行大型语言模型(LLM)而设计的开源框架,它有如下几个特点…

【Kafka】Kafka生产者数据重复、数据有序、数据乱序-07

【Kafka】Kafka生产者数据重复、数据有序、数据乱序-07 1. 数据重复1.1 数据传递语义1.2 幂等性1.2.1 如何开启幂等性1.2.2 同一个消息&#xff0c;多个分区都会存在吗&#xff1f; 1.3 事务1.3.1 Kafka 事务原理1.3.2 Kafka事务的作用和意义作用具体应用场景 2. 数据有序3. 数…

LogicFlow 学习笔记——10. LogicFlow 进阶 边

我们可以基于 Vue 组件自定义边&#xff0c;可以在边上添加任何想要的 Vue 组件&#xff0c;甚至将原有的边通过样式隐藏&#xff0c;重新绘制。 如 Example3 中所示&#xff1a; 锚点 默认情况下&#xff0c;LogicFlow 只记录节点与节点的信息。但是在一些业务场景下&#…

易兆微电子_嵌入式软件工程师笔试题

易先电子 嵌入式软件工程师笔试题(十七) 1.关键字 extern是什么含义, 请举例说明。 修饰符extern用在变量或者函数的声明前&#xff0c;用来说明 “ 此变量 / 函数是在别处定义的&#xff0c;要在此处引用 ”。 //main.c #include <stdio.h>int main() {extern int num…

HTML播放flv

页面效果&#xff1a; 代码如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" …

Object类hashCode方法和equals方法源码

hashCode方法 顶级类Object里面的方法&#xff0c;所有类都是继承Object的&#xff0c;返回值int类型 根据一定的hash规则&#xff08;存储地址、字段、或者长度等&#xff09;&#xff0c;映射成一个数值&#xff0c;即散列值 public static int hashCode(Object a[]) {if (a…

windows系统下安装redis,并进行密码配置

一、windows系统下安装redis Redis&#xff08;Remote Dictionary Server &#xff0c;远程字典服务&#xff09; 是一个高性能的key-value数据格式的内存数据库&#xff0c;是NoSQL数据库。redis的出现主要是为了替代早起的Memcache缓存系统的。 内存型(数据存放在内存中)的非…

MPI并行计算关键点讲解及使用入门

MPI&#xff08;Message Passing Interface&#xff09;是并行计算领域的一个关键标准&#xff0c;它定义了一套用于在多个计算节点间进行高效消息传递和数据交换的通信协议和库。在高性能计算&#xff08;HPC&#xff09;领域&#xff0c;MPI尤为重要&#xff0c;特别是在处理…

Nuxt3 实战 (十一):添加路由 Transition 过渡效果和 Loading 动画

页面过渡效果 Nuxt3 利用 Vue 的 组件 在页面和布局之间应用过渡效果。 nuxt.config.ts 文件配置&#xff1a; export default defineNuxtConfig({app: {pageTransition: { name: page, mode: out-in }}, })在页面之间添加过渡效果&#xff0c;在 app.vue 文件中添加以下 CS…

opencv 打开图片后,cv::mat存入共享内存的代码,实现消费者与生产者模型。XSI信号量和POSIX 信号量

文章目录 基于 sys 系统信号量(XSI信号量)常用api参考 基于 POSIX 信号量有名信号量常用 api 无名信号量常用 api 参考 实践-基于POSIX有名信号量生产者消费者模型任务说明同步关系互斥关系 设置一个互斥信号量&#xff0c;实现对共享内存的互斥访问设置两个信号量&#xff0c;…

ESP32 矩阵键盘 4*3状态机

简洁高效的ESP32处理矩阵键盘代码… /**********矩阵键盘IO映射***************3(9) 1(8) 5(4)2(13)7(12)6(18)4(19)*************************************/ uint8_t Trg0,Cont0; void Key_Task(void) {uint8_t ReadData,ColumnData,RowData;pinMode(9,INPUT_PULLUP);pin…

[面试题]RabbitMQ

[面试题]Java【基础】[面试题]Java【虚拟机】[面试题]Java【并发】[面试题]Java【集合】[面试题]MySQL[面试题]Maven[面试题]Spring Boot[面试题]Spring Cloud[面试题]Spring MVC[面试题]Spring[面试题]MyBatis[面试题]Nginx[面试题]缓存[面试题]Redis[面试题]消息队列[面试题]…

候选键的确定方法-如何判断属性集U的子集K是否为候选键、如何找到关系模式的候选键

一、候选键的定义 在关系模式R(U,F)中&#xff0c;若&#xff0c;且K满足&#xff0c;则K为关系模式R的候选键 关系模式R的候选键必须满足以下两个条件&#xff1a; &#xff08;1&#xff09;必须是属性集U的子集 &#xff08;2&#xff09;完全函数决定属性集U 二、如何…