泰坦尼克号幸存者预测

泰坦尼克号幸存者预测

      • 1、特征工程概述
      • 2、数据预处理
      • 3、特征选择与提取
      • 4、建模与预测



1、特征工程概述


在上篇 泰坦尼克号幸存者数据分析 中,我们对泰坦尼克号的幸存者做了数据分析,通过性别、年龄、船舱等级等不同维度对幸存者进行了分类统计,回答了哪些人可能成为幸存者

本文我们将对泰坦尼克号数据集应用特征工程、训练分类模型并对幸存者进行预测

特征工程是机器学习工作流程中重要的组成部分,它是将原始数据转化成模型可理解的形式的过程。如何基于给定数据来发挥更大的数据价值就是特征工程要做的事情

在2016年的一项调查中发现,数据科学家的工作中,有超过80%的时间都在获取、清洗和组织数据;构造机器学习流水线的时间不到20%。可见特征工程的重要性

特征工程在机器学习流程中的位置如下:

在这里插入图片描述
特征工程处在原始数据和特征之间。它的任务就是将原始数据翻译成特征的过程,这个过程将数据转换为能更好的表示业务逻辑的特征,从而提高机器学习的性能

特征工程主要包括数据预处理、特征选择与提取等

2、数据预处理


对于泰坦尼克号数据集的预处理,包括缺失值处理和特征编码

2.1、缺失值处理

上篇中,我们查看了数据集的缺失情况:

  • 训练集:Age(177)、Cabin(687)、Embarked(2)
  • 测试集:Age(86)、Fare(1)、Cabin(327)

对于缺失值的处理,我们一般选择填充和删除:

# 年龄(Age)=> 均值填充
data['Age'].fillna(data['Age'].mean(), inplace=True)
# 船票价格(Fare)=> 均值填充
data['Fare'].fillna(data['Fare'].mean(), inplace=True)
# 座位号(Cabin)=> 缺失较多,删除
data.drop(columns='Cabin', inplace=True)
# 登船码头(Embarked)=> 众数填充
data['Embarked'].fillna(data['Embarked'].mode(), inplace=True)

2.2、特征编码

数值型数据我们可以直接使用;对于日期型数据,我们需要转换成单独的年月日;对于分类型数据,需要使用特征编码转换为数值

1)分类特征:Sex(male/female)、Embarked(C/Q/S)

编码方案如下:

# 性别(Sex)=> 男(male):1,女(female):0
sex_map = {'male': 1, 'female': 0}
data['Sex'] = data['Sex'].map(sex_map)
# 登船码头(Embarked)=> 独热编码
embarked_dum = pd.get_dummies(data['Embarked'], prefix='Embarked', dtype=int)
# 删除源数据中的Embarked列,添加编码后的Embarked
data.drop(columns='Embarked', axis=1, inplace=True)
data = pd.concat([data, embarked_dum], axis=1)

2)非分类特征:Fare、Age

对于非分类特征,我们一般进行分箱处理:

# 根据样本分位数进行分箱,等比例分箱
# 船票价格(Fare) => 分箱并序数编码
data['FareBand'] = pd.qcut(data['Fare'], 4, labels=[0, 1, 2, 3])
# 删除Fare特征
data.drop(columns='Fare', inplace=True)

# 年龄(Age) => 分箱并序数编码
data['AgeBand'] = pd.cut(data['Age'], bins=[0, 12, 18, 60, 140], labels=[0, 1, 2, 3])
# 删除Age特征
data.drop(columns='Age', inplace=True)

3、特征选择与提取


3.1、特征提取

1)头衔特征

通过观察数据,我们发现乘客姓名中包含头衔,例如Mrs表示已婚女性。这些头衔可以将乘客进一步细分

提取姓名中的头衔:

# 提取姓名中的头衔
def extract_title(name: str):
    return name.split(',')[1].split('.')[0].strip()

添加头衔特征:

# 添加头衔特征
data['Title'] = data['Name'].apply(extract_title)

查看头衔及数量:

# 查看头衔及数量
print(data['Title'].value_counts().reset_index())

在这里插入图片描述
由于头衔类别较多,且部分不同写法但意思相同,需要整合

# 整合意思相同的头衔
data['Title'].replace(['Capt', 'Col', 'Major', 'Dr', 'Rev', 'Jonkheer', 'Don', 'Sir', 'the Countess', 'Dona', 'Lady'], 'Other', inplace=True)
data['Title'].replace(['Mme', 'Ms'], 'Mrs', inplace=True)
data['Title'].replace(['Mlle'], 'Miss', inplace=True)
print(data['Title'].value_counts().reset_index())

在这里插入图片描述
对头衔特征进行编码,转化为数值:

# 头衔特征编码:序数编码
title_map = {'Mr': 0, 'Miss': 1, 'Mrs': 2, 'Master': 3, 'Other': 4}
data['Title'] = data['Title'].map(title_map)

# 删除Name特征
data.drop(columns='Name', axis=1, inplace=True)

