泰坦尼克号生存预测

本文通过泰坦尼克号数据集,详细介绍了从数据获取、预处理、特征工程到模型构建的完整流程,涉及年龄、性别、身份地位等特征分析,以及SVC、RandomForest等模型的使用。
摘要由CSDN通过智能技术生成

前言:

泰坦尼克号的故事想必大家都很清楚,本题就是预测泰坦尼克号中哪些人可以存活下来。作为一个小白,我也是借由此题和这篇博客熟悉一下机器学习实际项目的流程,复习一下前段时间学习的知识。
这道题的主页:https://www.kaggle.com/c/titanic

题目:

在这里插入图片描述

项目流程:

获取并查看数据

导入数据

import pandas as pd
titanic = pd.read_csv("d:\\pycharm\\work\\train.csv")

快速查看数据结构

titanic.head()
titanic.info()
titanic.describe()

数据集的前五行
数据的前五行
数据集的简单描述
在这里插入图片描述
数据集中数值属性的摘要
在这里插入图片描述
通过以上,我们可以看到训练集中一共有891条数据,包括乘客编号,是否存活,姓名,身份地位,年龄等12个特征(其中7个数值特征,5个字符特征)。并且年龄、客舱号、登船港口有缺失值。

创建验证集

      我们可以先将训练集中的一部分数据分出来作为验证集,这是为了验证最后得到的模型是否具有一个较好的泛化能力,避免模型在训练集上表现良好但是在测试集表现较差也就是过拟合。
      创建验证集有几种方法:
1.使用numpy.random.permutation(len(data))对数据集的数字索引随机排序,分出20%作为验证集。
2.如果你使用的数据集是不断更新的,那么使用第一种方法可能会导致每次更新后,得到的训练集不同。常见的解决办法是计算每个实例标识符的hash值,只取hash的最后一个字节,如果该值小于等于51(约256的20%),则将该实例放入验证集。这样可以确保数据集在每次更新后仍然一致,新实例的20%将被放入新的验证集。
3.前面两种是纯随机的抽样方法,可能会导致一些抽样偏差。使用sklearn中的Stratified Shuffle Split类可以实现分层抽样。
      我这里用的是第一种,纯随机的抽样。

import numpy as np
np.random.seed(42)   #设置随机种子,相同的种子产生的随机序列相同
shuffled_index = np.random.permutation(len(titanic))  
test_set_size = int(len(titanic) * 0.2)
test_index = shuffled_index[:test_set_size]  #前20%分给测试集
train_index = shuffled_index[test_set_size:] #后80%分给训练集

数据可视化及分析

Pclass身份地位
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib notebook
fig = plt.figure()
sns.countplot(x='Pclass',hue = 'Survived',data = titanic)

在这里插入图片描述

sns.barplot(x='Pclass',y = 'Survived',data = titanic)

在这里插入图片描述
可以看到Pclass为1也就是身份地位最高的乘客的存活率明显高于Pclass为2和3的乘客。

Sex性别
sns.countplot(x='Sex',hue = 'Survived',data = titanic)

在这里插入图片描述
男性乘客的数量要比女性乘客的数量多很多,但是存活下来的人数却比女性少,很显然,女性乘客的存活率要更高。

SibSp兄弟姐妹\配偶数
sns.barplot(x='SibSp',y = 'Survived',data = titanic)

在这里插入图片描述
看起来,如果一个乘客的SibSp数目太多或者为0,那么他们的存活率要稍低一些。

Parch父母\子女数
sns.barplot(x='Parch',y = 'Survived',data = titanic)

在这里插入图片描述
和SibSp一样,Parch数位于中间的乘客似乎比两边的乘客存活率要高一些。

Age年龄

因为年龄是连续的数值,我这里先做一个分箱处理使数值离散化,看起来更直观一些。

#对age进行离散化和分箱
bins_age = [0,3,10,18,40,80]
cats_age = pd.cut(titanic['Age'],bins_age)
sns.countplot(x = cats_age, hue = titanic['Survived'])

在这里插入图片描述

sns.barplot(x = cats_age, y = titanic['Survived'])

在这里插入图片描述
从图中看,存活率随着年龄的升高而降低。年龄很小的孩子往往有较高的存活率。

Fare票价

由于Fare也是离散值,所以处理大致和Age相同。我这里是根据Fare的四分位数大致划分。

#对票价(fare)进行离散化处理
bins_fare = [0,8,15,35,80,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值