此文发表在简书,复制过来,在下方放上链接。
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