Tatanic Survival

目錄

項(xiàng)目問(wèn)題
各變量解釋
一低葫、數(shù)據(jù)描述
1.總覽數(shù)據(jù)
2.可視化探索
3.相關(guān)性分析

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

三二庵、建模
1.導(dǎo)入模型
2.數(shù)據(jù)準(zhǔn)備
3.擬合模型及評(píng)估結(jié)果
4.輸出結(jié)果及導(dǎo)出

四撼唾、項(xiàng)目總結(jié)及反省
——————————————————————————————————

問(wèn)題:

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ù)據(jù)描述

1.導(dǎo)入文件替劈,總覽數(shù)據(jù)

import pandas as pd
import numpy as np
import seaborn
train = pd.read_csv('train.csv')
test = pd.read_csv('test.csv')
#合并訓(xùn)練集和測(cè)試集蜒滩,方便做同樣的特征工程
data = train.append(test)
data.head()
image.png
#查看缺失值及數(shù)據(jù)類型

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

image.png

2.可視化探索

2.1餅狀圖可視化預(yù)測(cè)目標(biāo)Survived


#使用matplotlib來(lái)可視化
import matplotlib.pyploy as plt

#設(shè)置餅圖塊標(biāo)簽
labels = ['Survived','Unsuvived']

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

#data['Survived'].plot.pie(autopect='%.0f%%')可以實(shí)現(xiàn)相同效果
image.png

2.2柱狀圖探索性別Sex與生存Survived的關(guān)系

女士?jī)?yōu)先滨达,發(fā)現(xiàn)女士生存率較高

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

2.3Embarked登船地點(diǎn)與生存的關(guān)系

從C港口上船的客人生存概率較高

推測(cè)C港口的客人更多女性或者票等級(jí)更高

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

2.3.1查看不同港口登船客人的男女****Sex****人數(shù)以及票等級(jí)****Plcass對(duì)比


#col表示已什么分類,kind='count'表示計(jì)數(shù)方式計(jì)算'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比例最高俯艰,票等級(jí)最高捡遍,故生存率高,見2.3

2.4年齡與生存率的關(guān)系

根據(jù)年齡劃分年齡段


#劃分年齡段竹握,查看年齡與生存率關(guān)系

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代表年齡段画株,根據(jù)"Age"代入函數(shù)得出

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

data[['Age_Split']]

#解決中文顯示不了問(wèn)題

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

#繪圖

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

年齡段生存率

可見兒童組存活率最高,老年組最低

3.相關(guān)性分析

分析可見性別、船票價(jià)和


#二值化'Sex',男性為0谓传,女性為1

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

#觀察其他變量與“Survived”變量的相關(guān)性

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

這里空值可能代表其他含義,可能無(wú)房間代表工作人員庸推,所以把“Cabin”中的空值轉(zhuǎn)換為字母“S”常侦,stands for Special

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

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

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

2.根據(jù)SibSp+Parch構(gòu)建“家庭規(guī)谋崦剑”特征


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個(gè)人都是一個(gè)家庭的聋亡,且全部不幸遇難,太慘了吧
該家庭都為3等Cabin


image.png

查看家庭人員與生存率關(guān)系


image.png

3.根據(jù)"Name"構(gòu)造代表乘客身份的稱謂'title'

比如女士是Miss际乘、Mrs坡倔,男士是Mr,船員有Master

#根據(jù)符號(hào),  切分"Name"脖含,得到姓氏和名字的列表:[0]為名字罪塔,[1]為姓氏
#提取姓氏
Surname = data['Name'].map(lambda x:x.split(',')[1])
Surname
姓氏
#x.split(',')[1]代表姓氏,根據(jù)姓氏再提取title; strip()刪除字符串的空格
title = data['Name'].map(lambda x:(x.split(',')[1]).split('.')[0].strip())
title.value_counts()
Title統(tǒng)計(jì)及不同Title生存率

