逻辑回归预测泰坦尼克号乘客生存率

news2025/2/26 9:27:22

逻辑回归预测泰坦尼克号乘客生存率

描述

RMS泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并导致了更好的船舶安全规定。

造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些运气因素,但有些人比其他人更容易生存,比如女人,孩子和上流社会。

在这个挑战中,我们要完成对哪些人可能存活的分析。特别是,我们要运用机器学习工具来预测哪些乘客幸免于悲剧。

本任务将采用机器学习算法逻辑回归来实现泰坦尼克号乘客生存率的预测,任务包含数据获取,数据分析,缺失数据处理,特征工程,拆分数据集,建立模型,预测,模型评估等。

源码下载

环境

  • 操作系统:Windows 10

  • 工具软件:Anaconda3 2019、Python3.6、Jupyter Notebook

  • 硬件环境:无特殊要求

  • 依赖库列表

    scikit-learn	0.24.2
    

分析

《逻辑回归预测泰坦尼克号乘客生存率》涉及以下环节:

请添加图片描述

实施

1、明确目标

数据分析的目的取决于项目需求,脱离了实际项目需求的数据分析就是无源之水,所以第一步就是明确分析的目标是什么。

本次项目是著名的泰坦尼克号沉船事件,这里想知道影响沉船生存率的因素是什么,并且预测乘客的的生存率。

2、数据分析

2.1 数据获取

可以从项目官网下载泰坦尼克号乘客数据集:https://www.kaggle.com/c/titanic/data

训练集数据为:train.csv 测试集数据为:test.csv

本任务已经提供数据集,无需重复下载。

2.2 数据导入

打开Jupyter Notebook,创建文件“逻辑回归预测泰坦尼克号乘客生存率.ipynb”,将下载的数据集文件放在和代码相同目录,输入如下代码,导入数据:

import pandas as pd # 导入pandas库
import numpy as np  # 导入numpy库

df_titanic = pd.read_csv('../dataset/train.csv')  # 读取文件
print("训练集数据:", df_titanic.shape)   # 查看训练数据集行列数
df_titanic.head()                      # 显示前5行数据

实验结果:

请添加图片描述

各数据字段含义:

  • PassengerId:乘客唯一识别id
  • Survived:是否存活,0为否,1为是
  • Pclass:船舱等级,1、2、3等
  • Name:姓名
  • Sex:性别
  • Age:年龄
  • SibSp:和该乘客一起旅行的兄弟姐妹和配偶的数量
  • Parch:和该乘客一起旅行的父母和孩子的数量
  • Ticket:船票号
  • Fare:船票价格
  • Cabin:船舱号
  • Embarked:登船港口 S=英国南安普顿Southampton(起航点) C=法国 瑟堡市Cherbourg(途经点) Q=爱尔兰 昆士Queenstown(途经点)

2.3 查看数据信息

# 缺失值查询
df_titanic.isnull().sum()

输出结果:

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

可以看到Age有177个缺失值,Cabin有687个缺失值,Embarked有2个缺失值。

3、特征工程

特征工程是机器学习中不可或缺的一部分,在机器学习领域中占有非常重要的地位。特征工程,是指用一系列工程化的方式从原始数据中筛选出更好的数据特征,以提升模型的训练效果。业内有一句广为流传的话是:数据和特征决定了机器学习的上限,而模型和算法是在逼近这个上限而已。由此可见,好的数据和特征是模型和算法发挥更大的作用的前提。特征工程通常包括数据预处理、特征选择、降维等环节。如下图所示:

请添加图片描述

3.1 数据清洗

Age缺失值较多,我们可以用均值去填充Age的缺失值,Embarked为分类型数据,一般用众数填充。这里对Cabin不做处理,因为Cabin是对模型训练影响较小的数据特征,我们可以忽略这个特征的存在,后面的操作中,需要将这些不相关特征剔除掉。Age均值数据填充代码如下:

df_titanic['Age'] = df_titanic['Age'].fillna(df_titanic['Age'].mean())  # 使用均值数据填充年龄特征
df_titanic.isnull().sum()

实验结果:

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64

可以看到年龄特征已经没有空字段了。

