头歌——机器学习——决策树案例

第1关:基于决策树模型的应用案例

任务描述

本关任务:使用决策树算法完成成人收入预测。

相关知识

为了完成本关任务,你需要掌握:1.数据特征处理,2.使用决策树算法完成成人收入预测。

数据处理及特征工程

本次任务我们将会使用成人数据集(来源于UCI数据集:UCI Machine Learning Repository ),该数据集从美国1994年人口普查数据库中抽取而来,共48842条数据,涉及到收入统计,因此也称作“人口普查收入”数据集。该数据集可以通过对属性变量包括年龄、工种、学历、职业等14种信息来判断年收入是否超过50k。
首先,我们来了解一下我们的数据,从而进一步明确任务,并作出针对性的分析。人口普查收入数据集是一个分类问题,目的是用来预测年收入是否超过50k$,对应我们所需要的标签,这在数据集中以“<=50K”和“>50K”来进行表示;除此之外,数据包含了用于判断该决定的相关信息,对应我们所需要的特征,这些特征一共有14个。特征与标签的表示如下:

  • age:年龄
  • workclass: 工作类别
  • fnlwgt: 序号
  • education: 受教育程度
  • education-num: 受教育时间
  • marital-status: 婚姻状况
  • occupation: 职业
  • relationship: 社会角色
  • race: 种族
  • sex: 性别
  • capital-gain: 资本收益
  • capital-loss: 资本支出
  • hours-per-week: 每周工作时间
  • native-country: 国籍
  • salary: 收入

我们可以通过以下代码,进行数据预览:

  • import numpy as np
  • import pandas as pd
  • import matplotlib.pyplot as plt
  • from matplotlib.pyplot import MultipleLocator
  • import seaborn as sns
  • data_path ='/data/bigfiles/7db918ff-d514-49ea-8f6b-ea968df742e9'
  • df = pd.read_csv(data_path,header=None,names=['age', 'workclass', 'fnlwgt', 'education', 'education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country','salary'])

对上述对数据的预览我们需要注意数据集中这样的几个问题:

  1. 字符型属性数据中是否存在缺失值,例如:‘unknow’
  2. 部分特征为字符串格式,无法放到模型训练,后期需要该字段需要进行离散型特征编码
  3. capital-gain capital-loss属性取值为0的占比75%以上考虑去除这两个属性

在分析出这些问题后我们使用代码逐步对数据进行处理:

  1. # 去除字符串数值前面的空格
  2. str_cols=[1,3,5,6,7,8,9,13,14]
  3. for col in str_cols:
  4. df.iloc[:,col]=df.iloc[:,col].map(lambda x: x.strip())
  5. # 去除capital-gain, capital-loss特征属性
  6. df.drop(['capital-gain','capital-loss'], axis=1, inplace=True)
  7. #查找字符型属性缺失情况
  8. for col in df.columns:
  9. if df[col].dtype == object:
  10. print("Percentage of \"unknown\" in %s:" %col ,df[df[col] == "unknown"][col].count(),"/",df[col].count())

经过这些过程,我们的数据处理便结束了,我们接下来使用处理后的数据进行决策树分类器训练和预测。

决策树分类器完成成人收入预测之训练

从上述的数据分析,我们可以得知我们所要解决的是一个二分类问题,由已知的特征来推断结果的取值(0或者1),根据上节决策树的相关知识,我们开始构建模型训练及预测。 sklearn做为一个强大机器学习工具,为我们提供了决策树的函数接口。不仅如此,我们还可以使用它进行训练集和测试集的划分。下面我们便使用该工具完成上述数据集的训练,来探究各特征与预测结果之间存在的内在联系。我们的训练过程将包含以下几个方面:

数据处理

训练测试集的划分,函数 sklearn.model_selection.train_test_split

模型训练函数
sklearn.tree.DecisionTreeClassifier

下面是部分关键代码:

import numpy as np

import pandas as pd

from sklearn.tree import DecisionTreeClassifier, export_graphviz # 导入决策树模型

from sklearn.model_selection import train_test_split # 导入数据集划分模块

import matplotlib.pyplot as plt

# 数据的读入与处理

# 去除fnlwgt, capital-gain, capital-loss,特征属性

df.drop(['fnlwgt','capital-gain','capital-loss'], axis=1, inplace=True)