2)家庭规模特征

通过观察数据,我们发现我们可以通过乘客兄弟姐妹及配偶人数和乘客父母及子女人数计算得到本次出行的乘客家庭规模

# 家庭规模(FamilySize) = 兄弟姐妹及配偶人数(SibSp) + 父母及子女人数(Parch) + 乘客自己(1)
data['FamilySize'] = data['SibSp'] + data['Parch'] + 1
# 对家庭规模特征进行分箱:1人(Alone)、2-4人(Small)、>4人(Large)
data['FamilySize'] = pd.cut(data['FamilySize'], bins=[1, 2, 5, 12], labels=['A', 'S', 'L'], right=False, include_lowest=True)
# 家庭规模特征编码:序数编码
fs_map = {'A': 0, 'S': 1, 'L': 2}
data['FamilySize'] = data['FamilySize'].map(fs_map)
# 删除SibSp、Parch特征
data.drop(columns=['SibSp', 'Parch'], inplace=True)

3.2、特征选择

更多的数据优于更好的算法,而更好的数据优于更多的数据。删除无关特征,最大程度保留数据

# 删除其他无关特征
data.drop(columns=['PassengerId', 'Ticket'], inplace=True)
# 应用了特征工程的数据
print(data.head().to_string())

在这里插入图片描述
将非数值型的原始数据转化为数值型的特征,这就是特征工程所做的事情

4、建模与预测


保存特征工程处理后的数据,以方便进行训练和评估:

# 保存特征工程处理后的数据(训练集和测试集)
data.to_csv("new_train.csv", index=False, encoding='utf-8')

特征工程处理后的泰坦尼克号数据集下载(训练集和测试集):传送门

需要注意的是,测试集不包含Survived列。因此,我们将对处理后的训练集重新进行训练集与测试集的划分,并基于新的训练集与测试集建模和预测

# 训练集和测试集
train = pd.read_csv("new_train.csv")
# X_test = pd.read_csv("new_test.csv")
X_train = train.iloc[:, 1:]
y_train = train.iloc[:, 0]

from sklearn.model_selection import train_test_split

# 重新划分训练集(80%)和测试集(20%)
X_train, X_test, y_train, y_test = train_test_split(X_train, y_train, test_size=0.2, random_state=0)

下面我们使用多种分类算法进行建模和预测

4.1、逻辑回归(幸存者预测)

from sklearn.linear_model import LogisticRegression

# 逻辑回归分类器(二分类)(默认求解器lbfgs、分类方式OvR)
lr = LogisticRegression()
# 训练模型
lr.fit(X_train, y_train)

# 预测
y_pred = lr.predict(X_test)
# print(y_pred)

# 准确度评分
print(lr.score(X_test, y_test))   # 0.7821229050279329

4.2、K近邻分类(幸存者预测)

from sklearn.neighbors import KNeighborsClassifier

# KNN分类器(默认使用标准欧几里德度量标准)
knn_clf = KNeighborsClassifier(n_neighbors=2)
# 训练模型
knn_clf.fit(X_train, y_train)

# 预测
y_pred = knn_clf.predict(X_test)
# print(y_pred)

# 平均准确度
print(knn_clf.score(X_test, y_test))   # 0.8156424581005587

现在,只要给定一个新的乘客的数据,我们就能预测该乘客在此次泰坦尼克号事故中是否幸存了,而且,预测准确率约达80%



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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Traefik的前世今生

Traefik 是一款现代的反向代理和负载均衡器,它的设计专门针对微服务架构和容器技术,如 Docker 🐳 和 Kubernetes 🎯。自从其首次发布以来,Traefik 已经迅速成为云原生生态系统中不可或缺的一部分。在这篇文章中&#x…

上位机图像处理和嵌入式模块部署(qmacvisual缺失的颜色检测)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 在图像处理当中,对颜色的处理是非常重要的。当然,这要建立在拍摄图片是彩色图片的基础之上。工业上面,虽然是黑…

第三次作业

创建了一个教务管理系统的登录页面,其中包含左侧的图片以及右侧的表单容器,当鼠标悬停在表单容器上时,会稍微变大,并且图片容器会相应的缩小,是通过css的transition以及fiex属性实现。 表单容器包含用户名和密码的输入…

基于linux进一步理解核间通讯

芯片架构分为同构和异构: 如下图TC397: 如下图TDA4: 如下图STM32MP157: 非对称多处理结构(AMP): AMP 结构是指每个内核运行自己的 OS 或同一 OS 的独立实例&#

番茄 abogus rpc调用

声明: 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章…

生产者和消费者模型 | 阻塞队列 | 信号量 | 环形队列

文章目录 1.生产者和消费者模型2.生产者和消费者模型优点3.阻塞队列4.POSIX信号量5.基于环形队列的生产消费模型 本文完整的代码放在了这: Gitee链接 1.生产者和消费者模型 生产者和消费者模型,概括起来其实是一个321原则:3是:三…

