Kaggle实战(泰坦尼克号海难生死预测)
1、背景介绍
泰坦尼克号于1909年3月31日在爱尔兰动工建造,1911年5月31日下水,次年4月2日完工试航。她是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉。然而讽刺的是,泰坦尼克号首航便遭遇厄运:1912年4月10日她从英国南安普顿出发,途径法国瑟堡和爱尔兰昆士敦,驶向美国纽约。在14日晚23时40分左右,泰坦尼克号与一座冰山相撞,导致船体裂缝进水。次日凌晨2时20分左右,泰坦尼克号断为两截后沉入大西洋,其搭载的2224名船员及乘客,在本次海难中逾1500人丧生。
在学习机器学习相关项目时,Titanic生存率预测项目也通常是入门练习的经典案例。Kaggle平台为我们提供了一个竞赛案例“Titanic: Machine Learning from Disaster”,在该案例中,我们将探究什么样的人在此次海难中幸存的几率更高,并通过构建预测模型来预测乘客生存率。
本项目通过数据可视化理解数据,并利用特征工程等方法挖掘更多有价值的特征,然后利用同组效应找出共性较强的群体并对其数据进行修正,在选择模型时分别比较了Gradient Boosting Classifier、Logistic Regression等多种方法,最终利用Gradient Boosting Classifier对乘客的生存率进行预测。
2、加载数据
#导入相关包
import warnings
warnings.filterwarnings('ignore')
import numpy as np
import pandas as pd
import seaborn as sns
#设置sns样式
sns.set(style='white',context='notebook',palette='muted')
import matplotlib.pyplot as plt
#导入数据
train=pd.read_csv('./train.csv')
test=pd.read_csv('./test.csv')
display(train.head())
PassengerId | Survived | Pclass | Name | Sex | Age |
---|---|---|---|---|---|
乘客编号 | 是否生还 | 用户阶级 | 姓名 | 性别 | 年龄 |
SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|
兄弟姐妹配偶数 | 家长孩子数 | 船票号 | 乘客花费 | 船舱 | 港口 |
- Survived 是否存活(label):
- 0 - 用户死亡;
- 1- 用户存活;
- Pclass(用户阶级):
- 1 - 1st class,高等用户;
- 2 - 2nd class,中等用户;
- 3 - 3rd class,低等用户;
-
SibSp:描述了泰坦尼克号上与乘客同行的兄弟姐妹(Siblings)和配偶(Spouse)数目;
-
Parch:描述了泰坦尼克号上与乘客同行的家长(Parents)和孩子(Children)数目;
-
Cabin(船舱):描述用户所住的船舱编号。由两部分组成,仓位号和房间编号,如C88中,C和88分别对应C仓位和88号房间;
-
Embarked(港口):
描述乘客上船时的港口,包含三种类型:
- S:Southampton(南安普顿,英国);
- C:Cherbourg(瑟堡,法国);
- Q:Queenstown(昆士敦,英国);
3、数据探索
3.1、查看数据整体情况
#分别查看实验数据集和预测数据集数据
print('训练数据大小:',train.shape)
print('预测数据大小:',test.shape)
该数据集共1309条数据,其中训练数据891条,预测数据418条;训练数据比预测数据多了一列:即标签"result"。
#将训练数据和预测数据合并,这样便于一起处理
full=train.append(test,ignore_index=True)
full.describe()
无明显的异常值,几乎所有数据均在正常范围内。
full.info()
Age/Cabin/Embarked/Fare四项数据有缺失值,其中Cabin字段缺失近四分之三的数据。
3.2、特征与标签关系
3.2.1、Embarked与Survived关系
sns.barplot(data=train,x='Embarked',y='Survived')
#计算不同类型Embarked的乘客,其生存率为多少
s = full.groupby('Embarked')['Survived'].value_counts().to_frame()
s2 = s/s.sum(level=0)
pd.merge(s,s2,left_index=True,right_index=True,suffixes=['_num','_rate'])
法国登船乘客生存率较高原因可能与其头等舱乘客比例较高有关,因此继续查看不同登船地点乘客各舱位乘客数量情况。
sns.catplot('Pclass',col='Embarked',data=train,kind='count',size=3)
3.2.2、Parch与Survived关系
sns.barplot(data=train,x='Parch',y='Survived')
当乘客同行的父母及子女数量适中时,生存率较高
3.2.3、SibSp与Survived关系
sns.barplot(data=train,x='SibSp',y='Survived')
当乘客同行的同辈数量适中时生存率较高
3.2.4、Pclass与Survived关系
sns.barplot(data=train,x='Pclass',y='Survived')
乘客客舱等级越高,生存率越高
3.2.5、Sex与Survived关系
sns.barplot(data=train,x='Sex',y='Survived')
女性的生存率远高于男性
3.2.6、Age与Survived关系
#创建坐标轴
ageFacet=sns.FacetGrid(train,hue='Survived',aspect=3)
#作图,选择图