美文网首页数据乐园我爱编程呆鸟的Python数据分析
kaggle实战项目——泰坦尼克号船员存活率预测

kaggle实战项目——泰坦尼克号船员存活率预测

作者: upward橘子女侠 | 来源:发表于2018-04-17 12:48 被阅读78次

       kaggle是一个非常适合初学者去实操实战技能的一个网站,它可以根据你做的项目来评估你的得分和排名。让你对自己的能力有更清楚的了解,当然,在这个网站上,也有很多项目的教程,可以跟着教程走,慢慢熟悉各种操作。在平时的学习中,我们了解到的知识更多的是理论,缺少一个实战的平台,项目的练习。我对kaggle的了解也是基于实战的需要,想做一些项目来巩固我的认知,发现更多有用的技能。

        这篇文章就是我在kaggle上做的第一个项目,也是kaggle推荐的新手项目,泰坦尼克号存活率预测。 这个项目从一组样本中,列出幸存或未存活泰坦尼克号灾难的乘客以及乘客的信息(例如,年龄,性别,姓名等),需要我们建立适当的模型,根据出给定出的测试数据集中不包含生存的信息,预测测试集中的这些乘客能否存活。

针对这个项目,我的工作流程有七步:

1. 问题描述

2. 加载训练集数据和测试集数据

3. 分析,探索数据关系

4. 对数据进行填充,转化和清洗

5. 建立模型,预测和解决问题

6. 可视化报告,解决问题,提交答案

7. 项目总结


一. 问题描述:

      1912年4月15日,泰坦尼克号在首航期间沉没,撞上冰山,2224名乘客和机组人员中有1502人丧生。只有32%的存活率。 这场灾难导致人命损失的原因之一是,船上没有足够的救生艇供乘客和船员使用。 尽管在沉船事件中幸存下来有运气因素,但是有些群体比其他群体更有可能存活下来,比如妇女、儿童和上层阶级。 所以,针对这个问题,我们借助已有数据(也就是训练集数据)建立了一个预测模型,对不包含存活率的测试集数据做一个简单的预测。

二.加载训练集数据和测试集数据:

    引入所需要的数据库和数据挖掘的一些算法

数据包和数据挖掘算法

   获取训练集数据和测试集数据,并联合两者数据

获取数据

三.分析,探索数据关系:

首先呢,我们查看数据类型信息,对数据的情况有个大概的了解

查看数据类型 train_df.info() test_df.info()

根据以上信息,我们可以得出训练数据中,Cabin缺失值比较多,其次是Age,Embarked.测试集数据中,Cabin的缺失值最多,其次是Age,Fare。

对于缺失数据的处理:

如果特征缺失值超过一半,我们可以直接认为该特征对目的预测没有影响,可以直接删除该特征。

如果特征的缺失值较少,我们一般采用去掉缺失数据后,数据的中位数或众数填充。

用机器学习的方式建立模型,然后对缺失值进行预测

    在对数据有个简单的了解后,我们查看一下导入的数据是什么样子

train_df数据 test_df数据

所以,我们导入的数据就是如上图所示的数据。接下来呢,我们就来看一下对数据的描述性分析,这是数据分析中必不可少的一步。

描述性分析

根据对训练集数据的描述性分析,我们可以得到如下的信息:

     ---总共人数是泰坦尼克号船上的乘客总数2224人,实际的训练集数据为891人;

    ---存活是一个具有0和1的绝对数值的特征;

    ---大部分乘客(>75%)的人都没有带父母和孩子出行;

    ---接近30%的乘客和兄弟姐妹或配偶出行;

    ---年龄在60-80岁之间的人很少;

    ---价格差别很大,很少乘客支付高价格(512)船

数据的特征

针对分类数据的特征,我们可以得出:

    ---在训练数据集中,名称是唯一的(计数=唯一=891);

    ---性别变量为两个值,有65%名男性(最高=男性,freq=577/计数=891);

    ---Embarked有三个值,最多的是“S”;

在对数据进行简单的分析了解后,我们需要对数据进行探索,发现数据之间的关系,以及数据与目的特征的相关性。接下来,我们利用图表,数据的可视化来对数据进行简单的探索。


