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

news/2024/11/8 14:56:56/

数据准备

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

百度网盘 请输入提取码

共包含三个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_graphvizwith 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.displaydisplay.max_columns = 12display.max_rows = 5display.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.ppmy.cn/news/77943.html

相关文章

姜春宇:数据治理五大发展趋势

4月27日在2023数据治理新实践峰会上,大数据技术标准推进委员会副主席姜春宇先生以《数据治理发展趋势》为主题为大家分享了数据的价值和最新发展趋势。 以下为姜春宇先生的演讲实录,为了方便阅读,小编做了一些字句修改和文本优化。 大家上午…

Python 用Redis简单实现分布式爬虫

分布式爬虫是指将一个爬虫程序在多个计算机上同时执行,并且这些计算机相互协调工作,同时抓取数据。相较于单机爬取,分布式爬虫可以极大地提高爬取效率和稳定性。 Redis是一个基于内存的NoSQL数据库,具有高性能、高并发、支持多种…

《计算机网络——自顶向下方法》精炼——3.5.1-3.5.4

人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定、冷静,学习如何从慌乱中找到生机。——席慕蓉 文章目录 TCPTCP协议概述报文段结构序号、确认号 超时问题计算RTT计算重传时间 可靠数据传输 TCP TCP协议概述 TCP是面向连接的协议,在…

数据库Mysql经典面试题之SQL语句

需要数据库表1.学生表 Student(SID,Sname,Sage,Ssex) --SID 学生编号,Sname 学生姓名,Sage 出生年月,Ssex 学生性别 2.课程表 Course(CID,Cname,TID) --CID --课程编号,Cname 课程名称,TID 教师编号 3.教师表 Teacher(TID,Tname) --TID 教师编号,Tname 教师姓名 4.…

转辙机介绍

简介 转辙机是指用以可靠地转换道岔位置,改变道岔开通方向,锁闭道岔尖轨,反映道岔位置的重要的信号基础设备,它可以很好地保证行车安全,提高运输效率,改善行车人员的劳动强度。 分类 01、转辙机按动作时…

韩流在元宇宙中崛起,感受韩国文化的魅力!

大获成功!第一波 K-verse 土地全部售罄! 多家领先韩国文化公司,包括 SMBM、CUBE 娱乐、LINE Studio、Gravity、乐天世界、K League 等进驻 The Sandbox,并在第一波 K-verse 土地销售活动上发布了邻近这些公司的 LAND。 所有土地全…

内容好但流量差?B站流量密码可能就在这

B站知名数码UP主老师好我叫何同学(以下简称“何同学”。)时隔两个月再次更新,这支标题为《为了找到流量密码,我们做了个假B站...》的视频不仅吸引了观众的围观,更是获得了众多B站UP主们的“声援”。 如题所见&#xf…

对象友元的概念及应用

友元入门友元的使用带有命名空间的函数声明类的前向声明friend直接修饰类的好处 友元特性友元重构(友元运算符重载)类重构全局重构友元重构 友元入门 友元friend 可以将一个函数或类进行friend修饰 修饰后的函数和类可以直接在外部访问调用本类的所有成…