寻找Embarked特征众数:

df_titanic['Embarked'].value_counts()  # 寻找众数

实验结果:

S    644
C    168
Q     77
Name: Embarked, dtype: int64

实验证明,S为众数,我们用S将缺失值填充:

df_titanic['Embarked'] = df_titanic['Embarked'].fillna('S')  # 用众数填充缺失值
df_titanic.isnull().sum()    # 缺失值查询

实验结果:

PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         0
dtype: int64

Age和Embarked特征的缺失值已经被填充。同学可以试着用填充Embarked同样的方式去填充Cabin特征。

3.2 特征提取

将Sex特征和Embarked特征转换为哑特征,然后显示数据:

# 把类别型变量转换为哑变量
a = pd.get_dummies(df_titanic['Sex'], prefix = "Sex")
b = pd.get_dummies(df_titanic['Embarked'], prefix = "Em")
# 把哑变量添加进dataframe
frames = [df_titanic, a, b]
df_titanic = pd.concat(frames, axis = 1)
df_titanic = df_titanic.drop(columns = ['Sex', 'Embarked'])
df_titanic.head() # 显示新的dataframe

实验结果:

请添加图片描述

3.3 特征选择

将不相关的特征从数据集中剔除:

X = df_titanic.drop(['Survived','Name','Ticket','Cabin'], axis=1) # 拿掉比较不相关的字段,构建特征集
y = df_titanic.Survived.values # 构建标签集
y = y.reshape(-1,1) # -1是相对索引,等价于len(y)
X.head()  # 显示特征数据的前五行

实验结果:
请添加图片描述

3.4 拆分数据集

将训练集数据拆分为训练集和测试集,按照8:2的比例拆分,80%的数据用来对模型进行训练,20%的数据用来对模型进行评估:

from sklearn.model_selection import train_test_split    # 导入拆分数据集的模块
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size = 0.2)    # 将数据集拆分为8:2
print("X_train", X_train.shape)     # 显示训练集行列数
print("X_test", X_test.shape)       # 显示测试集行列数

实验结果:

X_train (712, 11)
X_test (179, 11)

接口说明:

X_train, X_test, y_train, y_test=sklearn.model_selection.train_test_split(train_data,
train_target,
test_size=0.4,
random_state=0,
stratify=y_train)

  • train_data:所要划分的样本特征集

  • train_target:所要划分的样本结果

  • test_size:样本占比,如果是整数的话就是样本的数量,默认为0.25

  • random_state:是随机数的种子。在需要重复试验的时候,保证得到一组一样的随机数。比如每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。(参考代码)

  • 返回值:X_train - 训练集特征集,X_test - 训练集标签,y_train - 测试集特征,y_test - 测试集标签

3.5 数据标准化

数据标准化是通过对原始数据进行变换把数据变换到均值为0,方差为1范围内。其数学表示如下:

请添加图片描述

mean为平均值,σ为标准差。由于标准化基于均值,所以受异常值影响较小。本实验我们采用sklearn.preprocessing中的StandardScaler,对数据进行标准化:

from sklearn.preprocessing import StandardScaler # 导入标准化模块

scaler = StandardScaler() # 选择标准化数据缩放器
X_train = scaler.fit_transform(X_train) # 特征标准化 训练集fit_transform
X_test = scaler.transform(X_test) # 特征标准化 测试集transform

4、模型构建

构建逻辑回归模型的接口为LogisticRegression(),包含在sklearn.linear_model模块中。创建完逻辑回归模型,可以直接使用fit()接口对模型进行训练。

4.1 构建模型

使用LogisticRegression()接口创建逻辑回归模型:

from sklearn.linear_model import LogisticRegression #导入逻辑回归模型

lr = LogisticRegression() # lr,就代表是逻辑回归模型

4.2 模型训练

使用fit()接口对模型进行训练,接口参数为训练集特征X_train和测试集标签y_train:

lr.fit(X_train,y_train) # fit,就相当于是梯度下降

5、模型评估

模型的评估采用从训练集中拆分出来的测试集来进行测试,用训练好的模型对测试集特征X_test进行预测,预测结果与测试集真实标签y_test进行比对,从而得出模型准确率。