如何恢复未保存或删除/丢失的Word文件?

关闭 Word 应用程序而不保存文档?误删Word文档?许多用户会在不同的情况下丢失Word文档。如果不幸遇到此类问题,如何恢复已删除或未保存的 Word 文档?有一些方法可以恢复未保存/删除的文档。此外,您还可以使用Word文件恢…

前端 接口返回来的照片太大 加载慢如何解决

现象 解决 1. 添加图片懒加载 背景图懒加载 对背景图懒加载做的解释 和图片懒加载不同&#xff0c;背景图懒加载需要使用 v-lazy:background-image&#xff0c;值设置为背景图片的地址&#xff0c;需要注意的是必须声明容器高度。 <div v-for"img in imageList&quo…

【论文笔记】PointMamba: A Simple State Space Model for Point Cloud Analysis

原文链接&#xff1a;https://arxiv.org/abs/2402.10739 1. 引言 基于Transformer的点云分析方法有二次时空复杂度&#xff0c;一些方法通过限制感受野降低计算。这引出了一个问题&#xff1a;如何设计方法实现线性复杂度并有全局感受野。 状态空间模型&#xff08;SSM&…

微服务-2 Eureka

Eureka 启动页面&#xff1a; 同理再注册完order-service后&#xff0c;刷新启动页面&#xff1a; userservice 启动多台服务&#xff1a; [ 代码 ]&#xff1a;orderService.java&#xff08;用 RestTemplate 调其他服务&#xff0c;用 userservice 代替 localhost:8081&…

二叉树——存储结构

二叉树的存储结构 二叉树一般可以使用两种结构存储&#xff0c;一种是顺序结构&#xff0c;另一种是链式结构。 一、顺序存储 二叉树的顺序存储是指用一组连续的存储单元依次自上而下、自左至右存储完全二叉树上的结点元素&#xff0c;即将完全二叉树上编号为i的结点元素存储…

LeetCode 142.环形链表II(数学公式推导)

给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#xff0c;评测系统内部使用整…

python图书馆图书借阅系统含网上商城管理系统7d538

&#xff0c;python语言&#xff0c;django框架进行开发&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发的图书管理系统。通过调研和分析&#xff0c;系统拥有管理员和用户两个角色&#xff0c;主要具备注册登录、个人信息修改、用户、图书分类、图书信息、借…

多模块项目使用springboot框架进行业务处理

项目目录 1、在Result定义返回结果 package com.edu.result;import lombok.Data;import java.io.Serializable;/*** 后端统一返回结果* param <T>*/ Data public class Result<T> implements Serializable {private Integer code; //编码&#xff1a;1成功&#xf…

【U8+】用友固定资产卡片拆分提示:未设置对象变量或With block变量。

【问题描述】 用友U8软件中&#xff0c; 操作固定资产模块&#xff0c;针对所有资产进行卡片拆分的时候&#xff0c; 提示&#xff1a;未设置对象变量或With block变量。 确定后仍然能打开卡片拆分界面&#xff0c;但是界面显示异常看不到拆分明细信息&#xff0c;并且保存后拆…

LeetCode-Java:303、304区域检索(前缀和)

文章目录 题目303、区域和检索&#xff08;数组不可变&#xff09;304、二维区域和检索&#xff08;矩阵不可变&#xff09; 解①303&#xff0c;一维前缀和②304&#xff0c;二维前缀和 算法前缀和一维前缀和二维前缀和 题目 303、区域和检索&#xff08;数组不可变&#xff…

一些 VLP 下游任务的相关探索

一、Image-Text Retrieval (ITR , 图像文本检索) 任务目的&#xff1a; 检索与给定文本最匹配的图像&#xff0c;或者给定图像最匹配的文本。 跨模态图像-文本检索&#xff08;ITR&#xff09;是根据用户给定的一种模态中的表达&#xff0c;从另一模态中检索出相关样本&#x…

工厂方法模式:解锁灵活的对象创建策略

在软件设计中&#xff0c;工厂方法模式是一种非常实用的创建型设计模式&#xff0c;它不仅提升了系统的灵活性&#xff0c;还简化了对象的创建过程。本文将详细探讨工厂方法模式的核心概念、实现方式、应用场景以及与其他设计模式的对比&#xff0c;旨在提供一份全面且实用的指…

flutter中鼠标检测事件的应用---主要在于网页端使用

flutter中鼠标检测事件的应用—主要在于网页端使用 鼠标放上去 主要代码 import package:flutter/material.dart;class CustomStack extends StatefulWidget {override_CustomStack createState() > _CustomStack(); }class _CustomStack extends State<CustomStack>…

MySQL——创建和插入

一、插入数据 INSERT 使用建议; 在任何情况下建议列出列名&#xff0c;在 VALUES 中插入值时&#xff0c;注意值和列的意义对应关系 values 指定的值顺序非常重要&#xff0c;决定了值是否被保存到正确的列中 在指定了列名的情况下&#xff0c;你可以仅对需要插入的列给到…