Kaggle项目—泰坦尼克号生存预测

        学习了数据分析之后,由于忙着准备毕业课题,没有时间记录数据分析的项目。泰坦尼克号生存预测是Kaggle上的经典竞赛项目。在泰坦尼克号的乘客中有男有女,有老有幼,有社会上流人士,也有底层群众。在救人的时候并不是随机的,我们利用乘客信息分析获救乘客的规律。一开始代码是在IDLE下编写的,后面为了展示每一步的结果,重新转到了Jupyter notebook下,做数据分析非常方便。

源代码我已经上传到Github,GitHub - missbai119/Code at Kaggle_titanic

项目链接:Titanic: Machine Learning from Disaster | Kaggle

一、思路

1.数据获取

2.数据观察

3.数据清洗

4.建立模型并预测


1.数据获取

数据在Kaggle中直接进行下载,包括训练集(train.csv)及测试集(test.csv),数据下载地址链接:https://www.kaggle.com/c/titanic/data

2.数据观察

导入数据


读取数据

pandas是常用的Python数据处理库,读入的csv文件转为dataframe格式,可以看到读入的data_train数据如下,共有891行数据:


数据内容

数据中共有12列,Survived字段表示该乘客是否获救,其余为乘客信息,包括:

PassengerId--乘客Id

Pclass--乘客等级(1/2/3等舱)

Name--乘客姓名

Sex--性别

Age--年龄

SibSp--堂兄弟/妹个数

Parch--父母与小孩个数

Ticket--船票信息

Fare--票价

Cabin--客舱

Embarked--登船港口

用data_train.info()观察数据的属性,由此可知共有891名乘客,数据中有一些缺失值,Cabin有非常多的缺失值。


数据缺失值情况

利用data_train.describe()再获得数据型数据的分布情况,加深对数据的认识,对数据的认识是数据分析的关键。


数据分布情况

乘客的属性很多,我们的目标是分析属性和最后Survived之间存在怎样的关系。

我们需要借助图来观察乘客属性与结果之间的关系,将乘客属性信息借助图来展示


代码


乘客属性分布情况

由上面的图可以看出一些信息,比如获救人数不到总数的一半;三等舱的人数最多,并且二等舱、三等舱的乘客20到30岁的乘客最多,头等舱里40岁左右的人最多;登船港口S人数最多,且S,C,Q人数递减。

思考一下:不同舱的乘客可能与财富或社会地位有关,最后获救的可能性会不会不一样;年龄与最后是否获救应该也有影响;是否获救和登船港口有没有关系,也许登船港口与社会地位和财富有关系。

接下来分析一下各个等级的乘客获救情况


乘客等级与获救情况


各等级乘客获救情况

由上图可以看出,头等舱的乘客获救概率最高,三等舱获救概率很低,因此乘客等级与是否获救有关系。

分析一下性别与获救的关系


代码


性别与获救情况

由此图可以看出,女性获救概率比男性高。

3.数据清洗

数据中缺失值比较严重的Cabin,按照有无数据处理为Yes和No两种类型。Age也有一些缺失,并且年龄对最后结果有影响。数据中Age确实的个数不是特别多,可以根据已有的数据值,拟合补全数据。采用scikit-learn中的RandomForest来拟合缺失的年龄数值。



代码
缺失值处理后

建立逻辑回归模型需要将数据转化为数值型特征


代码

Age和Fare两个属性的数值幅度有点大,会影响收敛速度,对两个属性处理一下


代码

4.建立逻辑回归模型


代码

对test_data同样需要数据处理


代码

预测结果保存在本地为csv格式


预测结果部分截图


要判定一下当前模型所处状态(欠拟合/过拟合)

如果我们不断地做feature engineering,产生的特征越来越多,再用这些特征去训练模型,训练数据拟合的很好,然而模型的泛化能力逐渐弱化,就会在预测数据上准确率不高,即模型的过拟合问题。

此外,如果模型在训练数据上准确率不高,也有可能是出现了欠拟合问题。