5.1 模型评估

通过lr模型的score()接口对模型进行准确率的计算,接口参数为测试集特征X_test和测试集真实标签y_test。

score = lr.score(X_test,y_test)       # 计算准确率
print("SK-learn逻辑回归测试准确率 {:.2f}%".format(score*100))    # 打印结果

实验结果:

SK-learn逻辑回归测试准确率 77.09%

模型训练的准确率为77.09%。

5.2 数据预测

将test.csv中的数据导入,按照训练集数据预处理的方式对预测数据进行缺失值填充,标准化,然后通过训练好的模型进行预测。

读入预测数据

# 读入预测数据
df_titanic_test = pd.read_csv('../dataset/test.csv') # 读取文件
print("预测集数据:", df_titanic_test.shape)
df_titanic_test.head() # 显示前5行数据

实验结果:

请添加图片描述

预测数据为11个特征,里面没有标签(是否生存)。

查询缺失值

# 缺失值查询

df_titanic_test.isnull().sum()

实验结果:

PassengerId      0
Pclass           0
Name             0
Sex              0
Age             86
SibSp            0
Parch            0
Ticket           0
Fare             1
Cabin          327
Embarked         0
dtype: int64

其中Age、Cabin和Fare有缺失值,我们仍然只对Age和Fare做填充,一般情况,Age和Fare用均值填充:

# 用均值填充Age和Fare
df_titanic_test['Age']=df_titanic_test['Age'].fillna(df_titanic_test['Age'].mean())
df_titanic_test['Fare']=df_titanic_test['Fare'].fillna(df_titanic_test['Fare'].mean())
df_titanic_test.isnull().sum()

实验结果:

PassengerId      0
Pclass           0
Name             0
Sex              0
Age              0
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          327
Embarked         0
dtype: int64

填充完成。

将Sex和Embarked特征变为哑变量

# 把类别型变量转换为哑变量
a = pd.get_dummies(df_titanic_test['Sex'], prefix = "Sex")
b = pd.get_dummies(df_titanic_test['Embarked'], prefix = "Em")
# 把哑变量添加进dataframe
frames = [df_titanic_test, a, b]
df_titanic_test = pd.concat(frames, axis = 1)
df_titanic_test = df_titanic_test.drop(columns = ['Sex', 'Embarked'])
df_titanic_test.head() # 显示新的dataframe

实验结果:

请添加图片描述

剔除不相关特征

df_titanic_test = df_titanic_test.drop(['Name','Ticket','Cabin'], axis=1) # 拿掉比较不相关的字段,构建特征集
df_titanic_test.head()  # 显示特征数据的前五行

实验结果:

请添加图片描述

数据标准化

df_titanic_test = scaler.transform(df_titanic_test) # 特征标准化 测试集transform

数据预测

pred_titanic_test = lr.predict(df_titanic_test)  # 用lr模型对预测数据进行预测
print(pred_titanic_test)

实验结果:

[0 0 0 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 1 0 0 1 1 1 0 1 0 0 0 0 0 1 1 1 0 1
 1 0 0 0 1 0 1 1 0 1 0 1 1 1 0 1 1 0 0 0 0 0 1 0 0 0 1 1 1 1 0 1 1 1 0 1 1
 1 1 0 1 0 1 0 0 0 0 0 0 1 1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 0 0 1 0 0 0 0 0 0
 1 1 1 1 0 0 1 1 1 1 0 1 0 0 1 0 1 0 0 0 0 1 0 0 0 0 0 1 0 0 1 0 0 0 0 1 0
 1 0 1 0 0 1 0 0 1 1 0 1 1 0 1 0 0 1 0 0 1 1 0 0 0 0 0 1 1 0 1 1 0 1 1 0 1
 0 1 0 0 0 0 1 0 0 0 0 1 1 0 1 1 0 1 1 0 1 1 0 1 0 0 0 0 1 0 0 1 0 1 0 1 0
 1 0 1 1 0 1 0 0 0 1 0 0 1 0 0 0 1 1 1 1 0 0 0 0 1 0 1 1 1 0 1 0 0 0 0 0 1
 0 0 0 1 1 0 0 1 0 1 0 1 0 1 1 0 1 0 0 0 0 1 0 1 1 1 0 0 1 0 0 1 1 0 0 0 0
 1 0 1 0 0 0 0 0 1 1 0 0 0 0 0 0 0 1 1 1 0 0 0 0 0 0 0 1 1 0 1 1 0 0 1 1 0
 1 0 1 0 0 0 0 0 0 0 1 0 1 0 1 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 1 0 0 1 1 0
 0 1 0 0 1 1 1 0 0 0 0 0 1 1 0 1 0 0 0 0 1 1 0 0 0 1 0 1 0 0 1 0 1 1 0 0 0
 0 1 1 1 1 1 0 1 0 0 0]

