Kaggle机器学习入门实战 -- Titanic乘客生还预测
如果你打算研究机器学习或是今后想从事数据科学相关的工作,Kaggle应该是一个绕不过去的名字。
Kaggle是2010年在旧金山创立的一个数据建模和数据分析竞赛平台,在很短的时间内就声名鹊起,去年被google收购,在业界具有很高的知名度和权威性,企业可以在上面发布数据和想要解决的问题,并进行“悬赏”,数据科学家和机器学习的爱好者们可以基于这个平台提交自己的模型和预测结果,平台会根据测试集对参赛者进行评分排名,排名最高几位可以分享奖金,更重要的是,kaggle为全世界数据分析及机器学习爱好者们提供了一个交流学习的平台,里面不乏机器学习的顶尖高手,各大公司也常年在kaggle上招募比赛名次好的团队和选手,良好的kaggle竞赛履历绝对是简历上的加分项,如果你参加过多次Featured(商业问题,有奖金)和Research(学术类)类型的比赛,并且多次进入TOP10%甚至TOP5%,那么你只用蹲在家里,猎头自会找上门。
Kaggle分为5个大的板块:
- Competitions(竞赛)
分为商业竞赛、学术类竞赛、入门级竞赛和一些由大公司如Google、Fackbook不定时举办的邀请赛。
- Datasets(数据集)
公司或个人贡献的各类型的数据集,搞机器学习最怕找不到数据,kaggle给大家获取数据练习提供了一些捷径。
- Kernels(数据分析及建模)
有点类似GitHub的代码管理,说直白点就是给用户提供了云上的数据分析和建模的环境,不过涉及到代码上传,我厂童鞋请慎用...
- Discussion(讨论区)
里面有全世界各地的数据科学、机器学习的专家和爱好者,针对题目、算法、建模等热烈的讨论,冥思苦想几天的问题看看大牛们的解题思路说不定就秒懂。
- Jobs(工作)
一些公司会直接在kaggle上放出数据挖掘、机器学习类的岗位,基本都是欧美的中小型公司。
一、Kaggle竞赛的一般步骤
下图是kaggle竞赛步骤的简单示意图,中间迭代的步骤也可以看做是一般机器学习建模及验证的步骤,需要特别注意的是,比赛结束以前,kaggle提供用来验证的测试数据集是Public数据集,提供给大家进行及时验证和反馈模型效果的,所以在Publlic Leaderboard上的排名和得分并不是最终结果,待比赛结束后,会用Private数据集进行最终的计分和排名,目的是防止模型过拟合,能真正在未知数据上取得好成绩的才是优秀的模型。
好了,说了这么多,不在Kaggle上刷刷榜,怎么好意思说自己在学习数据挖掘和机器学习呢:-),我们以Kaggle上最为知名的入门题目 Titanic: Machine Learning from Disaster(利用机器学习预测泰坦尼克乘客是否生还)为例,看看怎么玩Kaggle。
二、软件环境
sklearn + numpy + pandas + seaborn
我使用的是sklearn,很成熟的机器学习框架,最新版本也支持深度神经网络,当然数据处理和可视化还需要用到numpy,pandas,seaborn,当然你也可以使用tensorflow等其他框架,kaggle并不要求上传模型本身,只需要预测结果就可以了,强烈推荐大家使用python3.6的科学发行版Anaconda,这些库里面都有。
三、理解题目&下载数据
题目地址:https://www.kaggle.com/c/titanic
这是Kaggle上热度最高的题目,迄今为止参赛的队伍已经超过10000支,基本上所有参与Kaggle的人都会拿这个题目练手。所以题目虽简单,但取得好的名次也不容易。
数据集包含3个文件:train.csv(训练数据)、test.csv(测试数据)、gender_submission.csv(预测结果提交的示例文件)
数据集中包含每个乘客的这些信息:
- Survived(生还与否) 0:遇难;1:生还 ,此信息在训练集中才有
- Pclass(船舱等级)
- Name (乘客全名)
- Sex(性别)
- Age (年龄)
- SibSp(在船上的兄弟姐妹个数)
- Parch(在船上的父母小孩个数)
- Ticket(票号)
- Fare(票价)
- Cabin(客舱号)
- Embarked(登船港口)
题目的要求就是让大家根据训练集中的各项数据建立模型,利用模型预测测试集中的乘客是否生还,准确率当然越高越好。这是一个典型的利用监督学习建模进行二分类的问题。
四、数据分析&预处理
我们先看看数据的总体情况
发现11个基本特征中Age、Cabin、Embarked都有数据缺失,其中Cabin缺失尤其多,在训练集数据量这么小的情况下,每一个特征都会对模型产生较大的影响,所以不能轻易放弃。我们先来看看离散型特征对于乘客是否生还的影响
从这些已知特征上来看,不同的取值对乘客是否生还都有较大的影响,其中“Cabin”特征缺失得较多,有差不多四分之三的数据都缺失,暂且就把这个特征值是否缺失作为条件:
年龄数据也缺失得比较多,而且这个特征很重要,不能简单地用是否缺失作为条件,该怎么补充这部分数据呢?有两种常见的方法:1、利用已有的特征拟合缺失的年龄数据,这基本上也就是一个小的机器学习模型。2、根据乘客的称谓进行分类,以分类的年龄平均数进行缺失值的填充。这里采用第二种方法,更简单也更直接。
五、特征工程
数据补齐之后,该怎么利用这些数据建立模型呢?这里面有定性的特征例如“Sex”、"Ticket"、"Embarked"等,也有定量的连续值特征如“Age”、"Fare",还有定量的离散型特征如"Pclass"、"SibSp"、“Parch”等,我统一将这些特征进行离散化,这样使得特征模型更易于理解,同时也解决了数据标准化的问题,也可以降低模型过拟合的风险,对于简单的问题来说是更优选择。
Age、Fare等连续值都采用分段处理:
以这些基本特征为输入,采用逻辑回归建立的模型,在测试集上只有75%的正确性,这只是一个最基本的模型,要想提高预测准确性,还需要再挖掘一些隐藏特征。
隐藏特征挖掘
- Tilte,乘客姓名中包含了一些特定的称谓如“Mr”、“Miss”、“Dr”、“Major”等,这些称谓不仅可以反映出乘客的性别、年龄、是否结婚、甚至社会地位,这些都是影响其生存与否的重要因素,所以可以从乘客姓名中提出一个隐含的“Title”特征,从下面的图中可以发现,"Miss"/"Mrs"/"Master"的存活率明显高于“Mr”:
-isalone,从“SibSp”和“Parch”两个特征中,可以判断出该乘客是否独自一人在船上,从常理上来看,独自一人获得的帮助较少,在灾难中较难脱身,可以考虑抽取“isalone”这个特征进行分析,从训练集的数据分析中也可以看到,单身的存活率确实要比非单身的低:
六、建模
特征重要性评估:
现在基础特征+隐藏特征一共有15个,将其离散化后变成了40个特征,过多的特征有可能会导致过拟合,所以需要看看那些特征的权重是比较高,对模型的影响更大。这里采用“卡方检测”对各个特性进行权重评分:
可以看出“Sex”、“Fare”、“Cabin”、“person”、“Pclass”是最重要的几个特征,如果出现欠拟合的情况,可以再在这几个特征上再进行组合特征分析。
建模:
特征工程基本完成后,我们就可以把特性数据放入分类器中训练得到模型,这里还是采用逻辑回归:
七、交叉验证
得到模型后,怎么判断模型的好坏呢,是过拟合还是欠拟合了?最好的方法就是做交叉验证,基本方法是把原来的训练集拿出一部分作为验证集,来评价模型的性能指标,而且很有可能模型在交叉验证上的结果好于最后提交测试集验证的结果:
怎么从学习曲线中判断模型优劣呢?如下图所示,左上图的训练准确率和交叉验证准确率都很低,属于高偏差模型,也就是欠拟合,需要增加特征数量或者采用更复杂的模型。右上图虽然训练准确率很高,但和交叉验证准确性曲线的Gap较大,属于高方差模型,也就是过拟合,需要增加训练数据或者减少特征参数。右下图属于拟合比较好的模型。
八、模型融合
做完以上工作以后,模型在测试集上的预测率是多少呢?0.80382。训练数据没法增加了,也好像挖掘不出别的特征数据了,要继续提升准确率该怎么办呢?答案就是Ensemble(模型融合),在不增加数据和特征的情况下,对预测准确性有较大的提升。
常见的模型融合有以下几种方法:
1、Voting:基于多个分类器投票的方法;
2、bagging:采用重复性有放回的随机采样生成多个模型并Voting
3、boosting:基于迭代不断修正错误的训练模型
这里采用最基本的Voting方法,顾名思义,单个分类器总会有一定的预测错误,但多个分类器一起来预测,预测结果采用投票方式,少数服从多数,就使得各分类器的短板得到一定程度的抑制,从而提升预测准确性。
这里采用了3个分类器模型做Voting:逻辑回归(Logistic Regression)、随机森林(Random Decision Forests)、多层神经网络(MLP):
九、调参
每个分类器都有很多参数,针对特定的特征参数,都有一组最优参数集,要能发挥分类器的最佳性能,就需要把这组参数集找出来。网上很多方法,这里就不细讲了,总之一句话,调参很费时间,也很考验机器的性能,绝对是个耐心活。
十、预测结果提交&排名
以当前的模型提交预测结果,正确率是0.82296,排在Top3%,还可以继续挖掘特征数据和优化模型,而且这也不是最终排名,需要等比赛结束后利用Private Data来计算最终结果,感兴趣的可以上kaggle自己做一做。
作者|周捷
- 点赞
- 收藏
- 关注作者
评论(0)