问题背景
船沉了,大家惊慌逃生,但是没有足够的救生艇。是否获救并非随机,有些群体比其他人更有可能生存,如妇女、儿童和上层阶级等等。
数据集是乘客的个人信息以及存活状况,根据已有数据集生成模型预测其他人的存活情况。
该问题是一个二分类问题。
数据概览
pandas中的dataframe类可以比较方便的处理.csv 文件,读入train.csv中的数据如下:
先来看看训练集的一些基本情况:
由上面的数据可以看出训练集中一共含有891位乘客,12列属性中年龄(714项)和客舱(204项)数据有缺省项。
属性分析:
下面结合实际情况,分析一下12个属性。
PassengerId:乘客Id,这个和Survived基本没什么关系。
Survived:0代表没有获救,1代表获救。
Pclass:1,2,3分别代表仓位等级;根据背景,头等舱可能会获得更多的救援资源,优先安排救援,要重点关注。
Name:姓名,这个关联度不是很强,可以放一放做备选。
Sex:根据情景,可能会优先救援女性,这个需要关注一下。
Age:一般来说会先安排小孩和老人,青壮年的逃生概率会比较大,这个要看下具体情况,需要关注下。
SibSp:兄妹妻子等的个数,这个看起来是个对获救有益的因子,互帮互助的话可能成功率更高,可以关注下。
Parch:老人孩子的个数,如果有老人和小孩,要先安排老人和小孩,然后才是自己,看起来是个负相关因子,需要关注一下。
Ticket:船票号,这个没有发现明显的规律,暂时先放一放。
Fare:票价,和Pclass可能有对应关系,可以关注下。
Cabin:仓位,这个是个地理位置特征,和获救有一定的关系,但是无法结合具体的仓位分布图,不确定离甲板的距离,而且缺失项较多,这个前面可以先放一放,优化的时候再做其他处理。
Embarked:港口,这个可能和获救有关系,可以关注下。
数值型属性一览:
下面看看数值型数据的基本分布情况:
由mean字段可以知道,大约38%的人获救了;结合分位数,船上人员年龄集中在20-40之间,平均年龄约30岁,pclass的1/4分位数是2,说明买1等舱的人数很少。
我们看一下需要关注的属性的分布情况:
由图能进一步得出的信息是:
- 获救的人数未达半数;
- 3等舱的乘客非常多,远超其余2类;
- 女性约占总人数的1/3;
- 大多数人未同亲人同行;
- Fare与Pclass并未成阶梯状分布,fare与Survived的关系有待挖掘;
- S港口登陆的乘客最多;
相关性分析:
进一步,我们看一下各属性与Survived之间的相关性:
Pclass:可以看到1等舱和2等舱的存活率明显高于3等舱,说明存活率和舱位等级还是有关系的,这个可以作为因子。
Sex:女性的存活率要远高于男性,Sex也是一个因子。
Age:年龄这个属性和存活率的相关性不是特别明显,但是真的不是优先照顾老人和小孩吗?这个属性先放一放,后面优化的时候再挖掘。
SibSp:由图得知,在3和4的这个位置存活率较高,是不是越多存活率越高,这里不太确定,后面再挖掘,这个属性可以作为一个备用因子。
Parch:这个图可以看到存活率随父母小孩数量增加在增加,至于是不是越多越好这个图看不出来,这个关系放到后面挖掘,这个属性可以作为一个备用因子
票价竟然没有显著作用,fare这个属性我们先放一放。
cabin这个属性缺失项比较多,我们暂时先放弃。
C港口的存活率最高,Embarked属性可以作为一个因子。
数据预处理
训练集中,Age和Cabin是有缺失的。
通常遇到缺值的情况,我们会有几种常见的处理方式:
- 如果缺值的样本占总数比例极高,我们可能就直接舍弃了,作为特征加入的话,可能反倒带入noise,影响最后的结果了
- 如果缺值的样本适中,而该属性非连续值特征属性(比如说类目属性),那就把NaN作为一个新类别,加到类别特征中
- 如果缺值的样本适中,而该属性为连续值特征属性,有时候我们会考虑给定一个step,然后把它离散化,之后把NaN作为一个type加到属性类目中。
- 有些情况下,缺失的值个数并不是特别多,那我们也可以试着根据已有的值,拟合一下数据,补充上。
Age比较符合后面2种情况,从年龄的分布来看,年龄比较符合正态分布,这里我们取年龄的均值进行填充。
Cabin符合第一种情况,我们先放弃。
接下来,Sex和Embarked为非数值型数据,我们先转换成int型数据。
现在,选入的因子都成为数值型的了,但是Age和Fare的幅度有点宽,这个会影响收敛速度。可以用scikit-learn里面的preprocessing模块对这俩属性做一个scaling,将范围锁定到[-1,1]。
现在,初步的数据处理完了,接下来可以建模了。
【目录】