泰坦尼克號生還者預(yù)測案例分析

泰坦尼克號生還者預(yù)測

1912年4月15日箕憾,在首次航行期間,泰坦尼克號撞上冰山后沉沒鞋仍,2224名乘客和機組人員中有1502人遇難造寝。這場悲劇轟動了國際社會磕洪。沉船導(dǎo)致遇難的原因之一是沒有足夠的救生艇給乘客和船員。雖然在這場災(zāi)難中幸存下來有一些運氣在里面诫龙,但一些人比其他人更有可能幸存析显,比如婦女,兒童和上層階級签赃。

1.數(shù)據(jù)描述

data.info()

survival - 是否幸存(0=幸存谷异,1=遇難)
pclass - 船票類型(1=一等票,2=二等票锦聊,3=三等票)
sex - 性別
age - 年齡
sibsp - 泰坦尼克號上該人員兄弟姐妹的數(shù)量
parch - 泰坦尼克好上該人員父母或者子女的數(shù)量
ticket - 船票編號
fare - 乘客票價
cabin - 客艙號碼
embarked - 起航運港(C = Cherbourg, Q = Queenstown, S = Southampton)
boat - 救生艇的編號(如果幸存)
body - 人體編號(如果遇難并且尸體被找到)
home.dest - 出發(fā)地到目的地

2.數(shù)據(jù)分析

2.1 幸存率分析

幸存率

計算顯示只有38%左右的乘客幸存下來歹嘹,這次慘劇發(fā)生的原因是泰坦尼克號上并未攜帶足夠的救生艇,只有20艘孔庭,這對于1317名乘客和885名機組人員來說還遠遠不夠尺上。

2.1 階級地位分析

階級地位分析

我們可以看出來頭等艙對乘客有62%的生還幾率,相比之下三等艙對乘客只有25.5%的生還概率圆到,此外客艙越豪華怎抛,乘客的年紀(jì)也就越大,同時一等票票價明顯高于二三等票芽淡。

2.2 階級和性別分析

階級和性別分析

從上面的分析中可以看出來马绝,在慘劇發(fā)生的時候大家傾向于首先疏散婦女和兒童。在所有的階層中挣菲,女性比男性更有可能生存下來富稻。


年齡分析

由上圖分析可以看出來掷邦,在慘劇發(fā)生的時候兒童存活的可能性相對來說還是極高的。

3.數(shù)據(jù)處理

在構(gòu)建機器學(xué)習(xí)模型前我們需要刪除填充缺失值并且將數(shù)據(jù)集分為訓(xùn)練集和測試集唉窃。

3.1 缺失值處理

3.1.1 按列刪除缺失數(shù)據(jù)

由于boat耙饰、cabin纹笼、body缺失比較嚴(yán)重纹份,且對后續(xù)分析不能提供足夠信息,所以刪除掉boat廷痘、cabin蔓涧、body這三個字段


缺失值處理

3.1.2 按行刪除缺失數(shù)據(jù)

因為年齡對于乘客能不能生還會產(chǎn)生較大的影響,所以我們選擇刪除年齡字段缺失的那部分?jǐn)?shù)據(jù)笋额。


缺失值處理

3.2 編碼轉(zhuǎn)換

sex和embarked都是與類別(比如sex有兩種值元暴,male和female)對應(yīng)的字符串值,因此通過LabelEncoder我們可以將類別字符串分別轉(zhuǎn)換數(shù)值數(shù)據(jù)兄猩,比如將“male”和“female”轉(zhuǎn)換成0和1茉盏。name、ticket枢冤、home.dest字段無法做編碼轉(zhuǎn)換成數(shù)值數(shù)據(jù)鸠姨,所以我們從數(shù)據(jù)集中刪除掉它們。


labelEncoder

4 機器學(xué)習(xí)

4.1 機器學(xué)習(xí)簡單預(yù)測

決策樹

隨機森林

4.2 K折交叉驗證

K折交叉驗證

