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

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

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



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

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


问题定义:

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


载入数据:

    省略

扫描二维码关注公众号,回复: 34032 查看本文章


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


数字类: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 )

结果举例如下:



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

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

首先针对Age作图

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

结果如下:



发现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();

结果:



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


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

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


用embarked,sex,fare一起做图。

决定fare投入使用。


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


接下来开始正式处理数据


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



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


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


现在即可将name和PassengerID扔掉。


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


这个时候不要忘了里面还有特征存在缺失值,必须填补好再运用,比如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进行分组,方便利用。


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



接着扔掉ageband就可以。


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



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


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



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


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


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




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

常用算法有以下这些:
  • 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

汇总表如下:


最终可以得出结果。



猜你喜欢

转载自blog.csdn.net/jibiqu2893/article/details/79990201