Tatanic Survival

目录

项目问题
各变量解释
一、数据描述
1.总览数据
2.可视化探索
3.相关性分析

二、特征工程
1.缺失值处理
2.构造家庭规模特征
3.构造乘客身份特征
4.对Fare分箱(消除异常值)
5.用Ticket构造票根特征

三、建模
1.导入模型
2.数据准备
3.拟合模型及评估结果
4.输出结果及导出

四、项目总结及反省
——————————————————————————————————

问题:

What sorts of people were more likely to survive in tatanic?

各变量解释:

Variable Definition Key
survival: Survival 0 = No, 1 = Yes
pclass: Ticket class 1 = 1st, 2 = 2nd, 3 = 3rd
sex:Male or Female
Age: Age in years
sibsp: # of siblings / spouses aboard the Titanic
parch: # of parents / children aboard the Titanic
ticket:Ticket number
fare:Passenger fare
cabin: Cabin number
embarked: Port of Embarkation C = Cherbourg, Q = Queenstown, S = Southampton
Variable Notes
pclass: A proxy for socio-economic status (SES) 1st = Upper 2nd = Middle 3rd = Lower
age: Age is fractional if less than 1. If the age is estimated, is it in the form of xx.5
sibsp: The dataset defines family relations in this way...
Sibling = brother, sister, stepbrother, stepsister
Spouse = husband, wife (mistresses and fiancés were ignored)
parch: The dataset defines family relations in this way...
Parent = mother, father
Child =daughter, son, stepdaughter, stepson
Some children travelled only with a nanny, therefore parch=0 for them

一、数据描述

1.导入文件,总览数据

import pandas as pd
import numpy as np
import seaborn
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
#合并训练集和测试集,方便做同样的特征工程
data = train.append(test)
data.head()
image.png
#查看缺失值及数据类型

[data.info](http://data.info)()

image.png

2.可视化探索

2.1饼状图可视化预测目标Survived


#使用matplotlib来可视化
import matplotlib.pyploy as plt

#设置饼图块标签
labels = ['Survived','Unsuvived']

#autopect显示百分比
plt.pie(data['Survived'],labels = labels,autopect = '%.0f%%')

#data['Survived'].plot.pie(autopect='%.0f%%')可以实现相同效果
image.png

2.2柱状图探索性别Sex与生存Survived的关系

女士优先,发现女士生存率较高

import seaborn as sns
sns.barplot(x='Sex',y='Survived',data=data)
image.png

2.3Embarked登船地点与生存的关系

从C港口上船的客人生存概率较高

推测C港口的客人更多女性或者票等级更高

sns.barplot(x='Embarked',y='Survived',data=data)
image.png

2.3.1查看不同港口登船客人的男女****Sex****人数以及票等级****Plcass对比


#col表示已什么分类,kind='count'表示计数方式计算'Sex'

sns.factorplot('Sex',col='Embarked',data=data,kind='count',size=3)

image.png

可见C和Q港口登船的客人女性比例相同,所以可能C生存率高由Pclass影响

sns.factorplot(x='Pclass',col='Embarked',data=data,kind='count',size=3)
image.png

可见C港口登船客人Pclass=1比例最高,票等级最高,故生存率高,见2.3

2.4年龄与生存率的关系

根据年龄划分年龄段


#划分年龄段,查看年龄与生存率关系

def age_split(age):

 if age<12:

 return '儿童'

 elif (age>=12)&(age<=18):

 return

 elif (age>18)&(age<=50):

 return "青壮年"

 else:

 return "老年"

#创建新列Age_spilt代表年龄段,根据"Age"代入函数得出

data['Age_Split'] = data['Age'].map(age_split)

data[['Age_Split']]

#解决中文显示不了问题

plt.rcParams['font.family'] = ['Arial Unicode MS']  

#绘图

sns.barplot(x='Age_Split',y='Survived',data=data)

年龄段生存率

可见儿童组存活率最高,老年组最低

3.相关性分析

分析可见性别、船票价和


#二值化'Sex',男性为0,女性为1

data['Sex']=pd.get_dummies(data['Sex'])

#观察其他变量与“Survived”变量的相关性

data.corr()[['Survived']].sort_values('Survived',ascending=0)
![image.png](https://upload-images.jianshu.io/upload_images/21421395-dcbeb3e9c1b637eb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

二、特征工程

1.缺失值处理

1)'Cabin':发现Cabin存在大量空值,且多为字母加数字如A41,B15,C23

这里空值可能代表其他含义,可能无房间代表工作人员,所以把“Cabin”中的空值转换为字母“S”,stands for Special

data['Cabin'] = data['Cabin'].fillna('S')

2)Embarked登船港口缺失值只有两个,填充众数S