數(shù)據(jù)集選擇的不同也會導(dǎo)致預(yù)測結(jié)果的不同淹真。上述的決策樹模型的平均預(yù)測準(zhǔn)確率為79.61%讶迁,根據(jù)數(shù)據(jù)的不同可以有2%左右的浮動變化。

4.3 特征選擇

我們還可以使用隨機森林算法來獲取各個不同特征在最終結(jié)果預(yù)測中的權(quán)重


特征選擇

4.4 多模型效果比較

模型比較

由上圖比較核蘸,我們可以看出隨機森林算法在當(dāng)前數(shù)據(jù)預(yù)測中表現(xiàn)良好巍糯,最優(yōu)值能達到86%以上

5 案例數(shù)據(jù)

5.1 案例數(shù)據(jù)集

鏈接:https://pan.baidu.com/s/1f4AIFes0yTW1ndQOyi-crg
提取碼:1uey

5.2 完整代碼

  #!/usr/bin/env python
# coding: utf-8
# 導(dǎo)入python三方庫函數(shù)

import os 
import  matplotlib.pyplot  as plt
get_ipython().run_line_magic('matplotlib', 'inline')

import random
import numpy as np
import pandas as pd 
from sklearn import preprocessing

data_path='案例數(shù)據(jù)'
titanic_df  = pd.read_excel(os.path.join(data_path,'titanic3.xls'),'titanic3',index_col=None,na_values=['NA'])
titanic_df.head()
titanic_df['survived'].mean()
titanic_df.groupby('pclass').mean()
class_sex_grouping  =  titanic_df.groupby(['pclass','sex']).mean()
class_sex_grouping

class_sex_grouping['survived'].plot.bar(figsize=(12,7),fontsize=12)
plt.xticks(rotation=45)

group_by_age = pd.cut(titanic_df['age'],np.arange(0,90,10))
age_grouping = titanic_df.groupby(group_by_age).mean()
age_grouping['survived'].plot.bar(figsize=(12, 7),colors=['r','y','b'],fontsize=12)
plt.xticks(rotation=45)

titanic_df.info()

# axis = 1 按列刪除
titanic_df = titanic_df.drop(['body','boat','cabin'],axis=1)
titanic_df['home.dest'] = titanic_df['home.dest'].fillna('NA')
titanic_df.head()
titanic_df = titanic_df.dropna()
titanic_df.info()

def preprocess_titanic_df(df):
    preprocess_df = df.copy()
    le = preprocessing.LabelEncoder()
    preprocess_df.sex = le.fit_transform(preprocess_df.sex)
    preprocess_df.embarked = le.fit_transform(preprocess_df.embarked)
    preprocess_df = preprocess_df.drop(['name','ticket','home.dest'],axis=1)
    return preprocess_df
preprocess_df = preprocess_titanic_df(titanic_df)

preprocess_df.head()

# 機器學(xué)習(xí)簡單預(yù)測
x = preprocess_df.drop(['survived'],axis=1).values
y = preprocess_df['survived'].values
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(x,y,test_size=0.2)

np.random.seed(42)
# 決策樹分類器
from sklearn.tree import DecisionTreeClassifier
clf_dt = DecisionTreeClassifier(max_depth = 5)
clf_dt.fit(X_train,y_train)
clf_dt.score(X_test,y_test)

# 交叉驗證衡量模型的表現(xiàn)能力

from sklearn.model_selection import ShuffleSplit,cross_val_score
# 隨機拆分?jǐn)?shù)據(jù)
shuff_split = ShuffleSplit(n_splits=20,test_size=0.2,random_state=0)
def test_classifier_suf(clf):  
    scores = cross_val_score(clf,x,y,cv=shuff_split)
    print ("Accuracy: %0.4f (+/- %0.2f)" % (scores.mean(), scores.std()))
    return scores
clf_dt_scores = test_classifier_suf(clf_dt)

# 隨機森林
# from sklearn.feature_selection import SelectFromModel
np.random.seed(42)
from sklearn.ensemble  import RandomForestClassifier
clf = RandomForestClassifier(n_estimators=50)
clf_rf_scores = test_classifier_suf(clf)