首先,我们针对没有空值的序数特征,分类特征以及离散特征进行单维度的探索,发现他们与存活率之间的相关性。

    对Pclass进行分析

对Pclass进行分析

在Pclass这个特征中,等级越高,存活率越高,Pclass与Survived之间存在明显的相关性。 所以,我们决定将Pclass这个特征列入我们要建立的模型中。

    对Sex进行分析

对Sex进行分析

在Sex这个特征中,女性的存活率明显高于男性,说明性别是决定存活率的一个关键因素,应该列入要建立的模型中,帮助我们更好的预测出测试数据的存活率。

    对SibSp和Parch分析

对SibSp和Parch分析 对SibSp和Parch分析

SibSp和Parch这些特征和Survived之间不具有线性相关性,我们可以暂且称他们与Survived相关。而且,SibSp和Parch这些特征对某些值具有零相关性。最好从这些特性中派生出一个特性或一组特性来进行分析。


接下来,我们可以理解数值特征与解决目标之间的相关性,通过可视化进行数据分析。(直方图一般用于分析连续数值变量,如年龄。)

    对Age进行分析

对Age进行分析

如上图所示,我们可以得出一些结论:

    ---婴儿(年龄<4)存活率更高;

    ---最年长的乘客(80岁)存活下来;

    ---大量的15--25岁的年轻人没有生存下来;

    ---大多数乘客年龄在15-35岁之间;

    ---进而可以推出,不同年龄段的人的存活率不同,所以,我们可以对年龄进行一个更细致的划分,提高特征的精确度

    对Fare进行分析

对Fare进行分析

    ---票价越低的人的存活率越低;

    ---票价最高的乘客(500)存活了下来;

    ---进而可以推出,票价与存活率之间具有线性相关性,在以后的分析中,我们可以把连续型的数值变量进行分组,进行更精细的划分。


在进行单维度的分析完成后,我们可以对数据进行多维度的分析。

   数值与序数特征的关联

   对Pclass和Age进行分析

数值与序数特征的关联

    ---Pclass=3拥有大多数乘客,但大多数人没有存活下来;

    ---婴儿乘客在Pclass=2和Pclass=3大部分存活;

    ---大多数乘客在Pclass=1幸存;

    分类特征之间的联系

    对Embarked,Pclass,和Sex进行分析

分类特征之间的联系

对于这三个特征之间的联系,我们对数据有了更深的了解

    ---在S港口和Q港口登船的人,女性的存活率明显高于男性,C港口相反;

    ---一等级的人存活率最高;

    ---总体上,女性的存活率高;

    数值与分类特征之间的关系

    对Embarked,Sex和Fare进行分析

对Embarked,Sex和Fare进行分析

    ---更高票价的乘客有更好的生存;

    ---登船的港口与存活率有关;

    ---我觉得,对于多维度的数据探索,更多的是验证之前的一些想法与假设,还有就是对数据的一个理解,但并不是不可或缺的,而且分析的特征值很多时候是根据自己的经验而言的,每个人之间的分析并不相同。

四.对数据进行填充,转化和清洗:

通过之前对数据的探索与理解,'Ticket'和'Cabin’这两个特征应当予以删除。

删除'Ticket','Cabin'

对于数据中Name这个特征,我们还没有进行相应的分析,有人认为name这个字段对存活率没有影响,但不管怎样,咱们可以进行一个简单的验证。

对Name创建新特性进行提取 结果

对于得出的新的特性,我们决定按照得出的这个新特性就行模型训练。

将title个数较少的字段归为一类,rare类。并将错误的字段进行恢复

title与存活率的关系

根据title与存活率的关系,我们能够得出title与Survived之间存在明显的相关关系,所以,我们将title列为模型中,将分类标题转换为序数词

将分类标题转换为序数词

现在我们可以删除训练集中的Name和类似索引的PassengerId,以及测试集中的Name

删除