data['Cabin'] = data['Cabin'].fillna('S')

2.根据SibSp+Parch构建“家庭规模”特征


data['Family_Size'] = data['SibSp']+data['Parch']#父母孩子+兄弟姐妹=家庭规模

sns.distplot(data['Family_Size'])#查看家庭规模分布情况

发现规模等于10的家庭


家庭规模

查看规模等于10的家庭存活情况

#取家庭规模=10的dataframe

F_Size10 = data[data['Family_Size']==10]

可见这10个人都是一个家庭的,且全部不幸遇难,太惨了吧
该家庭都为3等Cabin


image.png

查看家庭人员与生存率关系


image.png

3.根据"Name"构造代表乘客身份的称谓'title'

比如女士是Miss、Mrs,男士是Mr,船员有Master

#根据符号,  切分"Name",得到姓氏和名字的列表:[0]为名字,[1]为姓氏
#提取姓氏
Surname = data['Name'].map(lambda x:x.split(',')[1])
Surname
姓氏
#x.split(',')[1]代表姓氏,根据姓氏再提取title; strip()删除字符串的空格
title = data['Name'].map(lambda x:(x.split(',')[1]).split('.')[0].strip())
title.value_counts()
Title统计及不同Title生存率

对Title进行分箱操作,需要了解不同称谓的代表,这里可以查有道,并且根据生存率进行分箱
女士类: Miss/Mlle/Lady--生存率较高
已婚夫人类: Mrs/Ms/Mme--生存率较高
男士类: Mr/Sir/Rev牧师--生存率最低
地位显赫类: the Countess伯爵夫人/jonkheer荷兰皇家
工作人员类: Capt船长/Master船长/Col上校/Major少校/Dr教授/Don大学老师--生存率较低

4.将Fare分箱消除异常值,构建‘Fare_Split’

#将Fare等分为5段,观察每段的存活率.
#不同的数值型变量应该调整箱子数量以求发现具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
不同票价的生存率

由结果可得,主要生存率由票价分为三个部分(0,10.5],(10.5,41.579](41.579-512.329]

#将票价分成3个箱子,指定区间和标签
data['Fare_Split'] = pd.cut(data['Fare'],[0,10.51,41.58,513],labels=['Fare_1','Fare_2','Fare_3'])

5.Ticket票根可能有不同含义,分离首字母构造Ticket_Letter字段

#提取首字母
data['Ticket_Letter']=data['Ticket'].map(lambda x:x[0])
#查看不同首字母票根下的生存率
data['Survived'].groupby(data['Ticket_Letter']).mean()
image.png

三、建模预测

1.导入模型

from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from sklearn.svm import SVR
from sklearn.linear_model import Lasso
from sklearn.linear_model import Ridge
from sklearn.neural_network import MLPRegressor
from sklearn.tree import DecisionTreeClassifier
from sklearn.tree import ExtraTreeRegressor
#集成学习
from sklearn.ensemble import RandomForestRegressor
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import AdaBoostRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.ensemble import BaggingRegressor

2.数据准备:特征选择、分离训练测试集、one-hot编码

2.预测前数据准备
#查看各字段与Survivied的相关性
data2.corr()[['Survived']].sort_values('Survived')
#选择相关性较高的字段  
data1=data[['PassengerId','Age','Pclass','Embarked','Fare','Family_Size','Title','Fare_Split','Ticket_Letter','Cabin_Class','Survived']]
#one-hot编码
data2 = pd.get_dummies(data1)

