kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

本篇是基于kaggle上一位作者的学习流程学习所写的总结,应用的都是一些比较基础的操作,主要发力在数据处理方面,对算法的优化过程几乎没有,下面是原文链接:

https://www.kaggle.com/startupsci/titanic-data-science-solutions



首先定义宏观的工作流程:

1.问题定义
2 .获取训练和测试集。
3.准备和清理数据。
4.分析,确认模式,并且处理数据。
5. 建模,预测和解决问题
6. 将解决步骤和最终解决方法可视化,报道并呈现出来
7. 提交结果


问题定义:

    这是一个拥有十几个特征,预测结果为二分类的预测问题。


载入数据:

    省略


观察所有特征,并对其进行分类,大致有:


数字类:PassengerId, Survived(Survival,  0 = No, 1 = Yes), Pclass(Ticket class,  1 = 1st, 2 = 2nd, 3 = 3rd), Age(Age in years), Sibsp(# of siblings / spouses aboard the Titanic# of siblings / spouses aboard the Titanic), Parch(# of parents / children aboard the Titanic), Fare(Passenger fare)

        其中分类型特征有Survived, Pclass。连续型特征有Age,  Sibsp,   Parch,  Fare, PassengerId


字母类:Name,  Embarked(Port of Embarkation,  C = Cherbourg, Q = Queenstown, S = Southampton),Sex

         其中Name为杂乱型,Embarked, Sex为分类型。


字母+数字类:Ticket(Ticket number), Cabin(Cabin number


考虑可能有错误的特征:名字非常复杂,意思可能有错误。


分类完成后进一步了解各个特征的空缺情况以及数据的类型特征,利用如下语句:

        

train_df.info()
print('_'*40)
test_df.info()

继续进行总览型操作如下:

train_df.describe()

以及:

train_df.describe(include=['0'])
可以获取count,mean, std以及 频繁值,多数值,不同值的个数。

大致有以下发现:

name属性是独一无二的。
sex有两种值,男的有65%
carbin特征有好几个是一样的,好几个人公用船舱。
Embarked有三种值,s最多。
tickcet有22%的重复率


接下来依次开始进行数据与结果的关联性分析,数据填补,数据纠错,特征丢弃,特征创造等操作。


首先针对分类型特征:
接下来开始将每一个特征与survived关联性进行比较,通过groupby这个操作,但是仅仅只能用在那种分类型的特征上。分别对Pclass sex SibSp and Parch进行此操作,通过groupby操作,举例如下:
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)

结果举例如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


结果发现pclass和sex与结果关联较大,SibSp and Parch则有点杂乱无章。

接下来针对连续数值型特征用图表进行分析:

首先针对Age作图

g = sns.FacetGrid(train_df, col='Survived')g.map(plt.hist, 'Age', bins=20)

结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


发现age关联性比较有用。

不仅可以单一绘图,也可以综合考虑,比如将连续数值型特征Age与分类数值型特征Pclass一起作图。

# grid = sns.FacetGrid(train_df, col='Pclass', hue='Survived')grid = sns.FacetGrid(train_df, col='Survived', row='Pclass', size=2.2, aspect=1.6)grid.map(plt.hist, 'Age', alpha=.5, bins=20)grid.add_legend();

结果:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


发现pclass也比较有用,可以考虑使用。


接下来更进一步,将sex,pclass和embarked一起作图。

最终决定sex,embarked也有利用价值。


用embarked,sex,fare一起做图。

决定fare投入使用。


经分析,carbin和ticket使用难度较大,且效益不高,将其舍去。


接下来开始正式处理数据


name特征虽然杂乱无章,但是可以提取出一些性别特征比较明显的比如Mr,Miss等等,所以可以提取出来作为一个名字为title的特征。经过相应的python语法的处理后可以得出以下结果:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


由于title属性有明显的性别特征,有理由认为它和Sex一样与结果关联度较高,但种类过多,可以将某些小类合并成一种。经过一些python相关语法处理,并且分别将其与结果进行关联性分析,得到的结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

然后将字符变成数字即可:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

现在即可将name和PassengerID扔掉。


上面说到了title字符型的数字化转换,同理将Sex也数值化:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

这个时候不要忘了里面还有特征存在缺失值,必须填补好再运用,比如Age,这里使用一种综合相关特征进行平均值的猜测。将pclass,sex,age,代码如下:

for dataset in combine: for i in range(0, 2): for j in range(0, 3): guess_df = dataset[(dataset['Sex'] == i) & \ (dataset['Pclass'] == j+1)]['Age'].dropna() # age_mean = guess_df.mean() # age_std = guess_df.std() # age_guess = rnd.uniform(age_mean - age_std, age_mean + age_std) age_guess = guess_df.median() # Convert random age float to nearest .5 age guess_ages[i,j] = int( age_guess/0.5 + 0.5 ) * 0.5 for i in range(0, 2): for j in range(0, 3): dataset.loc[ (dataset.Age.isnull()) & (dataset.Sex == i) & (dataset.Pclass == j+1),\ 'Age'] = guess_ages[i,j] dataset['Age'] = dataset['Age'].astype(int)train_df.head()


age填补完成后需要将age进行分组,方便利用。

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

下一波就是将这个ageband用数字来表示:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


接着扔掉ageband就可以。


接下来要做的事情,就是进一步创建新特征,将sibsp和parch总合成family再将另外俩扔掉。结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


由这个family还可以进一步形成特征isalone,如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

可以再创造一个age*class,结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结


接着继续处理分类型特征Embarked,它还有空缺,先补上,用最常见的值来填补,并转换为数字型特征,结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

继续处理fare,只有一个空值,简单处理,把其余值的median填上即可,结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

进一步将fare分组数字化表示,结果如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结



接下来进入模型选择与训练阶段:

常用算法有以下这些:
  • Logistic Regression
  • KNN or k-Nearest Neighbors
  • Support Vector Machines
  • Naive Bayes classifier
  • Decision Tree
  • Random Forrest
  • Perceptron
  • Artificial neural network
  • RVM or Relevance Vector Machine


分别计算其置信度分数,进行对比,最终选定了Random Forrest

置信度分数为86.76

汇总表如下:

kaggle比赛泰坦尼克号基于别人的处理流程的学习总结

最终可以得出结果。