np.random.seed(42)
from sklearn.ensemble  import GradientBoostingClassifier
# from sklearn.feature_selection import SelectFromModel
clf = GradientBoostingClassifier(n_estimators=50)
clf_grad_scores = test_classifier_suf(clf)

# 隨機森林
from sklearn.ensemble  import RandomForestClassifier
from sklearn.feature_selection import SelectFromModel
np.random.seed(42)
clf = RandomForestClassifier(n_estimators=50)
clf = clf.fit(X_train,y_train)
test_classifier_suf(clf)

features = pd.DataFrame()
features["feature"] = ["pclass","sex","age","sibsp","parch","fare","embarked"]
features["importance"] = clf.feature_importances_
features.sort_values(by=["importance"],ascending=True,inplace=True)
features.set_index('feature',inplace=True)
features.plot(kind="barh",figsize=(12,7),fontsize=12)
plt.show()

x = np.linspace(0,1,20) 
plt.figure(figsize=(12,7))  #類似于先聲明一張圖片,這個figure后面所有的設(shè)置都是在這張圖片上操作的
plt.plot(x,clf_dt_scores,label="DecisionTreeClassifier")    #制圖
plt.plot(x,clf_grad_scores,color='r',linestyle='--',label="GradientBoostingClassifier") #設(shè)置函數(shù)線的顏色和線的樣式
plt.plot(x,clf_rf_scores,color='y',linestyle='--',label="RandomForestClassifier") #設(shè)置函數(shù)線的顏色和線的樣式
plt.legend(loc="upper right")
plt.grid()
plt.show() 
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末客扎,一起剝皮案震驚了整個濱河市祟峦,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌徙鱼,老刑警劉巖宅楞,帶你破解...
    沈念sama閱讀 218,640評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異疆偿,居然都是意外死亡咱筛,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,254評論 3 395
  • 文/潘曉璐 我一進店門杆故,熙熙樓的掌柜王于貴愁眉苦臉地迎上來迅箩,“玉大人,你說我怎么就攤上這事处铛∷乔鳎” “怎么了拐揭?”我有些...
    開封第一講書人閱讀 165,011評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長奕塑。 經(jīng)常有香客問我堂污,道長,這世上最難降的妖魔是什么龄砰? 我笑而不...
    開封第一講書人閱讀 58,755評論 1 294
  • 正文 為了忘掉前任盟猖,我火速辦了婚禮,結(jié)果婚禮上换棚,老公的妹妹穿的比我還像新娘式镐。我一直安慰自己,他們只是感情好固蚤,可當(dāng)我...
    茶點故事閱讀 67,774評論 6 392
  • 文/花漫 我一把揭開白布娘汞。 她就那樣靜靜地躺著,像睡著了一般夕玩。 火紅的嫁衣襯著肌膚如雪你弦。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,610評論 1 305
  • 那天燎孟,我揣著相機與錄音禽作,去河邊找鬼。 笑死缤弦,一個胖子當(dāng)著我的面吹牛领迈,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播碍沐,決...
    沈念sama閱讀 40,352評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼狸捅,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了累提?” 一聲冷哼從身側(cè)響起尘喝,我...
    開封第一講書人閱讀 39,257評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎斋陪,沒想到半個月后朽褪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,717評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡无虚,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,894評論 3 336
  • 正文 我和宋清朗相戀三年缔赠,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片友题。...
    茶點故事閱讀 40,021評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡嗤堰,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出度宦,到底是詐尸還是另有隱情踢匣,我是刑警寧澤告匠,帶...
    沈念sama閱讀 35,735評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站离唬,受9級特大地震影響后专,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜输莺,卻給世界環(huán)境...
    茶點故事閱讀 41,354評論 3 330
  • 文/蒙蒙 一戚哎、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧模闲,春花似錦建瘫、人聲如沸崭捍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,936評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽殷蛇。三九已至实夹,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間粒梦,已是汗流浹背亮航。 一陣腳步聲響...
    開封第一講書人閱讀 33,054評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留匀们,地道東北人缴淋。 一個月前我還...
    沈念sama閱讀 48,224評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像泄朴,于是被迫代替她去往敵國和親重抖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,974評論 2 355