使用决策树模型Titanic数据集预测

news2024/11/15 17:26:37

数据准备

可以通过以下链接获取数据集:

百度网盘 请输入提取码

共包含三个csv文件:

《train.csv》训练数据集,包含特征信息和标签(是否幸存)

《test.csv》 测试数据集, 只包含特征信息

《gender_submission.csv》测试数据集的标签(是否幸存)

数据集各列含义如下:

  • PassengerId :ID
  • Pclass :舱位等级(分为1/2/3等)
  • Name : 姓名
  • Sex : 性别
  • Age : 年龄
  • SibSp : 堂兄弟/妹个数
  • Parch : 父母/小孩个数
  • Ticket : 船票信息
  • Fare :票价
  • Cabin : 客舱位置
  • Embarked : 登船港口

实验思路

数据处理——特征选择——模型构建——预测分析——可视化

1、导入数据集

import pandas as pd

# 首先导入数据
train = pd.read_csv("train.csv")
test_x = pd.read_csv("test.csv")
test_y = pd.read_csv("gender_submission.csv")

print(train.info()) # 打印数据,查看是否有缺失值

我们需要使用train来训练模型,使用test_x和test_y来测试模型的效果

然后可以通过info方法来查看数据结构信息:

可以看到,一共有891条数据,其中属性Age、Cabin、Embarked是有空白值的,因此我们需要对这些空白值进行处理;

2、缺省值处理

在进行缺省值处理的时候,我们首先需要确定要用哪些特征来构建决策树;

通过直观感受可以判断,生存概率应该与年龄、性别、船舱位置有关

其余的特征好像无法与生存概率有较为直观的联系

接下来,通过上面数据结构的分析,年龄和船舱位置都有部分空白值,尤其是船舱位置,有着大面积的空白

所以我们需要想办法对这些缺省值进行处理(删除/填充)

通过上图对于Cabin这一列数据的分析,可以看到,Cabin的值没有分布规律,且信息缺失尤其严重,不易处理,因此我们选择放弃这一属性;而对于Age属性,可以选择使用中位数或者平均数进行填充:

# 填充缺失值
# Cabin信息缺失太严重,不作为特征,因此不填充
# Age需要作为特征值,采用平均值进行填充
train.Age.fillna(train.Age.mean(),inplace=True)
test_x.Age.fillna(test_x.Age.mean(),inplace=True)

# 使用mean()方法计算均值;如需使用中位数,可以使用median()方法

数据填充使用fillna()方法,具体用法:fillna(填充值,inplace=True)

其中inplace=True表示直接修改原始数据框,如果为False则不修改原始数据框,而是返回一个新的数据框;

对于fillna函数,还有以下多种用法,这里不再赘述:

3、特征选取

根据上面的分析,我们最终选取了Age和Sex作为特征;

但是Sex的值是分类变量,无法使用决策树进行处理,所以需要先转化为数字标签

具体的转化使用LabelEncoder()方法

LabelEncoder是sklearn中一种用于将分类变量转换为数字标签的工具。它可以将一个类别字符串(如“狗”、“猫”、“鸟”等)映射到一个整数标签(如0、1、2等),从而方便地进行数据处理和分析

from sklearn.preprocessing import LabelEncoder

# 选取特征
# 选用 Sex Age 作为特征
# 将Sex进行编码处理:使用LabelEncoder将分类变量映射为数字标签
le=LabelEncoder()
train['Sex']=le.fit_transform(train['Sex']) # 男性为1 女性为0
test_x['Sex'] = le.fit_transform(test_x['Sex'])

具体使用的是fit_transform()方法;该方法时fit()方法和transform()方法的组合,首先使用 fit() 方法将 LabelEncode 对象拟合到输入数据集中,得到一个转换矩阵。然后,使用 transform() 方法将该转换矩阵应用于输入数据集,得到转换后的结果

4、构建决策树

from sklearn.tree import DecisionTreeClassifier

# 构建决策树
features = ['Sex','Age']
x_train = train[features]
y_train = train['Survived']
x_test = test_x[features]
y_test = test_y['Survived']

clf = DecisionTreeClassifier(criterion='entropy',splitter='best')

使用DecisionTreeClassifier来构建决策树

相关参数设置可以参考官网:

sklearn.tree.DecisionTreeClassifier — scikit-learn 1.2.2 documentation

我在这里仅设置了criterion和splitter:

  • criterion(分类器准测){“gini”, “entropy”, “log_loss”}, default=”gini”

这里选择entropy,通过计算信息增益来选取优先用于分类的属性;具体来说

  • splitter{“best”, “random”}, default=”best”

用于在每个节点上选择分割的策略,这里选用best,在特征的所有划分点中找出最优的划分点

5、模型训练

clf.fit(x_train,y_train) # 训练模型

clf.predict(x_test)

score = clf.score(x_test,y_test)
print(score)

最终的结果是

可以看到模型的准确率达到了86%左右

6、可视化

