Tatanic Survival

目錄

項目問題
各變量解釋
一、數(shù)據描述
1.總覽數(shù)據
2.可視化探索
3.相關性分析

二、特征工程
1.缺失值處理
2.構造家庭規(guī)模特征
3.構造乘客身份特征
4.對Fare分箱(消除異常值)
5.用Ticket構造票根特征

三、建模
1.導入模型
2.數(shù)據準備
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

一、數(shù)據描述

1.導入文件,總覽數(shù)據

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
#查看缺失值及數(shù)據類型

[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%%')可以實現(xiàn)相同效果
image.png

2.2柱狀圖探索性別Sex與生存Survived的關系

女士優(yōu)先,發(fā)現(xiàn)女士生存率較高

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****人數(shù)以及票等級****Plcass對比


#col表示已什么分類,kind='count'表示計數(shù)方式計算'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 "老年"

#創(chuàng)建新列Age_spilt代表年齡段,根據"Age"代入函數(shù)得出

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':發(fā)現(xiàn)Cabin存在大量空值,且多為字母加數(shù)字如A41,B15,C23

這里空值可能代表其他含義,可能無房間代表工作人員,所以把“Cabin”中的空值轉換為字母“S”,stands for Special

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

2)Embarked登船港口缺失值只有兩個,填充眾數(shù)S

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

2.根據SibSp+Parch構建“家庭規(guī)?!碧卣?/h2>

data['Family_Size'] = data['SibSp']+data['Parch']#父母孩子+兄弟姐妹=家庭規(guī)模

sns.distplot(data['Family_Size'])#查看家庭規(guī)模分布情況

發(fā)現(xiàn)規(guī)模等于10的家庭


家庭規(guī)模

查看規(guī)模等于10的家庭存活情況

#取家庭規(guī)模=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統(tǒng)計及不同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段,觀察每段的存活率.
#不同的數(shù)值型變量應該調整箱子數(shù)量以求發(fā)現(xiàn)具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()
不同票價的生存率

由結果可得,主要生存率由票價分為三個部分(0,10.5],(10.5,41.579](41.579-512.329]

#將票價分成3個箱子,指定區(qū)間和標簽
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.數(shù)據準備:特征選擇、分離訓練測試集、one-hot編碼

2.預測前數(shù)據準備
#查看各字段與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個列表:一個存放模型名字、一個存放模型、一個存放評分。方便后期統(tǒng)一展示對比
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)#交叉驗證得分,迭代次數(shù)為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})

根據評分可見決策樹以及隨機森林表現(xiàn)較好,選用這兩個模型跑測試集


預測模型的評分

四、輸出結果
選用決策樹及隨機森林預測結果

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,作為練手項目
從目錄的數(shù)據描述、特征工程及建模三方面總結

(一)數(shù)據描述:

1.導入數(shù)據時,需將測試集和訓練集先合并,因特征工程會構造新特征或對原有特征進行操作,要確保測試、訓練集一致
2.兩變量間的關系
2.1可視化sns.barplot(x=變量A,y=變量B,data)
2.2groupby 例如:data['Survived'].groupby(data['Sex']).mean()
3.要善于挖掘分離特征中的信息,比如姓名中的不同稱謂Mr Mrs Countless Jonkerr等有特定的意義 對預測值能產生重大影響
3.快速發(fā)現(xiàn)異常值的方法
data.describe() 觀察有沒有大幅偏離平均值的數(shù)據或者是不符合常識的數(shù)據

(二)特征工程

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():每一段的樣本數(shù)量相同

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

2.3查看分箱后效果

#將Fare等分為5段,觀察每段的存活率.
#不同的數(shù)值型變量應該調整箱子數(shù)量以求發(fā)現(xiàn)具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()

3.字符串分割提取

#將'Mr. Yang' 的 'Yang'提取出來
data['Title'] = data['Title'].map(lambda x : x.split(',')[1])
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容