# 将特征采用哑变量进行编码,字符型特征经过转化可以进行训练

features=pd.get_dummies(df.iloc[:,:-1])

# 将label编码

df['salary'] = df['salary'].replace(to_replace=['<=50K', '>50K'], value=[0, 1])

labels=df.loc[:,'salary']

# 使用train_test_split按4:1的比例划分训练和测试集

# 使用DecisionTreeClassifier构建模型

#对训练集X_train训练

决策树分类器完成成人收入预测之预测及评价

上述的训练过程中我们只能大概看出模型对训练结果的拟合程度,我们还需要使用一系列指标在测试集上进行模型的衡量。分类模型的一般评价有如下几种方式:

  1. 准确率acc
  2. 精准率pre
  3. 召回率recall
  4. f1-Score
  5. auc曲线

这几个指标可由混淆矩阵计算得到,我们先来看一下混淆矩阵的产生,它是由预测结果和标签值进行计算得到的,如下图所示:

,

下面我们使用混淆矩阵进行这几个指标的说明:

  1. 准确率:Accuracy = (TP+TN)/(TP+FN+FP+TN)
    解释:(预测正确)/(预测对的和不对的所有结果),即预测正确的比例。
    API:score()方法返回的就是模型的准确率

  2. 精确率:Precision = TP/(TP+FP)
    解释:预测结果为正例样本(TP+FP)中真实值为正例(TP)的比例。
    API:accuracy_score

  3. 召回率:Recall = TP/(TP+FN)
    解释:真正为正例的样本中预测结果为正例的比例。正样本有多少被找出来了(召回了多少)
    API:recall_score

  4. 综合精确率和召回率的指标 :f1-score:f1=2P∗R/(P+R) 解释:F1分数(F1-score)是分类问题的一个衡量指标 ,f1-score是精确率和召回率的调和平均数 ,最大为1,最小为0 。
    API:f1_score

  5. AUC:ROC曲线下的面积

    ,

解释:在理想情况下,最佳的分类器应该尽可能地处于左上角,这就意味着分类器在伪反例率(预测错的概率FPR = FP / (FP + TN))很低的同时获得了很高的真正例率(预测对的概率TPR = TP / (TP + FN))。也就是说ROC曲线围起来的面积越大越好,因为ROC曲线面积越大,则曲线上面的面积越小,则分类器越能停留在ROC曲线的左上角。
相关API接口:

from sklearn.metrics import roc_auc_score

# 概率值

y_pre = predict_proba(x_test)

# auc

auc=roc_auc_score(y_test,y_pre[:,1])

下面使用这几个指标进行模型性能评估的关键代码:

from sklearn.metrics import roc_auc_score

from sklearn.metrics import classification_report

#对于测试集x_test进行预测

x_pre_test=clf.predict(x_test)

# 其他指标计算

classification_report(y_test, x_pre_test)

# 预测测试集概率值

# 计算验证集的auc值,参数为预测值和概率估计

这样整个过程便结束了。

编程要求

根据提示,在右侧编辑器补充代码,实现使用决策树进行成人收入预测,包括:

数据处理

模型训练

模型预测

测试指标计算,并打印aou的值,函数:
print("auc的值:{}".format(auc))

测试说明

平台会对你编写的代码进行测试:

预期输出:

提示: 参照示例完成任务

第1关任务——代码题

import numpy as np
import pandas as pd
from sklearn.tree import DecisionTreeClassifier, export_graphviz # 导入决策树模型
from sklearn.model_selection import train_test_split  # 导入数据集划分模块
import matplotlib.pyplot as plt
from sklearn.metrics import roc_auc_score
from sklearn.metrics import classification_report# 数据的读入与处理
data_path ='/data/bigfiles/7db918ff-d514-49ea-8f6b-ea968df742e9'
df = pd.read_csv(data_path,header=None,names=['age', 'workclass', 'fnlwgt', 'education', 'education-num','marital-status','occupation','relationship','race','sex','capital-gain','capital-loss','hours-per-week','native-country','income'])# 去除字符串数值前面的空格
df = df.applymap(lambda x: x.strip() if isinstance(x, str) else x)# 去除fnlwgt, capital-gain, capital-loss,特征属性
df.drop(['fnlwgt','capital-gain','capital-loss'], axis=1, inplace=True)# 将特征采用哑变量进行编码,字符型特征经过转化可以进行训练
features=pd.get_dummies(df.iloc[:,:-1])# 将label编码
df['income'] = df['income'].map({'<=50K': 0, '>50K': 1})# 按4:1的比例划分训练和测试集
X_train, X_test, y_train, y_test = train_test_split(features, df['income'], test_size=0.2, random_state=1)# 构建模型
clf = DecisionTreeClassifier(criterion='entropy',max_depth=6,random_state=17)#对训练集X_train训练
clf.fit(X_train, y_train)#对于测试集x_test进行预测
x_pre_test = clf.predict(X_test)# 其他指标计算
print(classification_report(y_test, x_pre_test))# 预测测试集概率值
x_pre_test_proba = clf.predict_proba(X_test)[:, 1]#计算验证集的auc值,参数为预测值和概率估计
auc = roc_auc_score(y_test, x_pre_test_proba)
print("auc的值:{}".format(auc))

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

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