對(duì)Title進(jìn)行分箱操作,需要了解不同稱謂的代表养葵,這里可以查有道征堪,并且根據(jù)生存率進(jìn)行分箱
女士類: Miss/Mlle/Lady--生存率較高
已婚夫人類: Mrs/Ms/Mme--生存率較高
男士類: Mr/Sir/Rev牧師--生存率最低
地位顯赫類: the Countess伯爵夫人/jonkheer荷蘭皇家
工作人員類: Capt船長(zhǎng)/Master船長(zhǎng)/Col上校/Major少校/Dr教授/Don大學(xué)老師--生存率較低

4.將Fare分箱消除異常值,構(gòu)建‘Fare_Split’

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

由結(jié)果可得佃蚜,主要生存率由票價(jià)分為三個(gè)部分(0,10.5],(10.5,41.579](41.579-512.329]

#將票價(jià)分成3個(gè)箱子,指定區(qū)間和標(biāo)簽
data['Fare_Split'] = pd.cut(data['Fare'],[0,10.51,41.58,513],labels=['Fare_1','Fare_2','Fare_3'])

5.Ticket票根可能有不同含義着绊,分離首字母構(gòu)造Ticket_Letter字段

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

三谐算、建模預(yù)測(cè)

1.導(dǎo)入模型

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
#集成學(xué)習(xí)
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ù)據(jù)準(zhǔn)備:特征選擇、分離訓(xùn)練測(cè)試集归露、one-hot編碼

2.預(yù)測(cè)前數(shù)據(jù)準(zhǔn)備
#查看各字段與Survivied的相關(guān)性
data2.corr()[['Survived']].sort_values('Survived')
#選擇相關(guān)性較高的字段  
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()]#選出訓(xùn)練集
test = data2[data2['Survived'].isnull()]#選出測(cè)試集
test = test.drop('Survived',axis=1)
train_x = train.drop('Survived',axis=1)#
train_y = train[['Survived']]

3.開始預(yù)測(cè):建立三個(gè)列表存放訓(xùn)練結(jié)果及訓(xùn)練效果

#建立3個(gè)列表:一個(gè)存放模型名字洲脂、一個(gè)存放模型、一個(gè)存放評(píng)分剧包。方便后期統(tǒng)一展示對(duì)比
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()可以包含一個(gè)或多個(gè)迭代器
for name,model in zip(model_name,models):
    m = model#實(shí)例化模型
    cross_value_score(m,x,y,cv=5)#交叉驗(yàn)證得分腮考,迭代次數(shù)為5
    
    m.fit(x,y)#用訓(xùn)練集訓(xùn)練模型
    pre_y = m.predict(test2)#用模型預(yù)測(cè)test的生存情況
    grade = model.score(x,y)#對(duì)模型評(píng)分
    score.append(grade)#將評(píng)分加入score列表

#建立用來(lái)展示各模型評(píng)分的DataFrame
#建立方法:Dataframe中包含一個(gè)字典,字典的"鍵"是列名,字典的"值"是列表
result = pd.DataFrame({'Model':model_name,'Score':score})

根據(jù)評(píng)分可見決策樹以及隨機(jī)森林表現(xiàn)較好玄捕,選用這兩個(gè)模型跑測(cè)試集


預(yù)測(cè)模型的評(píng)分

四、輸出結(jié)果
選用決策樹及隨機(jī)森林預(yù)測(cè)結(jié)果

RM = RandomForestClassifier()#隨機(jī)森林
DT = DecisionTreeClassifier()#決策樹
RM.fit(x,y)#擬合隨機(jī)森林
DT.fit(x,y)#擬合決策樹


test['Survived'] = RM.predict(test)#將隨機(jī)森林預(yù)測(cè)結(jié)果賦值給test
RM_result=test[['Passenger_Id','Survivied']]#提交格式
#index=Flase表示不生成index列
#生成隨機(jī)森林csv結(jié)果
RM_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)

test['Survived'] = DT.predict(test)將決策樹預(yù)測(cè)結(jié)果賦值給test
DT_result=test[['Passenger_Id','Survivied']]#提交格式
DT_result.to_csv('RadomForest_Result.csv',header=True,index=Flase)#生成決策樹結(jié)果