对name处理完成后,我们需要转换一个分类特征。现在我们可以将包含字符串的特性转化为数值,这是大多数算法模型所必须的,这样也有助我们实现目标。我们先对性别特征进行转化,女性=1,男性=0

转换一个分类特征

现在我们开始估计和完成缺失值的特性,对于下面年龄的预测,我们采取了六个组合决定年龄猜测值

分为这六组 各组年龄用中位数填充

创造一个年龄带,将各个年龄段与存活率之间进行关联

AgeBand Age用数字表示

对于AgeBand,我们可以将其删除

删除无用的AgeBand字段

接下来呢,我们创建结合现有特性的新特性,我们可以创建FamilySize这个新的特性,将Parch和SibSp结合起来,但因为FamilySize对某些值具有零相关。所以,我们又创建新的特征IsAlone,然后删除Parch,SibSp和FamilySize。

创建FamilySize IsAlone, 删除Parch,SibSp和FamilySize

还有在训练集中,Embarked中有两个缺失值,我们用众数对其进行填充

对Embarked进行分析

根据以往操作,将Embarked中的各个值用数字表示,为模型的建立做好准备

Embarked中的各个值用数字表示

观察上述数据,我们的最终结果就是将各个特征都进行具体数值的处理,对于以上数据,我们发现还有Fare特征需要进行处理,对于Fare特征,我们也对它进行相同的操作,用中位数对其进行填充,填充后就跟Age一样,对其进行分组,使分析字段更加明确。

分为四组 分组后,用具体数字表示Fare,并删除FareBand

五.建立模型,预测和解决问题:

    ---X_train为除去训练集中Survived的所有特征,这也就是用于建设各种模型的因子,Y_train为训练集中的Survived,也即是目的特征,借助X_train与Y_train,我们建立相关模型。

    ---X_test为除去PassengerId后的其他特征,通过X_train与Y_train建立的模型,我们就可以根据X_test预测出测试集的生存率。

建模

      泰坦尼克号船员的生存率问题是一个分类预测的问题。针对分类预测问题的解决办法,我们找出了几种常用的算法模型。依次是逻辑回归,支持向量机,K近邻,朴素贝叶斯,感知器,线性SVC,SGD分类器,随机森林,决策树。

    逻辑回归

逻辑回归

    支持向量机

支持向量机

    K近邻

K近邻

    朴素贝叶斯

朴素贝叶斯

    感知器

感知器

    线性SVC

线性SVC

    SGD分类器

SGD分类器

    随机森林

随机森林

    决策树

决策树

最后,我们对所运用的模型进行一个评估,选择最好的一个方法来进行答案的提交,我们可以看出,随机森林和决策树的评分一样高,这里我们选择随机森林作为最终结果的选择。

评估得分

六.提交答案:

将提交文件的格式改为题目要求的格式,并导出为CSV文件

导出文件

七:项目总结:

1.   这个项目用了整整三天才完成,虽然时间有点长,但是这是自己在kaggle上做的第一个项目,很有感觉,也很有动力,以后也要在kaggle上多做项目,付诸实战。

2.   之前总是听老师说:“学习编程很容易,但也很难,容易的是,你可以随时随地去练习,一本书,一台电脑,一双不断敲代码的手,当你敲完一两本书的时候,如果你对编程还是没有感觉,我亲自辅导你去学习;难的是,你还没有敲,就觉得不行,放弃掉了。”之前觉得老师就只是说说而已,想要促进我们去多练习,不要只拘泥于课本上的理解。但当时的我认为,首先要理解代码,理解的很透彻,才有意义去编程,要不然就是照着书本敲,毫无意义,白白浪费时间。但现在我觉得,有些东西就是要靠不断实践中,才能体会其中表达的含义,理解很重要,但不要最终只是理解了而已。所以,多动手去练习,能理解的就理解,理解不了的千万不要暂停前行的脚步,就跟着教程走就行,有时候感觉的培养就是这样一个无聊而又漫长的过程,经历过了,就是成长。

相关文章

网友评论

    本文标题:kaggle实战项目——泰坦尼克号船员存活率预测

    本文链接:https://www.haomeiwen.com/subject/hqrekftx.html