kaggle是一个非常适合初学者去实操实战技能的一个网站,它可以根据你做的项目来评估你的得分和排名。让你对自己的能力有更清楚的了解,当然,在这个网站上,也有很多项目的教程,可以跟着教程走,慢慢熟悉各种操作。在平时的学习中,我们了解到的知识更多的是理论,缺少一个实战的平台,项目的练习。我对kaggle的了解也是基于实战的需要,想做一些项目来巩固我的认知,发现更多有用的技能。
这篇文章就是我在kaggle上做的第一个项目,也是kaggle推荐的新手项目,泰坦尼克号存活率预测。 这个项目从一组样本中,列出幸存或未存活泰坦尼克号灾难的乘客以及乘客的信息(例如,年龄,性别,姓名等),需要我们建立适当的模型,根据出给定出的测试数据集中不包含生存的信息,预测测试集中的这些乘客能否存活。
针对这个项目,我的工作流程有七步:
1. 问题描述
2. 加载训练集数据和测试集数据
3. 分析,探索数据关系
4. 对数据进行填充,转化和清洗
5. 建立模型,预测和解决问题
6. 可视化报告,解决问题,提交答案
7. 项目总结
一. 问题描述:
1912年4月15日,泰坦尼克号在首航期间沉没,撞上冰山,2224名乘客和机组人员中有1502人丧生。只有32%的存活率。 这场灾难导致人命损失的原因之一是,船上没有足够的救生艇供乘客和船员使用。 尽管在沉船事件中幸存下来有运气因素,但是有些群体比其他群体更有可能存活下来,比如妇女、儿童和上层阶级。 所以,针对这个问题,我们借助已有数据(也就是训练集数据)建立了一个预测模型,对不包含存活率的测试集数据做一个简单的预测。
二.加载训练集数据和测试集数据:
引入所需要的数据库和数据挖掘的一些算法
![](https://img.haomeiwen.com/i2085886/82bc7595120f2156.png)
获取训练集数据和测试集数据,并联合两者数据
![](https://img.haomeiwen.com/i2085886/d5c28b111307b85b.png)
三.分析,探索数据关系:
首先呢,我们查看数据类型信息,对数据的情况有个大概的了解
![](https://img.haomeiwen.com/i2085886/5072ab70d47ad078.png)
![](https://img.haomeiwen.com/i2085886/eaa66ee55f475ed5.png)
![](https://img.haomeiwen.com/i2085886/5767394edfbc8f43.png)
根据以上信息,我们可以得出训练数据中,Cabin缺失值比较多,其次是Age,Embarked.测试集数据中,Cabin的缺失值最多,其次是Age,Fare。
对于缺失数据的处理:
如果特征缺失值超过一半,我们可以直接认为该特征对目的预测没有影响,可以直接删除该特征。
如果特征的缺失值较少,我们一般采用去掉缺失数据后,数据的中位数或众数填充。
用机器学习的方式建立模型,然后对缺失值进行预测
在对数据有个简单的了解后,我们查看一下导入的数据是什么样子
![](https://img.haomeiwen.com/i2085886/e073ca232a229014.png)
![](https://img.haomeiwen.com/i2085886/c18ca5fc9308c46d.png)
所以,我们导入的数据就是如上图所示的数据。接下来呢,我们就来看一下对数据的描述性分析,这是数据分析中必不可少的一步。
![](https://img.haomeiwen.com/i2085886/313de69fb998b0a5.png)
根据对训练集数据的描述性分析,我们可以得到如下的信息:
---总共人数是泰坦尼克号船上的乘客总数2224人,实际的训练集数据为891人;
---存活是一个具有0和1的绝对数值的特征;
---大部分乘客(>75%)的人都没有带父母和孩子出行;
---接近30%的乘客和兄弟姐妹或配偶出行;
---年龄在60-80岁之间的人很少;
---价格差别很大,很少乘客支付高价格(512)船
![](https://img.haomeiwen.com/i2085886/7cc0e22d353bcfbd.png)
针对分类数据的特征,我们可以得出:
---在训练数据集中,名称是唯一的(计数=唯一=891);
---性别变量为两个值,有65%名男性(最高=男性,freq=577/计数=891);
---Embarked有三个值,最多的是“S”;
在对数据进行简单的分析了解后,我们需要对数据进行探索,发现数据之间的关系,以及数据与目的特征的相关性。接下来,我们利用图表,数据的可视化来对数据进行简单的探索。
首先,我们针对没有空值的序数特征,分类特征以及离散特征进行单维度的探索,发现他们与存活率之间的相关性。
对Pclass进行分析
![](https://img.haomeiwen.com/i2085886/38e1f7073cafafe1.png)
在Pclass这个特征中,等级越高,存活率越高,Pclass与Survived之间存在明显的相关性。 所以,我们决定将Pclass这个特征列入我们要建立的模型中。
对Sex进行分析
![](https://img.haomeiwen.com/i2085886/34888b73b79a2d2a.png)
在Sex这个特征中,女性的存活率明显高于男性,说明性别是决定存活率的一个关键因素,应该列入要建立的模型中,帮助我们更好的预测出测试数据的存活率。
对SibSp和Parch分析
![](https://img.haomeiwen.com/i2085886/b882b2904ceded04.png)
![](https://img.haomeiwen.com/i2085886/0d864b48085aa2d8.png)
SibSp和Parch这些特征和Survived之间不具有线性相关性,我们可以暂且称他们与Survived相关。而且,SibSp和Parch这些特征对某些值具有零相关性。最好从这些特性中派生出一个特性或一组特性来进行分析。
接下来,我们可以理解数值特征与解决目标之间的相关性,通过可视化进行数据分析。(直方图一般用于分析连续数值变量,如年龄。)
对Age进行分析
![](https://img.haomeiwen.com/i2085886/cf5c6a105289f81e.png)
如上图所示,我们可以得出一些结论:
---婴儿(年龄<4)存活率更高;
---最年长的乘客(80岁)存活下来;
---大量的15--25岁的年轻人没有生存下来;
---大多数乘客年龄在15-35岁之间;
---进而可以推出,不同年龄段的人的存活率不同,所以,我们可以对年龄进行一个更细致的划分,提高特征的精确度
对Fare进行分析
![](https://img.haomeiwen.com/i2085886/eb129e74abf02363.png)
---票价越低的人的存活率越低;
---票价最高的乘客(500)存活了下来;
---进而可以推出,票价与存活率之间具有线性相关性,在以后的分析中,我们可以把连续型的数值变量进行分组,进行更精细的划分。
在进行单维度的分析完成后,我们可以对数据进行多维度的分析。
数值与序数特征的关联
对Pclass和Age进行分析
![](https://img.haomeiwen.com/i2085886/4d2e836ebf73dc17.png)
---Pclass=3拥有大多数乘客,但大多数人没有存活下来;
---婴儿乘客在Pclass=2和Pclass=3大部分存活;
---大多数乘客在Pclass=1幸存;
分类特征之间的联系
对Embarked,Pclass,和Sex进行分析
![](https://img.haomeiwen.com/i2085886/e3f19848988049d2.png)
![](https://img.haomeiwen.com/i2085886/e38c43aefcce29fc.png)
对于这三个特征之间的联系,我们对数据有了更深的了解
---在S港口和Q港口登船的人,女性的存活率明显高于男性,C港口相反;
---一等级的人存活率最高;
---总体上,女性的存活率高;
数值与分类特征之间的关系
对Embarked,Sex和Fare进行分析
![](https://img.haomeiwen.com/i2085886/79b07ac5959f9927.png)
![](https://img.haomeiwen.com/i2085886/402fda4fbf9d372d.png)
---更高票价的乘客有更好的生存;
---登船的港口与存活率有关;
---我觉得,对于多维度的数据探索,更多的是验证之前的一些想法与假设,还有就是对数据的一个理解,但并不是不可或缺的,而且分析的特征值很多时候是根据自己的经验而言的,每个人之间的分析并不相同。
四.对数据进行填充,转化和清洗:
通过之前对数据的探索与理解,'Ticket'和'Cabin’这两个特征应当予以删除。
![](https://img.haomeiwen.com/i2085886/f83e7084d4fc1d92.png)
对于数据中Name这个特征,我们还没有进行相应的分析,有人认为name这个字段对存活率没有影响,但不管怎样,咱们可以进行一个简单的验证。
![](https://img.haomeiwen.com/i2085886/a77daa40ccd96aa8.png)
![](https://img.haomeiwen.com/i2085886/009de25d1b00f66e.png)
对于得出的新的特性,我们决定按照得出的这个新特性就行模型训练。
将title个数较少的字段归为一类,rare类。并将错误的字段进行恢复
![](https://img.haomeiwen.com/i2085886/e5cc0ccdfff870e6.png)
根据title与存活率的关系,我们能够得出title与Survived之间存在明显的相关关系,所以,我们将title列为模型中,将分类标题转换为序数词
![](https://img.haomeiwen.com/i2085886/cde35637816cb5e9.png)
现在我们可以删除训练集中的Name和类似索引的PassengerId,以及测试集中的Name
![](https://img.haomeiwen.com/i2085886/67271f375746afe7.png)
对name处理完成后,我们需要转换一个分类特征。现在我们可以将包含字符串的特性转化为数值,这是大多数算法模型所必须的,这样也有助我们实现目标。我们先对性别特征进行转化,女性=1,男性=0
![](https://img.haomeiwen.com/i2085886/b37abd4bb9bc32a4.png)
现在我们开始估计和完成缺失值的特性,对于下面年龄的预测,我们采取了六个组合决定年龄猜测值
![](https://img.haomeiwen.com/i2085886/69c70752d9ed65ab.png)
![](https://img.haomeiwen.com/i2085886/2ff24dd66f77572f.png)
创造一个年龄带,将各个年龄段与存活率之间进行关联
![](https://img.haomeiwen.com/i2085886/6e4bd15358ef7f04.png)
![](https://img.haomeiwen.com/i2085886/e3d062ea9f3dbf78.png)
对于AgeBand,我们可以将其删除
![](https://img.haomeiwen.com/i2085886/99807394bf625925.png)
接下来呢,我们创建结合现有特性的新特性,我们可以创建FamilySize这个新的特性,将Parch和SibSp结合起来,但因为FamilySize对某些值具有零相关。所以,我们又创建新的特征IsAlone,然后删除Parch,SibSp和FamilySize。
![](https://img.haomeiwen.com/i2085886/aa917b1a3e00434b.png)
![](https://img.haomeiwen.com/i2085886/c2c4b8bdd16735a6.png)
还有在训练集中,Embarked中有两个缺失值,我们用众数对其进行填充
![](https://img.haomeiwen.com/i2085886/d287fa0ada51f3ee.png)
根据以往操作,将Embarked中的各个值用数字表示,为模型的建立做好准备
![](https://img.haomeiwen.com/i2085886/a97b6044a0061877.png)
观察上述数据,我们的最终结果就是将各个特征都进行具体数值的处理,对于以上数据,我们发现还有Fare特征需要进行处理,对于Fare特征,我们也对它进行相同的操作,用中位数对其进行填充,填充后就跟Age一样,对其进行分组,使分析字段更加明确。
![](https://img.haomeiwen.com/i2085886/f67db172ff0d84ed.png)
![](https://img.haomeiwen.com/i2085886/7eeff8ea5f976391.png)
五.建立模型,预测和解决问题:
---X_train为除去训练集中Survived的所有特征,这也就是用于建设各种模型的因子,Y_train为训练集中的Survived,也即是目的特征,借助X_train与Y_train,我们建立相关模型。
---X_test为除去PassengerId后的其他特征,通过X_train与Y_train建立的模型,我们就可以根据X_test预测出测试集的生存率。
![](https://img.haomeiwen.com/i2085886/0f41bb76f254474f.png)
泰坦尼克号船员的生存率问题是一个分类预测的问题。针对分类预测问题的解决办法,我们找出了几种常用的算法模型。依次是逻辑回归,支持向量机,K近邻,朴素贝叶斯,感知器,线性SVC,SGD分类器,随机森林,决策树。
逻辑回归
![](https://img.haomeiwen.com/i2085886/8325b7e8316e148d.png)
支持向量机
![](https://img.haomeiwen.com/i2085886/04f3507968b34dec.png)
K近邻
![](https://img.haomeiwen.com/i2085886/3b068ff3bf8fd259.png)
朴素贝叶斯
![](https://img.haomeiwen.com/i2085886/54d44d3fab722826.png)
感知器
![](https://img.haomeiwen.com/i2085886/60cfef4ad22b2884.png)
线性SVC
![](https://img.haomeiwen.com/i2085886/27a60efa097ada9b.png)
SGD分类器
![](https://img.haomeiwen.com/i2085886/ca4764d5694359dc.png)
随机森林
![](https://img.haomeiwen.com/i2085886/21127c5da68ccbf2.png)
决策树
![](https://img.haomeiwen.com/i2085886/745d0d10c55accf5.png)
最后,我们对所运用的模型进行一个评估,选择最好的一个方法来进行答案的提交,我们可以看出,随机森林和决策树的评分一样高,这里我们选择随机森林作为最终结果的选择。
![](https://img.haomeiwen.com/i2085886/9992ac8f311478a9.png)
六.提交答案:
将提交文件的格式改为题目要求的格式,并导出为CSV文件
![](https://img.haomeiwen.com/i2085886/a96b104995720981.png)
七:项目总结:
1. 这个项目用了整整三天才完成,虽然时间有点长,但是这是自己在kaggle上做的第一个项目,很有感觉,也很有动力,以后也要在kaggle上多做项目,付诸实战。
2. 之前总是听老师说:“学习编程很容易,但也很难,容易的是,你可以随时随地去练习,一本书,一台电脑,一双不断敲代码的手,当你敲完一两本书的时候,如果你对编程还是没有感觉,我亲自辅导你去学习;难的是,你还没有敲,就觉得不行,放弃掉了。”之前觉得老师就只是说说而已,想要促进我们去多练习,不要只拘泥于课本上的理解。但当时的我认为,首先要理解代码,理解的很透彻,才有意义去编程,要不然就是照着书本敲,毫无意义,白白浪费时间。但现在我觉得,有些东西就是要靠不断实践中,才能体会其中表达的含义,理解很重要,但不要最终只是理解了而已。所以,多动手去练习,能理解的就理解,理解不了的千万不要暂停前行的脚步,就跟着教程走就行,有时候感觉的培养就是这样一个无聊而又漫长的过程,经历过了,就是成长。
网友评论