相关文章

2024最新特种设备(锅炉作业)题库分享。

1.锅炉蒸发量大小是由(  )决定的。 A.压力的高低 B.受压元件多少 C.受热面积大小 答案:C 2.哪项不是自然循环的故障?&#xff08; &#xff09; A.停滞 B.倒流 C.下降管带汽 D.上升管带汽 答案:D 3.水冷壁被现代大型锅炉广泛采用的是(  )。 A.光管水冷壁 B.膜…

【C++】继承(详解)

前言&#xff1a;今天我们正式的步入C进阶内容的学习了&#xff0c;当然了既然是进阶意味着学习难度的不断提升&#xff0c;各位一起努力呐。 &#x1f496; 博主CSDN主页:卫卫卫的个人主页 &#x1f49e; &#x1f449; 专栏分类:高质量&#xff23;学习 &#x1f448; &#…

RabbitMQ安装部署

简介 RabbitMQ一款知名的开源消息队列系统&#xff0c;为企业提供消息的发布、订阅、点对点传输等消息服务。 RabbitMQ在企业开发中十分常见&#xff0c;课程为大家演示快速搭建RabbitMQ环境。 安装 rabbitmq在yum仓库中的版本比较老&#xff0c;所以我们需要手动构建yum仓库…

# Kafka_深入探秘者(8):kafka 高级应用

Kafka_深入探秘者&#xff08;8&#xff09;&#xff1a;kafka 高级应用 一、kafka 消费组管理 1、kafka 命令行工具 参考官网: http://kafka.apache.org/22/documentation.html 2、kafka 消费组管理&#xff1a;查看消费组 # 切换到 kafka 安装目录 cd /usr/local/kafka/…

leetCode.91. 解码方法