train = data2[data2['Survived'].notnull()]#选出训练集
test = data2[data2['Survived'].isnull()]#选出测试集
test = test.drop('Survived',axis=1)
train_x = train.drop('Survived',axis=1)#
train_y = train[['Survived']]

3.开始预测:建立三个列表存放训练结果及训练效果

#建立3个列表:一个存放模型名字、一个存放模型、一个存放评分。方便后期统一展示对比
model_name = ['LinearRegression','KNeighborsRegressor','SVR','Lasso','Ridge','MLPRegressor','DecisionTreeClassifier','ExtraTreeRegressor','RandomForestRegressor','AdaBoostRegressor','GradientBoostingRegressor','BaggingRegressor']
models=[LinearRegression(),KNeighborsRegressor(),SVR(),Lasso(),Ridge(),MLPRegressor(),DecisionTreeClassifier(),ExtraTreeRegressor(),RandomForestRegressor(),AdaBoostRegressor(),GradientBoostingRegressor(),BaggingRegressor()]
cross_score=[]
score=[]

from sklearn.value_selection import cross_val_score
#zip()可以包含一个或多个迭代器
for name,model in zip(model_name,models):
    m = model#实例化模型
    cross_value_score(m,x,y,cv=5)#交叉验证得分,迭代次数为5
    
    m.fit(x,y)#用训练集训练模型
    pre_y = m.predict(test2)#用模型预测test的生存情况
    grade = model.score(x,y)#对模型评分
    score.append(grade)#将评分加入score列表

#建立用来展示各模型评分的DataFrame
#建立方法:Dataframe中包含一个字典,字典的"键"是列名,字典的"值"是列表
result = pd.DataFrame({'Model':model_name,'Score':score})

根据评分可见决策树以及随机森林表现较好,选用这两个模型跑测试集


预测模型的评分

四、输出结果
选用决策树及随机森林预测结果

RM = RandomForestClassifier()#随机森林
DT = DecisionTreeClassifier()#决策树
RM.fit(x,y)#拟合随机森林
DT.fit(x,y)#拟合决策树


test['Survived'] = RM.predict(test)#将随机森林预测结果赋值给test
RM_result=test[['Passenger_Id','Survivied']]#提交格式
#index=Flase表示不生成index列
#生成随机森林csv结果
RM_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)

test['Survived'] = DT.predict(test)将决策树预测结果赋值给test
DT_result=test[['Passenger_Id','Survivied']]#提交格式
DT_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)#生成决策树结果

四、项目总结及反省

这次的Tatanic项目主要目的是练习使用python,作为练手项目
从目录的数据描述、特征工程及建模三方面总结

(一)数据描述:

1.导入数据时,需将测试集和训练集先合并,因特征工程会构造新特征或对原有特征进行操作,要确保测试、训练集一致
2.两变量间的关系
2.1可视化sns.barplot(x=变量A,y=变量B,data)
2.2groupby 例如:data['Survived'].groupby(data['Sex']).mean()
3.要善于挖掘分离特征中的信息,比如姓名中的不同称谓Mr Mrs Countless Jonkerr等有特定的意义 对预测值能产生重大影响
3.快速发现异常值的方法
data.describe() 观察有没有大幅偏离平均值的数据或者是不符合常识的数据

(二)特征工程

1.常用构造新特征的两种方法

#1.map配合lambda
data['Ticket_Letter']=data['Ticket'].map(lambda x:x[0])
#2.map配合自己定义的方法
def add(x)
  x=x+1
  return x
data['Increment'] = data['Number'].map(add)

2.分箱两种方法
2.1pd.cut():每一段的范围大小相同

data['Fare'] = pd.cut(data['Fare'],5, labels=[])

2.2pd.qcut():每一段的样本数量相同

data['Fare'] = pd.qcut(data['Fare'],5,labels=[])

2.3查看分箱后效果

#将Fare等分为5段,观察每段的存活率.
#不同的数值型变量应该调整箱子数量以求发现具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()

3.字符串分割提取

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

推荐阅读更多精彩内容