前言
开始Kaggle练习,最先进行的当然是Kaggle的“Hello World”---“Titanic: Machine Learning from Disaster",即预测哪些泰坦尼克的旅客幸存。自己最开始写的很乱,包括数据处理、分析、建模等。参考了Kaggle的一篇[1]再整理一遍,清晰很多。实验并没有得到一个很好的结果,但是规范了整个流程,因此写下笔记 。
本文约6.2k字,预计阅读15分钟
主要流程
竞赛解决方案的流程主要分为以下7个步骤:
问题的定义;
获取训练集和测试集;
整理、准备、清洗数据;
分析、探索数据;
建模、预测和解决问题;
可视化、报告和呈现问题解决步骤和最终解决方案;
提交结果;
当然这个只是一般的步骤,3、4可以进行交叉交换,可视化也可以应用到多个阶段。
问题定义
泰坦尼克数据集的机器学习研究可以说是Kaggle的“Hello world”。问题的直观定义很简单:使用机器学习创建一个模型,预测哪些乘客在泰坦尼克号沉船中幸存。
其他的信息条件:
1912年4月15日,被广泛认为“永不沉没”的皇家邮轮“泰坦尼克号”在处女航中撞上一座冰山后沉没。不幸的是,船上没有足够的救生艇,导致2224名乘客和船员中有1502人死亡。(存活率为:32.46%)
虽然在生存中有一些运气因素,但似乎有些群体的人比其他人更有可能生存下来。
获取数据集
数据集的获取很简单,使用pandas包即可。
import pandas as pd
train_df = pd.read_csv('../input/titanic/train.csv')
test_df = pd.read_csv('../input/titanic/test.csv')
分析数据
数据的描述(即特征)
赛题中Data部分给出了数据特征,也可以通过pandas进行查看:
train_df.columns.values
Out:
array(['PassengerId', 'Survived', 'Pclass', 'Name', 'Sex', 'Age', 'SibSp',
'Parch', 'Ticket', 'Fare', 'Cabin', 'Embarked'], dtype=object)
结合赛题描述,我们可以对上述特征进行归类:
分类特征:这里指的是可以对数据集按照该特征可以明确的划分为一系列相似的样本。上述属于分类特征的有:
Pclass(阶级)、Survived(是否存活)、Sex(性别)、Embarked(出发地);
数值型特征:值会随着样本的变化而变化,可以是连续的、离散的或基于时间序列的,这里有:
-
Age(年龄)、Fare(票价)、SibSp(船上兄弟姐妹数量)、Parch(船上父母孩子数量)【注:后两者属于数值型特征是因为当不知道数据集时无法确定特征的取值范围,是随着样本而变化】
其他特征:很难找到有效的的规律,这里还剩下:
-
Name(姓名)、Ticket(船票号)、Cabin(船舱号);
具体数据
在对训练集的首尾数据进行查看:
train_df.head() train_df.tail()
通过数据中的信息,可以进行得到以下结论:
Name特征中,虽然是字符串类型,但包含了一些性别特征,如(Mr、Mrs、Miss);
Ticket特征,包含了数字和字母的组合,我们很难从中找出一些规律;
我们发现,Cabin特征中存在缺失值,我们需要进一步进行判断,并查看其他特征是否也有缺失;
Passengerld特征为序号,对模型建立应该并无影响;
数据结构
首先最为关键的是数据缺失问题,Pandas可以通过很多种方式进行判断每个特征是否存在缺失值。最简单的是直接查看数据集的全局信息。
train_df.info() print('-' * 40) test_df.info() <class 'pandas.core.frame.DataFrame'> RangeIndex: 891 entries, 0 to 890 Data columns (total 12 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 891 non-null int64 1 Survived 891 non-null int64 2 Pclass 891 non-null int64 3 Name 891 non-null object 4 Sex 891 non-null object 5 Age 714 non-null float64 6 SibSp 891 non-null int64 7 Parch 891 non-null int64 8 Ticket 891 non-null object 9 Fare 891 non-null float64 10 Cabin 204 non-null object 11 Embarked 889 non-null object dtypes: float64(2), int64(5), object(5) memory usage: 83.7+ KB ________________________________________ <class 'pandas.core.frame.DataFrame'> RangeIndex: 418 entries, 0 to 417 Data columns (total 11 columns): # Column Non-Null Count Dtype --- ------ -------------- ----- 0 PassengerId 418 non-null int64 1 Pclass 418 non-null int64 2 Name 418 non-null object 3 Sex 418 non-null object 4 Age 332 non-null float64 5 SibSp 418 non-null int64 6 Parch 418 non-null int64 7 Ticket 418 non-null object 8 Fare 417 non-null float64 9 Cabin 91 non-null object 10 Embarked 418 non-null object dtypes: float64(2), int64(4), object(5) memory usage: 36.0+ KB
通过上述数据集的信息我们可以分析:
数据集中有7个为数值型,5个为object类型;
训练集共891个样本,Age特征缺失177(即19.87%),Cabin特征缺失687(即77.10%),Embarked特征缺失2(即0.22%);
测试集共418个样本,Ag