计算生存率

survival_rate = pred_titanic_test.tolist().count(1)/len(pred_titanic_test.tolist())  # tolist()是将ndarray类型转换为list类型
print("泰坦尼克号乘客生存率为: {:.2f}%".format(survival_rate*100))    # 打印结果

实验结果:

泰坦尼克号乘客生存率为: 36.12%

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

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

相关文章

Segment Anything文章要点

核心方法: 1. 数据 Unfortunately, there is no web-scale data source for segmentation; to address this, we build a “data engine” 没有大规模的数据源用于分割; 为了解决这个问题,我们构建了一个“数据引擎” We iterate between using our efficient mo…

SpringBoot整合MongoDB

参考链接 https://www.mongodb.org.cn/ 文章目录一、前言1.1 NoSQL介绍1.1.1 NoSQL 数据库分类1.1.2 NoSQL的优点/缺点1.1.3 BASE1.2 MongoDB介绍1.2.1 MongoDB和SQL对比1.2.2 数据库1.2.3 元数据1.2.4 MongoDB 数据类型二、SpringBoot整合MongDB2.1 环境配置2.2 MongoTemplate…

chatGPT如何助力devops

随着软件开发行业的不断发展,DevOps已成为软件开发的主流方法。DevOps是一种将开发和运维工作结合起来的实践,旨在提高软件交付速度和质量,以及优化整个软件开发过程。最近,聊天机器人技术的崛起为DevOps带来了全新的变革&#xf…

【MySQL】(1)数据库基础,库与表的增删查改,数据库的备份与还原

文章目录服务器,数据库,表关系MySQL 数据存储逻辑SQL 分类存储引擎库的操作查看数据库创建数据库查看创建语句删除数据库选择(切换)数据库查看当前选择的数据库修改数据库字符集和排序规则表的操作创建表查询表查询表结构插入数据…

2、Git使用不完全指南:Git客户端的使用及使用Token认证方式提交代码详解(详细图文)

本篇介绍如何在Windows、Linux下安装Git客户端以及从远程代码仓库拉取代码。以及介绍2023如何从GitHub上获取Token令牌、使用Pycharm通过Token令牌从本地push上传仓库的方法,用来解决推送代码报Push failed The requested URL returned error:403的错误问题。 安装…

通讯录的实现(初级版本)

思维导图: 目录 思维导图: ​编辑 一,实现通讯录的第一步——实现逻辑 二,头文件内实现的内容 三,contect.c文件内的函数定义 3.1初始化通讯录:void InitContect(cotect*pc) 3.2:实现通讯录内容的增加&#xff…

投稿指南【NO.14】SCI期刊推荐(mdpi旗下)

写在前面:SCI论文发表是我国高校机构与基地评估、成果评奖、项目立项、人才培养等方面的重要考核指标,更不要要说关系到我们个人的毕业、晋升和前途。SCI含金量之高,要是读研读博科研工作期间能发表,将对直博、找工作、国奖申请、…

04 | 连接池:别让连接池帮了倒忙

04 | 连接池:别让连接池帮了倒忙 连接池一般对外提供获得连接、归还连接的接口给客户端使用,并暴露最小空闲连接数、最大连接数等可配置参数,在内部则实现连接建立、连接心跳保持、连接管理、空闲连接回收、连接可用性检测等功能。 注意鉴…

MySQL 主从同步及延迟原因分析

