Code on GitHub
系列文章:
关于Kaggle入门Titanic的一次简单尝试 – 逻辑回归(Logistic Regression)
关于Kaggle入门Titanic的一次简单尝试 – Part 2
接上回简单尝试中发现的几个问题,这次的文章准备做以下几个尝试:
- 用更可靠的方法估计缺失的Age信息
- 考虑Cabin特征
- 希望把Fare和Ticket这两个特征值也纳入模型中
- 更加地dive into Machine Learning
首先讨论一下Kaggle上预测结果submission评价的问题吧,
Kaggle上score的定义是categorization accuracy那就是预测的准确率了。根据最近研究了很多帖子的结果,基本上一个简单的regression就可以75%以上的准确率,如果综合考虑多一些模型再vote就可以实现80%以上的准确率,贴一个网上各个模型预测结果参考一下
Model Score
Random Forest 86.76
Decision Tree 86.76
KNN 84.74
Support Vector Machines 83.84
Logistic Regression 80.36
Linear SVC 79.12
Perceptron 78.00
Stochastic Gradient Decent 77.89
Naive Bayes 72.28
所以我认为就预测的准确率来说,刻意找各种方法来提高并不是很重要。做这个Case的主要目的是希望通过分析这个案例中的features并且架构起ML的基本框架就好。
至于上次的分析框架并不规范,这次就规范的来
数据清洗(Data Cleaning)
这边重新处理缺失的Cabin,Age,Embarked和Fare四个特征
Cabin
大家对cabin的考虑基本都是在于cabin这个特征值存不存在的问题,原因的话基本上是有cabin信息的乘客生还率要明显大于没有cabin信息的乘客
full.loc[full.Cabin.notnull(),'Cabin']=1
full.loc[full.Cabin.isnull(),'Cabin']=0
full['Survived'].groupby(full.Cabin).mean().plot.bar()
推测可能导致这种结果的原因是,可能当时在船上并不是每一个人都有自己的舱位的。所以相对于在船上没有固定舱位比较不安定的乘客来说,有舱位的乘客在遇到危机时就会得到更多的保障,make sense
Age
年龄这个变量的话我也研究了很多网上的做法,最普遍的还是使用Title将乘客分类,再赋予一个组内的median或者mode给missed value赋值。所以我也基本采用了这个方法,
首先获取Title
full['Title']=full['Name'].apply(lambda x: x.split(',')[1].split('.')[0].strip())
full.Age.groupby([full.Title,full.Sex]).describe()
在分类中,人数最多的同样也是存在年龄数据缺失的是Mr,Miss,Mrs,Master几个组。所以对于剩下的几个组就先按男女合并处理,通过降维省省自由度。
nn={
'Capt':'Rareman', 'Col':'Rareman','Don':'Rareman','Dona':'Rarewoman',
'Dr':'Rareman','Jonkheer':'Rareman','Lady':'Rarewoman','Major':'Rareman',
'Master':'Master','Miss':'Miss','Mlle':'Rarewoman','Mme':'Rarewoman',
'Mr':'Mr','Mrs':'Mrs','Ms':'Rarewoman','Rev':'Mr','Sir'