机器学习实战:泰坦尼克号乘客生存率预测(数据处理+特征工程+建模预测)

项目描述

任务:根据训练集数据中的数据预测泰坦尼克号上哪些乘客能生存下来

数据源:csv文件(train.csv)

目标变量:Survived(0-1变量)

数据集预览:

1、英文描述:

2、译文描述:

初步分析

注:代码后紧跟运行结果截图

1、查看数据

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns

# 导入数据
train = pd.read_csv('train.csv')
print(train.head(10))

2、查看数据量与缺失值 

# 查看数据基本信息
print(train.info())

# 结果:共891条数据,共12列,部分列含有缺失值

# 方便查看哪些特征含缺失值
print(train.isnull().sum())

3、分析不同性别的生存率

# 计算不同性别的生存率
survived_sex = train.groupby('Sex')['Survived'].mean()
print(survived_sex)
# 可视化
sns.barplot(x='Sex', y='Survived', data=train, errorbar=None, hue='Sex', palette='viridis')

# 结论:女性生存率明显高于男性

3、分析不同年龄段的生存率

# 计算不同年龄段的生存率
train['Age_group'] = pd.cut(train["Age"], bins=[0, 5, 14, 18, 30, 60, 110], 
                            labels=['baby', 'child', 'teenager', 'adult', 'old_adult', 'old'], right=False)
survived_age = train.groupby('Age_group', observed=False)['Survived'].mean()
print(survived_age)
# 可视化
order = ['baby', 'child', 'teenager', 'adult', 'old_adult', 'old']
sns.barplot(x='Age_group', y='Survived', data=train, order=order, errorbar=None, hue='Age_group', palette='viridis')
plt.show()

# 结论:婴儿生存率明显更高,老人生还率明显更低,随年龄的增长,生存率有下降的趋势

 4、分析不同 Plass 的乘客的生存率

# 计算不同 Plass 的乘客的生存率
survival_pclass = train.groupby('Pclass')['Survived'].mean()
print(survival_pclass)
# 可视化
sns.barplot(x='Pclass', y='Survived', data=train, errorbar=None)
plt.show()

# 结论:1、2、3号的生存率由高到低排列

5、 分析不同票价的乘客的生存率

# 计算不同票价的乘客的生存率
train['Fare_group'] = pd.cut(train['Fare'], bins=[0, 5, 15, 25, 50, 100, 200, float('inf')], 
                             labels=['very low', 'low', 'normal', 'medium', 'high', 'very high', 'Luxury'], right=False)
print(train.groupby('Fare_group', observed=False)['Survived'].mean())
# 可视化
sns.barplot(x='Fare_group', y='Survived', data=train, errorbar=None, hue='Fare_group', palette='viridis')
plt.show()

# 结论:票价越高,生存率越高,高价位生存率在 60% 以上

数据处理与特征工程

1、查看文本特征的取值

# 查看训练集中,名字特征有哪些头衔(代表乘客所属阶级)
print(train['Name'].str.extract(' ([A-Za-z]+\.)')[0].unique())
# 查看训练集 Cabin 有哪些取值
print('Cabin 仓号首字母有:', train['Cabin'].unique())  

 2、数据处理与特征工程

# 数据处理与特征工程

from sklearn.impute import KNNImputer
from sklearn.preprocessing import StandardScaler