主从同步的基本原理 MySQL主从同步步骤详见 MySQL binlog模式及主备的基本原理 谈到主备的并行复制能力,我们要关注的是图中黑色的两个箭头。一个箭头代表了客户端写入主库,另一箭头代表的是从库上sql_thread执行中转日志(relay log&#xff…

《Squeeze-and-Excitation Networks》

Squeeze-and-Excitation Networks1. 摘要2. 介绍3. 网络设计4. 代码实现1. 摘要 卷积操作可以使网络通过在每层的局部感受野内融合空间和通道级信息以构建信息特征;空间信息尝试通过加强CNN整个特征层次的空间编码质量以加强CNN的表示能力;本文主要聚焦…

【计算机网络-应用层】万维网

文章目录1 统一资源定位符 URL2 万维网文档2.1 超文本标记语言 HTML2.2 层叠样式表 CSS2.3 JavaScript3 超文本传输协议 HTTP3.1 HTTP 报文格式3.1.1 HTTP 请求报文3.1.2 HTTP 响应报文3.2 HTTP 的工作过程3.2.1 HTTP/1.03.2.2 HTTP/1.13.2.3 相关例题4 Cookie1 统一资源定位符…

如何从根本上防止服务器被攻击

随着互联网的发展,服务器成为了企业和个人网络应用的重要基础设施。但是,随之而来的网络安全威胁也在不断增加,服务器安全问题也成为了影响企业信息安全的重要因素。针对这种情况,服务器安全防御变得尤为重要。   服务器安全防御…

6.Swagger的实战使用

六.Swagger的实战使用 1.什么是swagger 2.swagger的基本使用 3.swagger实战使用 六.Swagger的实战使用 1.什么是swagger swagger是后端接口文档的生成并且提供ui界面进行测试过去用postman测试 缺点:需要自己写地址,如果项目变了需要自己更改 2.sw…

CF区间DP作业题解

1. Recovering BST 由于互质关系不是传递的,所以尽量挂在树的最下面,刚好构成二叉树 f[i][j][0]f[i][j][0]f[i][j][0] 表示区间 [i,j][i,j][i,j] 以 iii 为根,是否可以构成一棵树。 f[i][j][1]f[i][j][1]f[i][j][1] 表示区间 [i,j][i,j][i,j…

Spring理论学习

1、什么是IOC IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理。不过, IoC 并非 Spring 特有,…

阿里通义千问、ChatGPT和文心一言有何区别,在哪里能使用?

目前,聊天机器人技术在人工智能领域的发展越来越成熟了。现在已经有几款备受关注的聊天机器人产品问世,例如ChatGPT、阿里的通义千问和百度的文心一言。它们有什么区别,怎么使用呢? 其实,我也挺好奇的,毕竟…

人人拥有ChatGPT的时代来临了,这次微软很大方!

技术迭代的在一段时间内是均匀发展甚至止步不前的,但在某段时间内会指数级别的爆发。 ChatGPT背后的GPT 3.5训练据说花了几百万美金外加几个月的时间,参数大概有1700多亿。 这对于绝大多数的个人或企业来说绝对是太过昂贵的。 然而,微软&am…

月薪过 3w 的 软件测试工程师 都是怎么做到的?

对任何职业而言,薪资始终都会是众多追求的重要部分。前几年的软件测试行业还是一个风口,随着不断地转行人员以及毕业的大学生疯狂地涌入软件测试行业,目前软件测试行业“缺口”已经基本饱和。 当然,我说的是最基础的功能测试的岗…

如何使用双轴XY平台绘制正弦曲线

1. 功能说明 本文示例将实现双轴XY平台绘制正弦曲线的功能。 2. 电子硬件 在这个示例中,采用了以下硬件,请大家参考: 主控板 Basra主控板(兼容Arduino Uno) 扩展板 Bigfish2.1扩展板 SH-ST步进电机扩展板 电池11.1V动…

跟着原子学I2C

I2C通讯 1、IIC总线介绍 集成电路总线,是一种同步串行半双工通信总线。 总线or协议?! 总线是数据传输通道,协议是数据传输规则。 1、1介绍 a、由时钟线SCL和数据线SDA组成,并且都接上拉电阻,确保总线空…