当前位置:   article > 正文

机器学习经典Kaggle案例:泰坦尼克号:从灾难中学习机器_kaggle泰坦尼克号

kaggle泰坦尼克号

kaggle链接:https://www.kaggle.com/c/titanic

一、简介

泰坦尼克号案例可以说是kaggle的“hello world”,入门者的必看案例。

1.1 比赛描述

RMS泰坦尼克号沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。

造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些幸运因素,但有些人比其他人更容易生存,例如妇女,儿童和上流社会。

在这个挑战中,我们要求您完成对哪些人可能存活的分析。特别是,我们要求您运用机器学习工具来预测哪些乘客幸免于悲剧

1.2 比赛评估

目标

你的工作是预测一名乘客是否能够幸免于泰坦尼克号沉没。
对于测试集中的每个,您必须预测变量的0或1值。

度量

您的分数是您正确预测的乘客百分比。这简称为“准确度”

提交文件格式

参考示例提交文件(gender_submission.csv)。

1.3 数据描述

Variable Definition Key
survival 生存 0 = No, 1 = Yes
pclass 票务舱 1 = 1st(上等), 2 = 2nd(中等), 3 = 3rd(下等)
sex 性别
Age 年龄
sibsp 泰坦尼克号上的兄弟姐妹/配偶的人数
parch 泰坦尼克号上的父母/孩子的人数
ticket 票号
fare 乘客花费
cabin 客舱号码
embarked 登船港口 C = Cherbourg, Q = Queenstown, S = Southampton

其中
sibsp:数据集定义这样的家庭关系…
兄弟姐妹=兄弟,姐妹,同父异母的弟弟,义妹
配偶=丈夫,妻子(包二奶和未婚夫被忽略)

parch:将数据集定义这样的家庭关系…
父母=母亲,父亲
孩子=女儿,儿子,继女,继子
有些孩子只带着保姆旅行,因此对他们来说parch = 0

1.5 工作流程

  1. 问题或问题的定义。
  2. 获取训练和测试数据。
  3. 数据清洗,准备,清理数据。
  4. 分析,识别模式并探索数据。
  5. 建模,预测和解决问题。
  6. 可视化,报告和呈现问题解决步骤和最终解决方案。
  7. 提供或提交结果。

二、代码

话不多少,开始行动吧

2.1 获取数据

2.1.1 下载数据

