Titanic: Machine Learning from Disaster说明文档
文章目录
一、实验简介
1)概述:泰坦尼克号的沉没是历史上最为人熟知的海难事件之一。 1912 年 4 月 15 日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在船上的 2224 名乘客和机组人员中,共造成 1502 人死亡。这场耸人听闻的悲剧震惊了国际社会,从而促进了船舶安全规定的完善。造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管在沉船事件中幸存下有一些运气因素,但有些人比其他人更容易存活下来,比如女人,孩子和上流社会。在这个挑战中,要求完成哪些人可能存活下来的分析。特别的,要求运用机器学习工具来预测哪些乘客能够幸免于悲剧。
2)数据:训练集、测试集,均可从kaggle官网下载。
3)目标:利用训练集,筛选数据,选择适当模型,对测试集的数据进行预测,得到记录测试集中乘客的预测生存结果的相关文档。
二、观察数据
数据集包含train.csv及test.csv文件,其中train.csv钟包含891行,12列,共十个特征值。test.csv与train.csv类似,仅缺少目标列(Survived列)。train.scv数据集预览如图:
三、数据分析
1、PassengerId:每个用户的、对应唯一身份的Id号。
2、Survived:代表其是否存活,作为数据的目标列,其值为0/1。
3、Pclass:共有三类值,分别代表旅客三种不同的社会等级,其值为1,2,3。
4、Name:提取出数据中出现的称谓并分类,将分类结果做数值化处理。
5、Sex:将其离散化(即数值化),女性标记为1,男性标记为0.
6、Age:年龄中含有部分缺失值,且数据非离散性。根据其年龄的分层分布,将其分为4个层次。0-12岁为0层,12-18岁为1层,18-65岁为2层,大于65岁为4层.
7、SibSp、Parch:代表着直系亲属与旁系亲属。处理数据时将两类亲属的人数合并,产生新列:family,其人数是预测生存率的指标之一。
8、Ticke:船票编号。
9、Fare:船票费包含一个缺失值,取数据集中有相同Pclass的票价平均数作为该缺失值的取值。由分析可知,船票费与生活率存在较大联系。
10、Cabin:含有大量缺失值。由于在该变量中,缺失值也可作为一个隐含的标记,故本次预测中无使用本列数据。
11、Embarked:上船地点,包含部分缺失值。采用的填补缺失值的方法是将缺失值定义为该列数据的众数。
四、关联数据
1、各个数据之间关系:
- Pclass与性别分组中的生存率关系图:
由图像分析可知,女性普遍比男性生存率高,且社会地位越高,生存率越高。
- Embarked与生存率关系图:
由图像可知,在C(瑟堡)上船的人生存率更高。
- SibSp、Parch与生存率关系图:
-
性别与生存率的关系图:
由图可知,女性比男性的生存率更高。 -
Pclass、Sex分别与Age的关系关系图:
- 不同年龄下生存率的关系图:
该图可知,年龄可细分成六各层次,但虽30-60岁年龄段的关系图有波动,但是波动幅度不大,故可将年龄大致划分成四个层次(详细划分见下文)。
- 平均票价与生存率关系图:
分析可知,平均票价越高,生存率越高。
五、数据预处理
提取每个特征的价值,由于部分特征缺失值严重/对生存率影响不大,未被采用。经数次测试后,暂定以下特征作为训练集组成元素:
1、性别Sex:女性设为1,男性设为1。
# 将性别数值化,女性为1,男性为0
train_dt['Sex'] = train_dt['Sex'].map({
'female': 1, 'male': 0}).astype(int)
2、社会等级Pclass:由于数据集中已将其值设置为1/2/3,已满足随机分类森林所需的离散型数据要求,故无需改动。
3、年龄Age:年龄变量中存在少量缺失值,数据类型为连续型。我的解决方法是以年龄变量有无缺失值为划分标准,分为以年龄为目标的训练集和测试集。在训练集中对年龄进行分层,分为儿童(0,12]、少年(12,18]、成年(18,65]和老年(65,inf)四个层次。再利用训练集,调用随机分类森林对测试集进行分类。实现如下
# 年龄的缺失值处理:分类
def deal_age(train,flag):
# 儿童、少年、成年和老年
train['Age'][(train.Age <= 12) & (train.Age.notnull())] = 0
train['Age'][(train.Age <= 18) & (train.Age > 12) & (train.Age.notnull())] = 1
train['Age'][(train.Age > 18) & (train.Age <= 65) & (train.Age.notnull())] = 2
train['Age'][(train.Age > 65) & (train.Age.notnull())] = 3
# 训练,以及测试。
y = train[train.Age.notnull()].as_matrix()
x_test = train[train.Age.isnull()].drop(['Age','Survived'], axis=1).as_matrix()
if flag == 'T':
rfc = RandomForestClassifier(random_state=