from sklearn.tree import export_graphviz

with open('Titanic.dot','w')as f:
    f=export_graphviz(clf,feature_names=['Sex','Age'],out_file=f)

将生成的决策树保存为.dot类型的文件

我们可以下载专门的graphviz软件来生成图片,下载链接如下:

Download | Graphviz

或者直接从百度网盘获取也可:

百度网盘 请输入提取码

最终生成的图片如下:

实验源码

最后将完整代码总结如下:

import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.tree import DecisionTreeClassifier,export_graphviz

# 打印完整的train数据
def display_options():
    display = pd.options.display
    display.max_columns = 12
    display.max_rows = 5
    display.width = 1000
display_options()

# 首先导入数据
train = pd.read_csv("train.csv")
test_x = pd.read_csv("test.csv")
test_y = pd.read_csv("gender_submission.csv")
print(train.info()) # 打印数据,查看是否有缺失值

# 填充缺失值
# Cabin信息缺失太严重,不作为特征,因此不填充
# Age需要作为特征值,采用平均值进行填充
train.Age.fillna(train.Age.mean(),inplace=True)
test_x.Age.fillna(test_x.Age.mean(),inplace=True)

# 选取特征
# 选用 Sex Age 作为特征
# 将Sex进行编码处理:使用LabelEncoder将分类变量映射为数字标签
le=LabelEncoder()
train['Sex']=le.fit_transform(train['Sex']) # 男性为1 女性为0
test_x['Sex'] = le.fit_transform(test_x['Sex'])


# 构建决策树
features = ['Sex','Age']
x_train = train[features]
y_train = train['Survived']
x_test = test_x[features]
y_test = test_y['Survived']

clf = DecisionTreeClassifier(criterion='entropy',splitter='best')
clf.fit(x_train,y_train) # 训练模型

clf.predict(x_test)

score = clf.score(x_test,y_test)
print(score)

# # 决策树可视化
with open('Titanic.dot','w')as f:
    f=export_graphviz(clf,feature_names=['Sex','Age'],out_file=f)

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

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

相关文章

远程FTP连接等

R1: <R1>ftp 192.168.2.100 用户名&#xff1a;1 密码&#xff1a;1 [R1-ftp]dir //查看当前FTP服务器中的文件列表 ..................... shengji.txt //复制想要下载的文件名 [R1-ftp]get 文件名 //下载相应的文件 [R1-ftp]q //返回R1设备 <R1>di…

观察级水下机器人使用系列之一系统构成

我们单位最近购买了一台观察级水下机器人&#xff08;ROV&#xff09;&#xff0c;型号为Seatronics Valor&#xff0c;工作最大水深300m。Valor ROV是一个计算机控制的电动ROV系统&#xff0c;使用Greensea Systems公司的OPENSEA控制系统。该系统需要一个三相电源380V输入&…

Model-Free TD Control: Sarsa

import time import random # 相对于Q 效果会差一些 class Env():def __init__(self, length, height):# define the height and length of the mapself.length lengthself.height height# define the agents start positionself.x 0self.y 0def render(self, frames50):fo…

二、go语言的编码规范

编码规范 一、 命名规范 Go在命名时以字母a到Z或a到Z或下划线开头&#xff0c;后面跟着零或更多的字母、下划线和数字(0到9)。Go不允许在命名时中使用、$和%等标点符号。Go是一种区分大小写的编程语言。因此&#xff0c;Manpower和manpower是两个不同的命名。 当命名&#xf…

华为OD机试真题 Java 实现【组装新的数组】【2023Q1 200分】

一、题目描述 给你一个整数M和数组N,N中的元素为连续整数&#xff0c;要求根据N中的元素组装成新的数组R。 组装规则&#xff1a; R中元素总和加起来等于M&#xff1b;R中的元素可以从N中重复选取&#xff1b;R中的元素最多只能有1个不在N中&#xff0c;且比N中的数字都要小…

如何设置工业设备的振动监测阈值

工业设备的振动阈值设置是确保设备正常运行和及时维护的关键步骤。本文将介绍一些常见的方法和策略&#xff0c;帮助您正确设置工业设备的振动阈值。 1. ISO 10816 振动烈度表格&#xff1a; ISO 10816 是一项国际标准&#xff0c;提供了设备振动水平的参考值。该标准将设备按…

【SpringMVC源码三千问】@RequstMapping和RequestCondition

RequestMapping 是 SpringMVC 中最常用的定义请求映射关系的注解。 下面我们来分析一下它的源码。 RequestMapping 先看下 RequestMapping 的定义&#xff1a; Target({ElementType.TYPE, ElementType.METHOD}) Retention(RetentionPolicy.RUNTIME) Documented Mapping publ…

day4 - 使用图像绘制动态时钟