def pre(df):
    # 家庭人数
    df['family'] = df["Parch"] + df["SibSp"]
    # 提取名字头衔,表示阶级信息
    df['Title'] = df['Name'].str.extract(' ([A-Za-z]+\.)')
    df['Title'] = df['Title'].str.replace('.', '')
    df['Title'] = df['Title'].replace(['Don', 'Lady', 'Capt', 'Col', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    df['Title'] = df['Title'].replace(['Mlle', 'Ms'], 'Miss')
    df['Title'] = df['Title'].replace('Mme', 'Mrs')
    # 缺失值处理
    df['Embarked'].fillna(df['Embarked'].mode()[0])   # 众数填充
    df['Fare'].fillna(df['Fare'].median())   # 中位数填充
    # 手动对 Fare 进行独热编码
    df['very low'] = (df['Fare']<5)
    df['low'] = (df['Fare']<15) & (df['Fare']>=5)
    df['normal'] = (df['Fare']<25) & (df['Fare']>=15)
    df['medium'] = (df['Fare']<50) & (df['Fare']>=25)
    df['high'] = (df['Fare']<100) & (df['Fare']>=50)
    df['very high'] = (df['Fare']<300) & (df['Fare']>=100)
    df['Luxury'] = (df['Fare']>=300)
    # 填充 Cabin 缺失值,并用仓号第一个字母替代原来的仓号
    df['Cabin'] = df['Cabin'].fillna('N').map(lambda x: x[0])
    # KNN 算法填充 Age 的缺失值
    imputer = KNNImputer(n_neighbors=5)
    df['Age'] = imputer.fit_transform(df[['Age']])
    # 对 Age 分组(加上填补的值进分组里),并手动进行标签编码
    df['Age_group'] = pd.cut(df["Age"], bins=[0, 5, 14, 18, 30, 60, 110], 
                            labels=[1, 2, 3, 4, 5, 6], right=False)
    # 独热编码
    df = pd.get_dummies(df, columns=['Embarked', 'Title', 'Cabin'], drop_first=True)
    df['Sex'] = df['Sex'].map({'male': 0, 'female': 1})
    # 处理特征出现在测试集而不在训练集的可能情况
    for p in ['A', 'B', 'C', 'D', 'E', 'F', 'G', 'T']:
        col = f'Cabin_{p}'
        if col not in df.columns:   # 若存在训练集没出现过的字母,则新建一列
            df[col] = pd.Series([False]*df.shape[0])
    # 选择对目标变量可能有影响的特征(挑选特征)
    cols = ['Pclass', 
            'Title_Miss', 'Title_Mr', 'Title_Mrs','Title_Rare',
            'Sex',
            'Age', 'Age_group',
            'SibSp', 'Parch',
            'Fare', 'very low', 'low', 'normal', 'medium', 'high', 'very high', 'Luxury',
            'Cabin_A', 'Cabin_B', 'Cabin_C', 'Cabin_D', 'Cabin_E', 'Cabin_F','Cabin_G', 'Cabin_T'  # 忽略缺失值 N 
           ]
    df2 = df[cols].copy()
    # 标准化数值特征
    num_features = ['Age', 'Fare', 'Parch', 'SibSp', 'Age_group']
    scaler = StandardScaler()
    df2[num_features] = scaler.fit_transform(df2[num_features])

    return df2

建模过程

# 建模、模型评估

from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier, GradientBoostingClassifier
from sklearn.metrics import accuracy_score

train = pd.read_csv('train.csv')
# 特征工程,调用前面定义的函数
train_ = pre(train)   
X = train_  #特征变量
y = train['Survived']   #目标变量
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

models = {
    '逻辑回归': LogisticRegression(),
    '支持向量机SVM': SVC(),
    'KNN': KNeighborsClassifier(),
    '随机森林': RandomForestClassifier(),
    '梯度提升树': GradientBoostingClassifier()
}
accuary_cores = {
    '逻辑回归': 0,
    '支持向量机SVM': 0,
    'KNN': 0,
    '随机森林': 0,
    '梯度提升树': 0
}

# 计算模型在各自默认参数下反复训练 n 次的平均准确率
n = 20
for i in range(n):
    for model_name, model in models.items():
        model.fit(X_train, y_train)
        y_pred = model.predict(X_test)
        accuracy = accuracy_score(y_test, y_pred)
        accuary_cores[model_name] += accuracy
print('默认参数下各模型的平均准确率:')
for model_name, accuracy in accuary_cores.items():
    accuracy /= n
    print(f'{model_name}:  {accuracy:.4f}')

注:关于上面多个模型,各有优缺点,模型选择取决于具体任务需求(比如模型解释性需求、模型准确度需求、模型精确度需求等)来选择合适模型,以上模型模型参数还待优化。项目还有很多地方可以完善,我们下期再见叭!

# 若对大噶有帮助的话,希望点个赞支持一下叭!

# 文章若有错误,欢迎大家不吝赐教!

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

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

相关文章

MATLAB不动点迭代法求单变量非线性方程的根程序加实例

不动点迭代法用于单变量线性方程近似根&#xff0c;首先确定一个方程根附近的近似初始值&#xff0c;采用逐次逼近的方法&#xff0c;使用迭代公式不断地更新这个初始值&#xff0c;使这个初始值不断趋近于准确值。 1.不动点迭代法自定义函数 fixed_point.m是一个MATLAB函数&a…

BurpSuite使用篇--抓包方法与解码器

BurpSuite是一个web渗透利器&#xff0c;可以抓包改包也可以扫描漏洞&#xff0c;将漏洞扫描和利用集成化一体&#xff0c;更可以支持外部插件拓展&#xff0c;非常牛的工具。 那我们怎么使用呢&#xff1f; 使用BurpSuite 老版本中BurpSuite需要在浏览器中配置本地代理&…

【查询目录】.NET开源 ORM 框架 SqlSugar 系列

.NET开源 ORM 框架 SqlSugar 系列 【开篇】.NET开源 ORM 框架 SqlSugar 系列【入门必看】.NET开源 ORM 框架 SqlSugar 系列【实体配置】.NET开源 ORM 框架 SqlSugar 系列【Db First】.NET开源 ORM 框架 SqlSugar 系列【Code First】.NET开源 ORM 框架 SqlSugar 系列【数据事务…

ESP32-S3模组上跑通ES8388(8)

接前一篇文章&#xff1a;ESP32-S3模组上跑通ES8388&#xff08;7&#xff09; 二、利用ESP-ADF操作ES8388 2. 详细解析 上一回继续解析到了ESP-ADF的audio_hal层的第1个也是最为关键的函数 —— audio_hal_init()中的第5段代码&#xff0c;也就是mutex_lock函数与mutex_unlo…

bind实验

服务端 查看域名 [rootclient yum.repos.d]# hostname client 设置域名 [rootclient yum.repos.d]# hostnamectl set-hostname dns1.openlab.edu [rootclient yum.repos.d]# cd [rootclient ~]# hostname dns1.openlab.edu 安装bind包 [rootclient ~]# yum install bind -y…

【LeetCode每日一题】——717.1比特与2比特字符

文章目录 一【题目类别】二【题目难度】三【题目编号】四【题目描述】五【题目示例】六【题目提示】七【解题思路】八【时空频度】九【代码实现】十【提交结果】 一【题目类别】 数组 二【题目难度】 简单 三【题目编号】 717.1比特与2比特字符 四【题目描述】 有两种特…

Linux学习笔记11 系统启动初始化,服务和进程管理(下)

前文 前文介绍了系统启动初始化程序&#xff0c;介绍了systemd的基础知识。这里主要看一下我们systemd的单元管理和常用的命令以及示例。 Linux学习笔记10 系统启动初始化&#xff0c;服务和进程管理&#xff08;上&#xff09;-CSDN博客 systemd单元管理 启动服务 这很常…

pnpm安装electron出现postinstall$ node install.js报错

pnpm install --registryhttp://registry.npm.taobao.org安装依赖包的时候出现了postinstall$ node install.js报错 找到install.js 找到downloadArtifact方法&#xff0c;添加如下代码 mirrorOptions:{mirror:"http://npmmirror.com/mirrors/electron/"}http://n…

程序执行堆栈执行模拟

所有的文件都是在硬盘&#xff08;磁盘&#xff09;上&#xff0c;调用时先调用javac指令的jdk编译成.class然后被java指令的jre送到内存中&#xff0c;java在内存中有自己的一片区域叫JVM&#xff0c;编译进来的文件首先进入方法区。 staitc的属性就是在进入内存的时候开辟了一…

windows平台使用C#创建系统服务

使用 C# 在 Windows 平台创建和管理系统服务 在 Windows 平台上&#xff0c;系统服务&#xff08;Windows Service&#xff09;是一种运行在后台、无需用户交互的应用程序。系统服务广泛应用于长期任务处理、网络监听、后台调度等场景。本文将详细介绍如何使用 C# 创建一个 Win…

JVM_总结详解

1、CPU和内存的交互 了解jvm内存模型前&#xff0c;了解下cpu和计算机内存的交互情况。【因为Java虚拟机内存模型定义的访问操作与计算机十分相似】 有篇很棒的文章&#xff0c;从cpu讲到内存模型:[什么是java内存模型&#xff1f;] 在计算机中&#xff0c;cpu和内存的交互最…

TLinux 3.1 (Centos 8)修改网卡设备名

原网卡设备名&#xff1a;ifcfg-enp17s 新网卡设备名&#xff1a;ifcfg-eth0 1. 修改接口配置文件名 rename /etc/sysconfig/network-scripts/ifcfg-enp17s /etc/sysconfig/network-scripts/ifcfg-eth0 2. 修改接口配置文件 vi /etc/sysconfig/network-scripts/ifcfg-eth…

ElasticSearch7.x入门教程之全文搜索(七)

文章目录 前言一、多条件查询&#xff1a;bool query二、更加精准查询&#xff1a;dis_max query总结 前言 这里再接着上一篇文章继续记录。非常感谢江南一点雨松哥的文章。 欢迎大家去查看&#xff0c;地址&#xff1a;http://www.javaboy.org 一、多条件查询&#xff1a;boo…

基于springboot 的体质测试数据分析及可视化设计LWPPT

技术可行性&#xff1a;技术背景 本企业网站在Windows操作系统中进行开发&#xff0c;并且目前PC机的性能已经可以胜任普通网站的web服务器。系统开发所使用的技术也都是自身所具有的&#xff0c;也是当下广泛应用的技术之一。 系统的开发环境和配置都是可以自行安装的&#x…

oracle小技巧-解决特殊密码字符而导致的exp错误

在使用oracle数据库的时候&#xff0c;我们经常会利用exp工具对某些表进行导出。但有些时候&#xff0c;因我们用户密码为安全性设有特殊字符&#xff0c;导致exp导出时候报&#xff1a;“EXP-00056和ORA-12154”&#xff0c;今天我们就分享下如何通过设置符号隔离的小技巧解决…

【ArcGIS Pro实操第11期】经纬度数据转化成平面坐标数据

经纬度数据转化成平面坐标数据 数据准备ArcGIS操作步骤-投影转换为 Sinusoidal1 投影2 计算几何Python 示例 另&#xff1a;Sinusoidal (World) 和 Sinusoidal (Sphere) 的主要区别参考 数据准备 数据投影&#xff1a; 目标投影&#xff1a;与MODIS数据相同&#xff08;Sinu…

病理组学分析系列教程1:使用Python-histolab进行病理图像预处理,tiles切片自动生成

首先&#xff0c;先上参考资料链接&#xff1a; 了解数字病理影像图片WSI如何切割-使用histolab 视频详细讲解使用histolab进行病理图像切分 详细介绍数字病理图像的存储格式及格式转换工具介绍 一、病理图像预处理 相信很多朋友对于WSI这种巨大的病理图像的预处理都觉得束…

kubernetes——part3-2 集群声明式文件YAML

一、YAML介绍 YAML 的意思是&#xff1a;仍是一种标记语言&#xff0c;但为了强调这种语言以数据做为中心&#xff0c;而不是以标记语言为重点。是一个可读性高&#xff0c;用来表达数据序列的格式。 二、基本语法 1.低版本缩进时不允许使用Tab键&#xff0c;只允许使用空格…

使用Postman搞定各种接口token实战

现在许多项目都使用jwt来实现用户登录和数据权限&#xff0c;校验过用户的用户名和密码后&#xff0c;会向用户响应一段经过加密的token&#xff0c;在这段token中可能储存了数据权限等&#xff0c;在后期的访问中&#xff0c;需要携带这段token&#xff0c;后台解析这段token才…

什么是换电系统?驱动新能源汽车发展的“能源驿站”

随着新能源汽车保有量上升&#xff0c;新能源汽车充换电设施需求量同步增加。由于我国土地、电力资源相对紧张&#xff0c;随着车辆保有量继续增加&#xff0c;换电模式有望成为对充电模式的良好补充&#xff0c;具备广阔的中长期发展前景。蔚来是换电领域的先行者&#xff0c;…