通常,对于过拟合现象会挑选出比较好的feature的子集来做训练或提供更多的训练数据。对于欠拟合问题,通常需要更多的特征,更复杂的模型提高准确率。

learning curve可以帮助我们判定模型所处的状态。以样本数为横坐标,训练和交叉验证集上的错误率为纵坐标,也可以把错误率替换成准确率。

用scikit-learn里面的learning_curve来帮我们分辨模型的状态。


交叉验证

交叉验证是指将数据分成大小相同的k份,在每次运行中选取其中一份作为检查集,其余的全作为训练集,该过程重复k次,使得每份数据都用于检验恰好一次。

在本例中我们把train.csv分成两部分,一部分用于训练模型,另一部分数据用于预测算法的效果。



大家可以自己跑一遍试试,拿到bad cases之后,仔细看看。也会有一些猜测和想法。其中会有一部分可能会印证在系数分析部分的猜测,那这些优化的想法优先级可以放高一些。

现在有了”train_df” 和 “vc_df” 两个数据部分,前者用于训练model,后者用于评定和选择模型。可以开始可劲折腾了。

随便列一些可能可以做的优化操作:

Age属性不使用现在的拟合方式,而是根据名称中的『Mr』『Mrs』『Miss』等的平均值进行填充。

Age不做成一个连续值属性,而是使用一个步长进行离散化,变成离散的类目feature。

Cabin再细化一些,对于有记录的Cabin属性,我们将其分为前面的字母部分(我猜是位置和船层之类的信息) 和 后面的数字部分(应该是房间号,有意思的事情是,如果你仔细看看原始数据,你会发现,这个值大的情况下,似乎获救的可能性高一些)。

Pclass和Sex俩太重要了,我们试着用它们去组出一个组合属性来试试,这也是另外一种程度的细化。

单加一个Child字段,Age<=12的,设为1,其余为0(你去看看数据,确实小盆友优先程度很高啊)

如果名字里面有『Mrs』,而Parch>1的,我们猜测她可能是一个母亲,应该获救的概率也会提高,因此可以多加一个Mother字段,此种情况下设为1,其余情况下设为0

登船港口可以考虑先去掉试试(Q和C本来就没权重,S有点诡异)

把堂兄弟/兄妹 和 Parch 还有自己 个数加在一起组一个Family_size字段(考虑到大家族可能对最后的结果有影响)

Name是一个我们一直没有触碰的属性,我们可以做一些简单的处理,比如说男性中带某些字眼的(‘Capt’, ‘Don’, ‘Major’, ‘Sir’)可以统一到一个Title,女性也一样。

可以使用手头上的”train_df”和”cv_df”开始试验这些feature engineering的tricks是否有效了。

试验的过程比较漫长,也需要有耐心,而且我们经常会面临很尴尬的状况,就是我们灵光一闪,想到一个feature,然后坚信它一定有效,结果试验下来,效果还不如试验之前的结果。





从得到的学习曲线来看,虽然不光滑,训练集和交叉验证集上的得分曲线走势符合预期。目前的曲线来看,我们的模型不处于过拟合状态,一次我们可以再做一些特征工程的工作,添加一些新的特征或组合特征到模型中。

模型融合(model ensemble)

比如我们手头上有一堆在同一份数据集上训练得到的分类器(比如logistic regression,SVM,KNN,random forest,神经网络),那我们让他们都分别去做判定,然后对结果做投票统计,取票数最多的结果为最后结果

现在我们没有别的模型可选,可以在数据上做改动。不用全部的数据都用于训练,而是每次选训练集的一个子集做训练,虽然用同一个算法,但得到的模型却是不一样的,即使出现过拟合现象,也只是在一个子训练集上出现过拟合,这就是常用的Bagging.


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,607评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,047评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,496评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,405评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,400评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,479评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,883评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,535评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,743评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,544评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,612评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,309评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,881评论 3 306
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,891评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,136评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,783评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,316评论 2 342

推荐阅读更多精彩内容