赞
踩
kaggle链接:https://www.kaggle.com/c/titanic
泰坦尼克号案例可以说是kaggle的“hello world”,入门者的必看案例。
RMS泰坦尼克号沉没是历史上最臭名昭着的沉船之一。1912年4月15日,在她的处女航中,泰坦尼克号在与冰山相撞后沉没,在2224名乘客和机组人员中造成1502人死亡。这场耸人听闻的悲剧震惊了国际社会,并为船舶制定了更好的安全规定。
造成海难失事的原因之一是乘客和机组人员没有足够的救生艇。尽管幸存下沉有一些幸运因素,但有些人比其他人更容易生存,例如妇女,儿童和上流社会。
在这个挑战中,我们要求您完成对哪些人可能存活的分析。特别是,我们要求您运用机器学习工具来预测哪些乘客幸免于悲剧
目标
你的工作是预测一名乘客是否能够幸免于泰坦尼克号沉没。
对于测试集中的每个,您必须预测变量的0或1值。
度量
您的分数是您正确预测的乘客百分比。这简称为“准确度”
提交文件格式
参考示例提交文件(gender_submission.csv)。
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
话不多少,开始行动吧
我写了一个小函数来实现数据的下载,数据全都是官网原版数据,我存到了我的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()
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()
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 |
首先,通过观察数据(直接观察+info()),可知一些基本信息:
train_df.info()
print('_'*40)
test_df.info()
<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
因为数值型数据有很多数学特征,所以专门针对数值型数据进行观察,可以观察的有:计数、平均值、标准差、四分位、最大值、最小值等等。本例可观察到的信息有:
train_df.describe()
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 |
能够观察到一下信息:
train_df.describe(include=['O'])
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 |
这个只是查看数值型数据的数量分布,在本例中跟上面得到的结论有些重复。比如能看出各年龄层的分布、花费的分布、带配偶的分布。
%matplotlib inline
import matplotlib.pyplot as plt
train_df.hist(figsize=(15,10))
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)
进行上面的分析,我们主要是想做的事情有:
将性别、年龄、阶层、家庭成员单拎出来查看生存情况
#Pclass 查看阶层与生存的关系
train_df[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)
#阶层越高生存率越高(验证了假设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)
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人则低于孤身一人
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
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。