四棚放、項(xiàng)目總結(jié)及反省

這次的Tatanic項(xiàng)目主要目的是練習(xí)使用python枚粘,作為練手項(xiàng)目
從目錄的數(shù)據(jù)描述、特征工程及建模三方面總結(jié)

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

1.導(dǎo)入數(shù)據(jù)時(shí)飘蚯,需將測(cè)試集和訓(xùn)練集先合并馍迄,因特征工程會(huì)構(gòu)造新特征或?qū)υ刑卣鬟M(jìn)行操作福也,要確保測(cè)試、訓(xùn)練集一致
2.兩變量間的關(guān)系
2.1可視化sns.barplot(x=變量A攀圈,y=變量B,data)
2.2groupby 例如:data['Survived'].groupby(data['Sex']).mean()
3.要善于挖掘分離特征中的信息暴凑,比如姓名中的不同稱謂Mr Mrs Countless Jonkerr等有特定的意義 對(duì)預(yù)測(cè)值能產(chǎn)生重大影響
3.快速發(fā)現(xiàn)異常值的方法
data.describe() 觀察有沒有大幅偏離平均值的數(shù)據(jù)或者是不符合常識(shí)的數(shù)據(jù)

(二)特征工程

1.常用構(gòu)造新特征的兩種方法

#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ù)值型變量應(yīng)該調(diào)整箱子數(shù)量以求發(fā)現(xiàn)具有代表性的各段
data['Survived'].groupby(pd.qcut(data['Fare'],5)).mean()

3.字符串分割提取

#將'Mr. Yang' 的 'Yang'提取出來(lái)
data['Title'] = data['Title'].map(lambda x : x.split(',')[1])
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末赘来,一起剝皮案震驚了整個(gè)濱河市现喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌犬辰,老刑警劉巖嗦篱,帶你破解...
    沈念sama閱讀 211,265評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異幌缝,居然都是意外死亡灸促,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門涵卵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)浴栽,“玉大人,你說(shuō)我怎么就攤上這事轿偎〉浼Γ” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評(píng)論 0 347
  • 文/不壞的土叔 我叫張陵贴硫,是天一觀的道長(zhǎng)椿每。 經(jīng)常有香客問(wèn)我,道長(zhǎng)英遭,這世上最難降的妖魔是什么间护? 我笑而不...
    開封第一講書人閱讀 56,408評(píng)論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮挖诸,結(jié)果婚禮上汁尺,老公的妹妹穿的比我還像新娘。我一直安慰自己多律,他們只是感情好痴突,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評(píng)論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著狼荞,像睡著了一般辽装。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上相味,一...
    開封第一講書人閱讀 49,772評(píng)論 1 290
  • 那天拾积,我揣著相機(jī)與錄音,去河邊找鬼。 笑死拓巧,一個(gè)胖子當(dāng)著我的面吹牛斯碌,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播肛度,決...
    沈念sama閱讀 38,921評(píng)論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼傻唾,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了承耿?” 一聲冷哼從身側(cè)響起冠骄,我...
    開封第一講書人閱讀 37,688評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瘩绒,沒想到半個(gè)月后猴抹,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡锁荔,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評(píng)論 2 325
  • 正文 我和宋清朗相戀三年蟀给,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片阳堕。...
    茶點(diǎn)故事閱讀 38,617評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡跋理,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出恬总,到底是詐尸還是另有隱情前普,我是刑警寧澤,帶...
    沈念sama閱讀 34,276評(píng)論 4 329
  • 正文 年R本政府宣布壹堰,位于F島的核電站拭卿,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏贱纠。R本人自食惡果不足惜峻厚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評(píng)論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谆焊。 院中可真熱鬧惠桃,春花似錦、人聲如沸辖试。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)罐孝。三九已至呐馆,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莲兢,已是汗流浹背摹恰。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評(píng)論 1 265
  • 我被黑心中介騙來(lái)泰國(guó)打工辫继, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俗慈。 一個(gè)月前我還...
    沈念sama閱讀 46,315評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像遣耍,于是被迫代替她去往敵國(guó)和親闺阱。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容