leetCode.91. 解码方法 题目思路 题解 class Solution { public:int numDecodings(string s) {int n s.size();// dp 中f[0]一般不做使用&#xff0c;只是存一个初值1&#xff0c;表示默认由一种方案s s;vector<int> f( n 1 );f[0] 1;for ( int i 1; i < n;…

【数学】100332. 包含所有 1 的最小矩形面积 II

本文涉及知识点 数学 LeetCode100332. 包含所有 1 的最小矩形面积 II 给你一个二维 二进制 数组 grid。你需要找到 3 个 不重叠、面积 非零 、边在水平方向和竖直方向上的矩形&#xff0c;并且满足 grid 中所有的 1 都在这些矩形的内部。 返回这些矩形面积之和的 最小 可能值…

vant4的组件气泡弹出框van-popover,在列表中遍历后点击一个全部/显示隐藏,解决办法

环境&#xff1a;vue3 vant-ui4 <div v-for"(info, index) in item.infoListVOs" :key"index"><van-popoverv-model:show"showPopover":actions"actions"overlayplacement"bottom-end"select"onSelect(info…

软件工程全套学习培训资料,实际优质项目编制及各类建设方案,信息安全,运维资料

目的&#xff1a;规范系统开发流程&#xff0c;提高系统开发效率。 立项申请需求分析方案设计方案评审开发调整测试阶段系统培训试运行测试验收投入使用 所有文档过去进主页获取。 获取方式&#xff1a;本文末个人名片直接获取。 软件资料清单列表部分文档清单&#xff1a;工作…

AGI 远不止 ChatGPT!一文入门 AGI 通识及应用开发_通向agi之路网站使用什么开发的网站

AI 大语言模型进入爆发阶段 2022 年 12 月 ChatGPT 突然爆火&#xff0c;原因是其表现出来的智能化已经远远突破了我们的常规认知。虽然其呈现在使用者面前仅仅只是一个简单的对话问答形式&#xff0c;但是它的内容化水平非常强大&#xff0c;甚至在某些方面已经超过人类了&am…

程序的调试技术,设置断点

断点&#xff08;break point&#xff09;是指在代码中指定位置&#xff0c;当程序运行到此位置时变中断下来&#xff0c;并让开发者可查看此时各变量的值。因断点中断的程序并没有结束&#xff0c;可以选择继续执行。 在程序的调试过程中&#xff0c;设置断点是一个很有用的分…

可用的搜索引擎

presearchhttps://presearch.com/yandexhttps://ya.ru

书归正传,说说颍川士族

我的非遗项目是《颍川士族传说》&#xff0c;此前做的视频只是触及了边缘&#xff0c;属于气氛的营造&#xff0c;今后就正式转入主题了。 首先说说什么是士族&#xff0c;它有两个同义词&#xff1a;世族和势族。“世”是一代又一代的意思&#xff0c;“势”是权势&#xff0…

python中类的继承详解

面向对象编程 (OOP) 语言的一个主要功能就是“继承”。继承是指这样一种能力&#xff1a;它可以使用现有类的所有功能&#xff0c;并在无需重新编写原来的类的情况下对这些功能进行扩展 &#xff08;1&#xff09;在类的继承中&#xff0c;存在父类跟子类&#xff0c;子类可以继…

【项目实训】数据库内容丰富

经团队讨论&#xff0c;对前端页面展示数据进行了增加&#xff0c;于是相应的修改数据库 经团队成员使用大模型对各公司面试经验中问题的总结优化&#xff0c;我们打算将大模型的回答存储到数据库中&#xff0c;以显示在前端页面 于是在数据库中存储大模型的回答&#xff1a;…

三种三相交流电动机正反转互锁电路的分析

PLC和固态继电器应用都很普及了&#xff0c;常规电磁继电器还有用武之地吗?答案是&#xff1a;有用武之地的。因为微处理器的应用使逻辑控制发生了变革&#xff0c;极大地发挥了开关功能的特性&#xff0c;但在应用中&#xff0c;它还是无法承受较大的负载&#xff0c;因此还要…

Charles网络抓包工具安装和web抓包(一)

目录 概述 抓包工具对比 安装 下载 web抓包配置 按键说明 前言-与正文无关 ​ 生活远不止眼前的苦劳与奔波&#xff0c;它还充满了无数值得我们去体验和珍惜的美好事物。在这个快节奏的世界中&#xff0c;我们往往容易陷入工作的漩涡&#xff0c;忘记了停下脚步&#…

Unity开发者转UE 新手必读

前言 本页面为熟悉Unity的用户概述了 虚幻引擎(UE)。如果你具备一些Unity知识&#xff0c;而且想学习如何运用自己所学的知识在虚幻引擎中工作&#xff0c;下面各小节将帮助你入门。 下面的截图并排显示了Unity和虚幻编辑器。各个区域采用相同的颜色来表示相同的功能。每个区…

用友 U8+ 控制金额、单价等字段权限设置

进入路径 系统服务——权限——数据权限控制设置 本功能是数据权限设置的前提&#xff0c;用户可以根据需要先在数据权限控制设置中选择需要进行权限控制的对象。 数据权限的控制分为记录级和字段级两个层次&#xff0c;对应系统中的两个页签"记录级"和"字段…

LabVIEW在光学与光子学实验室中的应用

光学与光子学实验室致力于光学和光子学前沿领域的研究&#xff0c;涉及超快光学、非线性光学、光纤通信、光子晶体等多个方向。实验室需要高精度的实验控制和数据采集系统&#xff0c;以进行复杂的光学实验&#xff0c;并对实验数据进行实时处理和分析。 项目需求 实时控制与监…

Vue + SpringBoot 实现文件的断点上传、秒传,存储到Minio

一、前端 1. 计算文件的md5值 前端页面使用的elment-plus的el-upload组件。 <el-upload action"#" :multiple"true" :auto-upload"false" :on-change"handleChange" :show-file-list"false"><FileButton content&…