我写了一个小函数来实现数据的下载,数据全都是官网原版数据,我存到了我的github上。(https://github.com/824024445/KaggleCases)

所有数据都下载到了你当前文件夹下的datasets文件下,每个案例涉及到的数据全部下载到了以该案例命名的文件夹下。

我所有的kaggle案例的博客,下载数据均会使用这个函数,只需要修改前两个常量即可。
> 注:此函数只用于下载数据,函数在该代码框内就运行了。不再用到其它代码中,包括常量,也不会用在其他地方。

import os
import zipfile
from six.moves import urllib

FILE_NAME = "titanic.zip" #文件名
DATA_PATH ="datasets/titanic" #存储文件的文件夹,取跟文件相同(相近)的名字便于区分
DATA_URL = "https://github.com/824024445/KaggleCases/blob/master/datasets/" + FILE_NAME + "?raw=true"


def fetch_data(data_url=DATA_URL, data_path=DATA_PATH, file_name=FILE_NAME):
    if not os.path.isdir(data_path): #查看当前文件夹下是否存在"datasets/titanic",没有的话创建
        os.makedirs(data_path)
    zip_path = os.path.join(data_path, file_name) #下载到本地的文件的路径及名称
    # urlretrieve()方法直接将远程数据下载到本地
    urllib.request.urlretrieve(data_url, zip_path) #第二个参数zip_path是保存到的本地路径
    data_zip = zipfile.ZipFile(zip_path)
    data_zip.extractall(path=data_path) #什么参数都不输入就是默认解压到当前文件,为了保持统一,是泰坦尼克的数据就全部存到titanic文件夹下
    data_zip.close()
fetch_data()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
2.1.2 读取数据
import pandas as pd
import numpy as np

train_df = pd.read_csv("datasets/titanic/train.csv")
test_df = pd.read_csv("datasets/titanic/test.csv")
combine = [train_df, test_df]
train_df.head()
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
PassengerId Survived Pclass Name Sex Age SibSp Parch Ticket Fare Cabin Embarked
0 1 0 3 Braund, Mr. Owen Harris male 22.0 1 0 A/5 21171 7.2500 NaN S
1 2 1 1 Cumings, Mrs. John Bradley (Florence Briggs Th... female 38.0 1 0 PC 17599 71.2833 C85 C
2 3 1 3 Heikkinen, Miss. Laina female 26.0 0 0 STON/O2. 3101282 7.9250 NaN S
3 4 1 1 Futrelle, Mrs. Jacques Heath (Lily May Peel) female 35.0 1 0 113803 53.1000 C123 S
4 5 0 3 Allen, Mr. William Henry male 35.0 0 0 373450 8.0500 NaN S

2.2 通过描述数据进行分析

2.2.1 直接观察+info()

首先,通过观察数据(直接观察+info()),可知一些基本信息:

  • 哪些特征是类目?是基于名称、序数、比值还是区间?Survived, Sex, Embarked, Pclass(序数)
  • 哪些特征是数字?是连续的、离散的还是基于时间序列的?连续值:Age, Fare.离散值:SibSp, Parch
  • 哪些特征是混合型数据?Ticket,Cabin
  • 哪些特征可能包含拼写错误或者其它错误?Name
  • 哪些特征可能包含空值、null或者空格?Cabin > Age > Embarked关于null,Cabin > Age 关于空值
  • 各个特征的数据类型是什么?七个特征是整数或浮点数,五个特征是字符串
train_df.info()
print('_'*40)
test_df.info()
  • 1
  • 2
  • 3
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.6+ KB
________________________________________
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
2.2.2 describe()针对数值型数据

因为数值型数据有很多数学特征,所以专门针对数值型数据进行观察,可以观察的有:计数、平均值、标准差、四分位、最大值、最小值等等。本例可观察到的信息有:

  • 总共891个样本,占总样本数(2224)的40%
  • 存活是一个取值0和1的类目特征,大概有38%的人存活了下来(实际存活率是32%)
  • 年龄在65-80岁之间的老年乘客(<1%)很少
  • 大约30%的乘客有兄弟姐妹或者配偶。(sibsp观察50%分位)
  • 大多数乘客(>75%)没有和父母和孩子一起旅行。(parch观察75%分位)
  • 很少有乘客(<1%)能够支付高达512美元的票价
train_df.describe()
  • 1
PassengerId Survived Pclass Age SibSp Parch Fare
count 891.000000 891.000000 891.000000 714.000000 891.000000 891.000000 891.000000
mean 446.000000 0.383838 2.308642 29.699118 0.523008 0.381594 32.204208
std 257.353842 0.486592 0.836071 14.526497 1.102743 0.806057 49.693429
min 1.000000 0.000000 1.000000 0.420000 0.000000 0.000000 0.000000
25% 223.500000 0.000000 2.000000 20.125000 0.000000 0.000000 7.910400
50% 446.000000 0.000000 3.000000 28.000000 0.000000 0.000000 14.454200
75% 668.500000 1.000000 3.000000 38.000000 1.000000 0.000000 31.000000
max 891.000000 1.000000 3.000000 80.000000 8.000000 6.000000 512.329200
2.2.3 describe(include=[‘O’])针对类目特征

能够观察到一下信息:

  • 名称在整个数据集中是唯一的(count = unique = 891)
  • 性别中男性比较多577
  • 票号有22%重复的值
  • 客舱有几种,有四个人住同一间的
  • 大多数人从S港上船
train_df.describe(include=['O'])
  • 1
Name Sex Ticket Cabin Embarked
count 891 891 891 204 889
unique 891 2 681 147 3
top Smith, Mr. James Clinch male 347082 B96 B98 S
freq 1 577 7 4 644
2.2.4 matplotlib观察各特征之间的关系

这个只是查看数值型数据的数量分布,在本例中跟上面得到的结论有些重复。比如能看出各年龄层的分布、花费的分布、带配偶的分布。

%matplotlib inline
import matplotlib.pyplot as plt

train_df.hist(figsize=(15,10))
  • 1
  • 2
  • 3
  • 4
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c684f98>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c69ca90>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c644cf8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c66af60>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c61d208>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c5c6470>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c5ed7b8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c595d68>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x7ffa1c595da0>]],
      dtype=object)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

[外链图片转存失败(img-lIpfnUtx-1566121510909)(https://github.com/824024445/KaggleCases/blob/master/img/titanic/output_31_1.png)]

2.2.5 基于初始阶段数据分析的假设

进行上面的分析,我们主要是想做的事情有:

  • 了解相关性:我们想知道每个特征与生存的相关性
  • 纠正删除特征:一些特性可能需要删除:ticket(票号)重复值太多(22%),而且它与是否生存之间没有相关性;cabin(船舱)有太多的缺失值;PassengerId更是没有什么用处;Name不仅难处理,更没什么用处;
  • 创建新特征:有些特征本身与目标值相关性很低,但是可以通过组合创建新的特征来表现出很好的相关性:综合Parch和SibSp可以获得家庭成员的总数;将年龄划分成年龄段新特征;票价划分成区间新特征;
  • 做出假设:
    • 假设1:女人更可能生存
    • 假设2:孩子(Age
2.2.6 验证假设

将性别、年龄、阶层、家庭成员单拎出来查看生存情况

#Pclass 查看阶层与生存的关系
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
#阶层越高生存率越高(验证了假设3)
  • 1
  • 2
  • 3
Pclass Survived
0 1 0.629630
1 2 0.472826
2 3 0.242363
#Sex 性别与生存的关系
train_df[["Sex", "Survived"]].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)
#女性生存率很高(验证了假设1)
  • 1
  • 2
  • 3
Sex Survived
0 female 0.742038
1 male 0.188908
#SibSp 兄弟姐妹、配偶与生存的关系
train_df[["SibSp", "Survived"]].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)
#兄弟姐妹配偶在1--2人时存活率高于孤身一人,超过2人则低于孤身一人
  • 1
  • 2
  • 3
SibSp Survived
1 1 0.535885
2 2 0.464286
0 0 0.345395
3 3 0.250000
4 4 0.166667
5 5 0.000000
6 8 0.000000
#Parch 父母、孩子与生存的关系
train_df
  • 1
声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号