泰坦尼克號生還者預(yù)測
1912年4月15日箕憾,在首次航行期間,泰坦尼克號撞上冰山后沉沒鞋仍,2224名乘客和機組人員中有1502人遇難造寝。這場悲劇轟動了國際社會磕洪。沉船導(dǎo)致遇難的原因之一是沒有足夠的救生艇給乘客和船員。雖然在這場災(zāi)難中幸存下來有一些運氣在里面诫龙,但一些人比其他人更有可能幸存析显,比如婦女,兒童和上層階級签赃。
1.數(shù)據(jù)描述
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ù)集中刪除掉它們。
4 機器學(xué)習(xí)
4.1 機器學(xué)習(xí)簡單預(yù)測
4.2 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()