本期的主要内容是利用OpenCV中包含的绘图函数&#xff0c;例如绘制线段、绘制矩形、绘制圆形等来绘制一个动态时钟的表盘。 完成本期内容&#xff0c;你可以&#xff1a; 掌握OpenCV常见的绘图函数 学会使用绘图函数绘制简单的图像 若要运行案例代码&#xff0c;你需要有&a…

linux——搭建NTP服务器

1、设置服务器时区 &#xff08;使用外部NTP时间源可不设置&#xff09; 在Linux系统中设置时区可以使用以下命令&#xff1a; 查看当前时区&#xff1a; timedatectl列出所有可用时区&#xff1a; timedatectl list-timezones设置时区&#xff1a; sudo timedatectl set-…

一、尚医通手机登录

文章目录 一、登录需求1、登录效果2、登录需求 二、登录1&#xff0c;搭建service-user模块1.1 搭建service-user模块1.2 修改配置1.3 启动类1.4 配置网关 2、添加用户基础类2.1 添加model2.2 添加Mapper2.3 添加service接口及实现类2.4 添加controller 3、登录api接口3.1 添加…

OpenAI再出新作,AIGC时代,3D建模师的饭碗危险了!

大家好&#xff0c;我是千与千寻&#xff0c;也可以叫我千寻哥&#xff0c;说起来&#xff0c;自从ChatGPT发布之后&#xff0c;我就开始焦虑&#xff0c;担心自己程序员的饭碗会不会哪天就被AIGC取代了。 有人说我是过度焦虑了&#xff0c;但是我总觉有点危机感肯定没有坏处。…

分布式事务解决方案-Seata

分布式事务解决方案-Seata 1.分布式事务问题1.1.本地事务1.2.分布式事务1.3.演示分布式事务问题 2.理论基础2.1.CAP定理2.1.1.一致性2.1.2.可用性2.1.3.分区容错2.1.4.矛盾 2.2.BASE理论2.3.解决分布式事务的思路 3.初识Seata3.1.Seata的架构3.2.部署TC服务3.3.微服务集成Seata…

C++ string类 迭代器 范围for

string类 在C语言当中 &#xff0c;也有字符串&#xff0c;它是以 " \0 " 结尾 的 一些字符的集合&#xff0c;在C的标准库当中还有一些 用于操作 str 类型的库函数&#xff0c;但是&#xff0c;这些函数的功能不是很全面&#xff0c;而且这些操作函数和 str 类型是分…

B2B企业需要什么样的客户体验管理?销售易出手了

导读&#xff1a;如何将类似B2C领域的私域体验延展到B2B领域&#xff1f; “不愿在顾客上花时间带来的结果只有一个&#xff0c;那就是让客户转而寻找值得他们花时间的消费体验。”2012年问世的《体验经济》一书&#xff0c;一语道破客户体验的重要性。 过去&#xff0c;提到体…

PG安装使用walminer插件教程

一、下载源码 https://gitee.com/movead/XLogMiner/tree/walminer_3.0_stable/ 二、编译安装插件 克隆下载源码后&#xff0c;将walminer目录放进pg下的contrib目录中 cd /home/postgres/postgresql-15.3/contrib/将walminer源码目录放进此路径下&#xff0c;进入walminer目…

卷麻了,公司新来的00后测试用例写的比我还好,简直无地自容......

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 如何编写测试用例&#xff1f; 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很是头疼&#xff0c;无法…

STM32寄存器映射

1. 寄存器基本原理 寄存器是单片机内部一种特殊的内存&#xff0c;可以实现对单片机各个功能的控制&#xff0c;我们编写程序最终就是去控制寄存器 下面的举例平台为STM32F407ZG 1.1 STM32寄存器分类 大类小类说明 内核寄存器 内核相关寄存器 包含R0~R15、xPSR、特殊功能寄…

《幸福关系的7段旅程》

关于作者 本书作者安德鲁∙马歇尔&#xff0c;英国顶尖婚姻咨询机构RELATE的资深专家&#xff0c;拥有 30年丰富的咨询经验&#xff0c;并为《泰晤士报》《观察家》和《星期日快报》撰写专栏文章。已出版19部作品&#xff0c;并被翻译成20种语言。 关于本书 《幸福关系的7段…

SQL查询比较慢,如何进行排查?如何进行SQL优化?

目录 一、开启慢查询日志 二、SQL优化 三、总结 一、开启慢查询日志 SQL慢查询是指执行时间较长的SQL语句&#xff0c;可能导致系统性能下降和响应时间延长。通过以下步骤可以开启慢查询日志记录&#xff1a; #查询是否开启慢查询日志 slow_query_log显示ON说明已开启&#…

广和通携手有人物联网完成5G SUL辅助上行功能验证

近日&#xff0c;广和通5G模组FM650-CN已在商用网络中实现5G SUL上行能力增强&#xff0c;助力有人物联网工业路由器在仿真网络环境中完成SUL辅助上行功能的验证。本次验证成功&#xff0c;意味着FM650-CN已具备SUL辅助上行商用能力&#xff0c;有利于推动更多5G终端支持SUL特性…