Kaggle是一个国际上的大数据竞赛的平台,上面有非常多的数据项目供全球的数据从业者们来挑战。一方面获得好的排名可以为自己的简历增添色彩,另外一方面通过真实项目的练习,是一种非常好的方式来学习Data Analysis,Machine Learning,Data Mining这些技能。它的slogan就是“challenge yourself with real-world machine learning problems”。
个人也是第一次做kaggle的项目,在平台的推荐下,选择了更适合初学者的项目“Predict survival on the Titanic and get familiar with ML basics”。(提示一下,Kaggle平台的项目类型非常多:有汽车领域,医疗领域,房地产领域,公共交通领域,医疗领域,商业领域,互联网领域等)
一,了解项目背景:
泰坦尼克号的沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在首次航行中,泰坦尼克号在与冰山相撞后沉没,2224名乘客和机组人员中有1502人遇难。这场轰动的悲剧震撼了国际社会,并导致了更好的船舶安全条例。海难导致生命损失的原因之一是乘客和机组人员没有足够的救生艇。虽然幸存下来有一些运气因素,但一些人比其他人更有可能生存,比如妇女,儿童和上层阶级。在这个挑战中,我们要求你完成对哪类人可能生存的分析。我们特别要求你运用机器学习的工具来预测哪些乘客幸免于难。
原始数据:
我们的数据分为两个部分,一个训练集一个测试集。训练集是部分船员的真实幸存数据,我们用它来训练我们的模型。测试集只有每位船员的特征,却没有最后的生存结果,我们要做的就是通过自己训练的模型来预测这些测试集里面的船员,哪些人才能真正活下来。
上面就是我们数据集中包含的特征,从上到下分别是:幸存与否,票类(代表社会经济学地位1表示上层,2代表中层,3代表下层),性别,年龄,船上兄弟姐妹配偶的数量(对个人),船上父母孩子的数量(对个人),票号,票价,客舱号码,登船的港口。
二,数据探索分析:
首先我们得了解一下项目的数据到底是什么样子的:
查看每个特征下的数据完整性:
为了统一数据的处理,我们将data_train与data_test连接为一个数据组。我们同时可以看一下data的描述性统计结果。
从之前的描述中,我们可以看到我们有的数据特征是数值型的数据,有的是分类型的数据,我们要对数据进行建模,就需要将数据进行归一化处理。我们首先来处理分类型的数据。
分类数据主要有Name,Sex,Ticket,Cabin,Embarked。除此之外,还有Pclass已经在原始数据中处理好了。
我们来分别看一下这些数据和生存率之间的关系到底大不大。
从票类(Pclass)与Survived(幸存)之间的关系看,高阶层的人生存率明显要高于低阶层的人。这里我们就可以做出 一个假设:
假设一:高阶层的人要比低阶层的人更容易生存下来。
假设二:女性比男性更容易在灾难中生存。
从上面可以看出拥有兄弟姐妹配偶的总数量,父母儿女总数量和生存率之间是具有相关性的,但是他们没有明显的趋势性。因此在这里,我们只能这样假设:
假设三:家庭成员的数量和生存率相关。
关于年龄这个特征我们可以看见一个有趣的事,在20—40岁这个年龄区间内,出现了高死亡率,高生存率的现象。如果单看一个图表,就很有可能会对我们造成误导。而出现这种情况的原因,个人认为是由于年龄在20-40岁的用户量较多造成的。因此这里我们暂时不做假设,下面对不同年龄在不同特征进行细分。
从上面的途中我们可以看出来,处于上层阶级(Pclass=1)的情况下,年龄阶段在20-60岁的人生存力相对较高,而处于下层阶级20-40岁的人出现了高死亡率的现象。
上面这张图展示的是性别,登船口,社会阶级不同情况下各自的生存率。我们看到一个有趣的现象,在C港口登陆的人男性的生存率是明显高于女性的生存率的。并且在Q港口,男性的生存率远低于其他港口的男性,并且上层阶层的人(Pclass=1)生存率竟然低于下层阶层(Pclass=3)。
加入票价之后,我们可以看到,幸存者的票价是远高于死亡者的票价的(在S,C港口),而在Q港口,生存和死亡的票价基本相等。
综合上面的数据探索我们可以发现,年龄(Age),性别(Sex),阶级(Pclass),登陆港口(Embarked),票价(Fare),拥有的兄弟姐妹配偶数量(SibSp),父母儿女而女数量(Parch)都和生存率(Survived)之间存在着显著的相关性。下面我们需要进行的就是对数据进行处理,便于后面建立模型。
三,数据清洗及处理:
首先我们需要将数据表中没有用处的数据全部剔除掉,这里我们首先剔除的是Ticket(票号)和Cabin(船舱号)这两个没有任何价值信息的数据。
再次剔除训练集中的PassengerId,只保留特征数据。并且我将Name也理解为无用的数据,个人认为它和生存率之间不存在太大的关联性。因此删除数据集中的Name列。
性别替换:女性为1,男性为0,并将它们设置为数值型。
下面我们对年龄的缺失值进行处理,一般意义上我们处理缺失值有以下几种方式:
1.对于确实量占到总体数量一半以上的特征,我们可以将其删除。
2.对于部分缺失的数据,我们可以直接用中位数,众数或平均数来替换,但往往会丢失数据的敏感性。
3.用机器学习的方式建立模型,然后对缺失值进行预测。
这里我们选取了第二种方式,为了避免数据大面积失真,我们用联合了Sex和Pclass针对每一种组合都取出他们的年龄中位数,最后再根据缺失值的组合,将计算的值放进去。
年龄本身是一个连续型数值型的数据,现在我们将年龄变成分类化的数据。我们新建一个特征来表示年龄分组,不同年龄分组下的人生存率也是不同的。
对年龄进行分组操作,分组完成后将分组特征剔除,只保留年龄特征。
我们新建一个特征来联合表示SibSp和Parch,他们都是家庭成员,我么用一个特征FamilySize来表示。从下面的图中我们可见家庭人数的数量和生存率相关度还是比较高的。
我们再创建一个特征表示这样的一个人他是独自来的或者是跟家人一起来的。用这样一个特征来替代家庭成员。
删除家庭成员的其他特征,哟isAlone来代替。
新建一个联合了年龄和Pclass的人工特征。
在登陆港口(Embarked)这个特征中,有两个缺失数据,我们用最简单的方式将其填充即可。
将Embarked也变成数值型的数据,便于后面建立模型。
下面要处理的特征就是Fare,我先将其缺失值用中位数的方式进行填充,然后将其变为由范围表示的FareBrand。
我们对Fare进行替换后,我们就可以删掉新建的FareBrand特征,然后我们整个数据清洗的工作就结束了。
四,建立模型:
在开始建立模型之前,我们先要对训练集,测试集中的数据做一个概览。
我们将训练数据集中除去Survived的部分作为最终训练数据,而把训练集中的Survived作为结果值,将其称为验证集。而把测试集中除去passengerId的数据作为测试数据输入值。
泰坦尼克号船员生存率问题是一个分类预测问题,为了找到最优模型。我们导入多个数据挖掘算法来建立模型。从上到下依次是:逻辑回归,支持向量机,随机森林,K近临,朴素贝叶斯,感知器,决策树。
首先用逻辑回归来拟合,最后的准确率为78.9%:
再试试决策树和随机森林:
其他算法的拟合过程就不一一列举了,拟合的得分如下表所示,其中随机森林和决策树的准确度最高为86.87%。
最后我选择随机森林算法模型的预测结果作为最终结果,将其最终结果导出csv文件。
最后我们的结果就是下图所示的样子,对不同id的用户它是否能生存给出了结论。
最终平台给的评分为0.773分,Top62%。算是第一次项目的一个评价吧。
五,回顾与总结
1.整个项目过程中,最为主要的部分其实就是在数据的处理与特征的建立这一块,尤其是对于缺失值的处理,特征的转化,新特征的转化等等。自己得分不高,也是在这一块没有优势,后面可以多研究一下特征工程相关的内容。
2.对数据的理解同样也是影响我们模型准确率很大的一部分,比如说,我认为Name这个特征是无用的,就将其删除了,而有的同学则认为它是一个必要特征,应该保留。这就是对数据的理解不同了,最终导致的结果也肯定不同。因此后面在做数据分析的时候,我们首先应该做的就是去理解业务,理解数据,避免自己不了解业务,然后瞎分析一通,这就是典型的为了分析二分析,应当极力避免。
3.只有练习,才能真正提高,之前也看过一些关于数据挖掘,机器学习的书,但对于这些东西也只是知道,想要去做点东西,确实无从下手。通过这一次的练习,感觉对Data Mining的过程清晰多了,后面要做的就是不断地练习,将技能强化为能力。