2018.12.3 更新
一、问题背景:
此题是关于泰坦尼克号人员存活的预测问题,要求下载训练数据和测试数据,使用Python编程语言、pandas、matplotlib、机器学习等相关库,完成模型的建立、评价、优化,并使用测试数据进行预测。
二、数据概览:
题中提供了两份数据,一是测试,一是训练集,数据包含乘客id,存活情况,等级,姓名,性别,年龄,兄妹数,父母数,船票,票价,仓位,登陆港口等信息。
先看看train-data数据情况:[891 rows x 12 columns]
PassengerId Survived Pclass ... Fare Cabin Embarked
0 1 0 3 ... 7.2500 NaN S
1 2 1 1 ... 71.2833 C85 C
2 3 1 3 ... 7.9250 NaN S
3 4 1 1 ... 53.1000 C123 S
4 5 0 3 ... 8.0500 NaN S
5 6 0 3 ... 8.4583 NaN Q
6 7 0 1 ... 51.8625 E46 S
7 8 0 3 ... 21.0750 NaN S
8 9 1 3 ... 11.1333 NaN S
9 10 1 2 ... 30.0708 NaN C
10 11 1 3 ... 16.7000 G6 S
11 12 1 1 ... 26.5500 C103 S
12 13 0 3 ... 8.0500 NaN S
13 14 0 3 ... 31.2750 NaN S
14 15 0 3 ... 7.8542 NaN S
15 16 1 2 ... 16.0000 NaN S
查看空值:
PassengerId 0
Survived 0
Pclass 0
Name 0
Sex 0
Age 177
SibSp 0
Parch 0
Ticket 0
Fare 0
Cabin 687
Embarked 2
dtype: int64
从显示数据中不难看出列Age ,Cabin, Embarked 中存在空值,其中Cabin,Age中空值较多,空值将在数据处理中得到处理
再看看test_data情况:[418 rows x 11 columns]
PassengerId Pclass ... Cabin Embarked
0 892 3 ... NaN Q
1 893 3 ... NaN S
2 894 2 ... NaN Q
3 895 3 ... NaN S
4 896 3 ... NaN S
5 897 3 ... NaN S
6 898 3 ... NaN Q
7 899 2 ... NaN S
8 900 3 ... NaN C
9 901 3 ... NaN S
10 902 3 ... NaN S
11 903 1 ... NaN S
12 904 1 ... B45 S
13 905 2 ... NaN S
14 906 1 ... E31 S
15 907 2 ... NaN C
16 908 2 ... NaN Q
17 909 3 ... NaN C
Test_data 空值:
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 86
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 327
Embarked 0
dtype: int64
Test数据集中列 Age,Cabin,Fare中含有空值,将在下一步进行处理。
三、数据处理
由于数据集中含有大量的空值,所以本次数据分析的数据处理主要是对空值的处理.
- train_data 补充空值
- Age 空值补充
对Age空值进行补充,我首先想到的是简单地用平均值进行填充,但仔细一想,船上人员年龄分布广泛,仅仅使用平均值补充,明显不够严谨,仔细观察数据之后发现在name一列数据中记录了人员称呼,可以根据称呼将人员进行分类,用同类人年龄的平均数进行空值补充,会比整体平均数合理许多。
不同称呼下,人员年龄均值:
col_0 Age
Title
Capt 70.000000
Col 58.000000
Don 40.000000
Dr 42.000000
Jonkheer 38.000000
Lady 48.000000
Major 48.500000
Master 4.574167
Miss 21.773973
Mlle 24.000000
Mme 24.000000
Mr 32.368090
Mrs 35.898148
Ms 28.000000
Rev 43.166667
Sir 49.000000
the Countes 33.000000
- Cabin空值补充
由于Cabin缺失值超过整体的80%,故决定不对其进行进一步处理,仅将有Cabin数据的表示为1,无cabin数据的表示为0。
- Embarked空值补充
登陆口岸数据确实较少,统计登陆口岸的众数,得知众数为S
故用S对空值进行填充
至此,train数据集中无空值!
- Test_data空值补充
- Age空值补充
与训练集空值补充相同
不同称呼下,人员年龄均值:
col_0 Age
Title
Col 50.000000
Dona 39.000000
Dr 53.000000
Master 7.406471
Miss 21.774844
Mr 32.000000
Mrs 38.903226
Ms NaN
Rev 35.500000
但可见Ms 年龄均值为Nan,是由于数据中Ms的年龄都为空,此处选则用训练集Ms下均值42,进行填充。
- Fare空值补充
空值仅有一个,使用均值进行填充
- Cabin空值补充
同训练集操作
至此,训练集,测试集都无空值,进行下一步,特征工程构建
构建特征工程:
- 分析不同特征值对存活的影响
- Sex
根据性别绘制存活条形图
途中可见女性存活率远大于男性,存活率与性别有着很大的关系。
- Pclass
根据仓位等级绘制生存率条形图
由图不难看出仓位等级与存活率成正比
- Age
根据年龄绘制关系图
仔细观察图片可以发现 青壮年的存活率还是相对较高,在逃生过程中,老人小孩不占优势
- Name
称呼与生存率也有一定关系,图中countess,Lady,mlle,Mme,Ms,Sir存活率较高。
- SilbSp
在没有兄弟姐妹的人存活率较低,有兄妹的人群生存死亡几率大致相等
- Parch
没有父母的人群死亡率较高。
结合两图看出,若独自一人,那么其存活率比较低;但是如果亲友太多的话,存活率也会很低。
- Fare
由上图可知,票价与是否生还有一定的相关性,生还者的平均票价要大于未生还者的平均票价。
- Cabin
含有仓位信息的成活率高于无仓位信息的,可作为特征值
- Embarked
由上可以看出,在不同的港口上船,生还率不同,C最高,Q次之,S最低。
以上为所给出的数据特征与生还与否的分析。
- 确定特征值
- 特征值处理。
之前在补充年龄空值时添加了特征title,title下有:
['Capt' ,'Col' ,'Don' ,'Dr', 'Jonkheer' ,'Lady', 'Major', 'Master', 'Miss' ,'Mlle', 'Mme', 'Mr' ,'Mrs', 'Ms', 'Rev', 'Sir', 'the Countess'],
由于部分称呼下人数较少,故将以下部分:
['Capt' ,'Col' ,'Don' ,'Dr', 'Jonkheer' ,'Lady', 'Major', 'Master','Rev', 'Sir', 'the Countess']划分为Others
再将Parch和silbsp 合并为familysize 即家庭人数
新增特征值New_age
由于青壮年成活率较高,故将18-45岁的人设置为1,其余为0.
2.确定特征值
Features=['Age', 'Cabin', 'Child', 'Embarked=C', 'Embarked=Q', 'Embarked=S', 'Fare', 'Old', 'Pclass', 'Sex=female', 'Sex=male', 'Title=Miss', 'Title=Mr', 'Title=Mrs', 'Title=Others', 'fimalysize']
模型建立
- 选取模型
本次选择的是随机森林。
- 调参
最终建立的模型为:
训练
结果
交叉验证得分:
上传
最终成绩
模型改进:
- 数据使用不够充分,,没有将cabin ticket 充分利用,ticket中含有座位信息,靠窗或者靠经逃生通道的座位存活率会高些。
- 模型选择单一,在进行年龄空值补充的时候也只时简单的分类插值,如果能应用机器学习算法进行年龄预测,准确率会更高。
3.变量Age只是简单划分为青壮年和其他,根据数据分布进行更精确的划分可能减小误差,改进预测结果。