此文發表在簡書,復制過來,在下方放上鏈接。
https://www.jianshu.com/p/a09b4dc904c9
泰坦尼克號生存預測
1.背景與挖掘目標
“泰坦尼克號”的沉沒是歷史上最臭名昭著的海難之一。1912年4月15日,泰坦尼克號在處女航中與冰山相撞后沉沒,2224名乘客和機組人員中有1502人死亡。這場聳人聽聞的悲劇震驚了國際社會,並導致了更好的船舶安全條例。
造成沉船事故的原因之一是沒有足夠的救生艇供乘客和機組人員使用。雖然在沉沒中幸存了一些運氣,但一些人比其他人更容易生存,如婦女、兒童和上層階級。
請根據這些數據(見數據來源)實現以下目標。
在這個挑戰中,我們要求你們完成對什么樣的人可能生存的分析。特別是,我們要求你運用機器學習的工具來預測哪些乘客在悲劇中幸存下來。
2.分析方法與過程
泰坦尼克號生存預測主要包括以下步驟。
1) 數據描述性統計
2) 對步驟1)進行數據探索分析(尋找特征值)與預處理,包括數據缺失值的探索分析,數據的屬性規約,清洗和變換
3) 利用2)中形成的已完成數據預處理的建模數據訓練模型
4) 針對模型結果預測測試集人的生存情況
2.1數據來源和含義
數據來自於知名機器學習競賽網站kaggle:
https://www.kaggle.com/c/titanic/data
說明:
- PassengerId => 乘客ID
- Pclass => 乘客等級(1/2/3等艙位)
- Name => 乘客姓名
- Sex => 性別
- Age => 年齡
- SibSp => 堂兄弟/妹個數
- Parch => 父母與小孩個數
- Ticket => 船票信息
- Fare => 票價
- Cabin => 客艙
- Embarked => 登船港口
3數據探索
3.1數據初窺
導入數據
發現數據總數有891條,其中Age,Cabin,Embarked有缺失。
進行描述性統計
可以發現乘客平均獲救的概率為38%,乘客主要集中在2,3等艙,乘客平均年齡是29.7歲。
探討乘客總體分布情況
整體上看出獲救人數300多人,人數分布情況三等艙人數最多,接下來是一等艙,二等艙,死亡和獲救的人數分布較廣,頭等艙平均年齡偏大,40歲左右的人數較多,三等艙平均年齡偏小,20歲左右的人數較多,登船口岸人數按照S,C,Q遞減。
3.2挖掘與乘客是否生存的特征值
3.2.1艙位和獲救關系
事故發生后一等艙和二等艙獲救概率大,三等艙死亡人數明顯多於獲救人數,獲救概率小,可見客艙等級越高,生還率越高。
3.2.2性別和獲救關系
事故發生后,女性獲救人數多於死亡人數,男性獲救人數少於死亡人數,女性獲救概率大
3.2.3登船口岸和獲救的關系
事故發生后,C口岸獲救人數多於死亡人數,S口岸獲救人數遠小於死亡人數,Q口岸獲救人數較小於死亡人數,C口岸獲救概率大
3.3數據分析總結
本次分析主要探尋泰坦尼克號上的生還率和各因素(客艙等級、年齡、性別、上船港口等)的關系。
樣本數量為 891,海難發生后,生還者還剩 342 人,生還率為 38%。
泰坦尼克號上有一\二\三等艙三種船艙類型。海難發生前,一等艙有 216 人,二等艙 184 人,三等艙 491 人。事故發生后,一等艙、二等艙、三等艙的乘客人數變為136、87、119人。一等艙生還率為 63%,二等艙為 47%,三等艙為 24%。可見客艙等級越高,生還率越高。
891 人中,891人中,男性共577人,女性314人。事故發生后,男性變為109人,女性變為233人。男性生還109人,生還率僅為 19%。女性生還 233 人,生還率為 74%,遠遠高於男性的 19%。可見女性比男性在這次事故中更容易生還。
S 港口生還人數最多,C 次之, Q 最少。從生還率來看, C 港上船的生還率最高, Q 次之, S 生還率最低。
4數據預處理
查看數據缺失情況
本數據中Age,Cabin缺失嚴重,我們首先對Age數據利用scikit-learn中的RandomForest對缺失Age進行擬合,對Cabin按照有無標簽進行分類
將特征'Pclass','Cabin','Embarked'拆分並將特征因子數值化
將Age,Cabin數據進行標准化處理,數值變化范圍下降到[-1,1]之間。
5建立模型
導入數據,使用邏輯回歸模型對數據進行訓練
6模型結果
對需要預測的乘客test集進行同樣的數據預處理
用訓練好的模型對處理好的乘客ID進行預測並保存
結果:
評估指標
#查看得分
from sklearn.metrics import accuracy_score
predictions = lr.predict(x)
score = accuracy_score(y,predictions)
print(score)
#繪制ROC曲線
import matplotlib.pyplot as plt
from sklearn.metrics import roc_curve, auc
# y_test:實際的標簽, dataset_pred:預測的概率值。
fpr, tpr, thresholds = roc_curve(y, predictions)
roc_auc = auc(fpr, tpr)
#畫roc曲線,只需要plt.plot(fpr,tpr),變量roc_auc只是記錄auc的值,通過auc()函數能計算出來
fig = plt.figure()
plt.plot(fpr, tpr, lw=1, label='ROC(area = %0.2f)' % (roc_auc))
plt.xlabel("FPR (False Positive Rate)")
plt.ylabel("TPR (True Positive Rate)")
plt.title("Receiver Operating Characteristic, ROC(AUC = %0.2f)"% (roc_auc))
plt.show()
#畫ks曲線
plt.plot(tpr)
plt.plot(fpr)
plt.plot(tpr - fpr)
plt.show()
#AUC得分
from sklearn.metrics import roc_auc_score
# y_test:實際的標簽, dataset_pred:預測的概率值。
score = roc_auc_score(y, predictions)
print(score)
0.81