Tatanic Survival

作者: Brian_mingzhi | 来源:发表于2020-03-16 01:16 被阅读0次

目录

项目问题
各变量解释
一、数据描述
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://img.haomeiwen.com/i21421395/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])

相关文章

网友评论

    本文标题:Tatanic Survival

    本文链接:https://www.haomeiwen.com/subject/kghhqhtx.html