泰坦尼克号数据科学解决方案
该笔记本引导我们了解在Kaggle等网站上解决数据科学竞赛的典型工作流程。
有几个优秀的notebooks可以研究数据科学竞赛的参赛作品。然而,许多notebooks会跳过一些关于解决方案开发的解释,因为这些笔记本是为专家开发的,面向专家。该笔记本的目标是遵循逐步工作流程,解释每一步以及我们在解决方案开发过程中所做每个决策的理由。
Workflow stages
工作流程阶段
竞赛解决方案的工作流程经历七个阶段,这些阶段在《数据科学解决方案》一书中有所描述。
- 问题定义。
- 获取训练和测试数据。
- 整理、准备、清理数据。
- 分析、识别模式、探索数据。
- 建模、预测并解决问题。
- 可视化、报告并展示问题解决步骤和最终解决方案。
- 提供或提交结果。
该工作流程指示了每个阶段可能如何相互衔接的一般顺序。然而,也存在一些例外的使用案例。
- 我们可以结合多个工作流程阶段。我们可以通过可视化数据进行分析。
- 在指示的阶段之前执行一个阶段。我们可以在整理数据之前和之后分析数据。
- 在我们的工作流程中多次执行一个阶段。可视化阶段可以多次使用。
- 完全省略一个阶段。我们可能不需要提供阶段来将数据集产品化或服务化,以便参加竞赛。
Question and problem definition
问题和问题定义
Kaggle等竞赛网站定义要解决的问题或要提出的问题,同时提供用于训练数据科学模型的数据集,并根据测试数据集测试模型结果。泰坦尼克号生存竞赛的问题或问题定义在Kaggle上描述如下。
根据训练样本集中的乘客生存与否的信息,我们的模型能否根据不包含生存信息的测试数据集确定这些乘客是否生存。
我们还可能希望对我们问题的领域进行一些初步了解。这在Kaggle竞赛描述页面上有所描述。以下是需要注意的要点。
- 1912年4月15日,泰坦尼克号在首航中与冰山相撞,沉没,导致2224名乘客和船员中有1502人遇难。生存率为32%。
- 导致这次船难造成如此多生命损失的原因之一是没有足够的救生艇供乘客和船员使用。
- 虽然生存下来的因素中有一定的运气成分,但某些群体的生存几率比其他群体高,例如女性、儿童和上层阶级。
Workflow goals
工作流程目标
数据科学解决方案工作流程解决七个主要目标。
- 分类。我们可能希望对样本进行分类或归类。我们也可能希望了解不同类别与我们解决目标之间的影响或相关性。
- 相关性。可以根据训练数据集中可用的特征来解决问题。数据集中的哪些特征对我们的解决目标有显著贡献?从统计学的角度看,特征与解决目标之间是否存在相关性?当特征值发生变化时,解决状态是否也会变化,反之亦然?这可以针对给定数据集中的数值特征和分类特征进行测试。我们还可能希望确定生存以外的特征之间的相关性,以便实现后续目标和工作流程阶段。相关某些特征可能有助于创建、完成或修正特征。
- 转换。对于建模阶段,需要准备数据。根据模型算法的选择,可能需要将所有特征转换为数值等效值。例如,将文本分类值转换为数值值。
- 补全。数据准备还可能需要我们估计特征中的任何缺失值。当没有缺失值时,模型算法的表现可能会更好。
- 纠正。我们还可能分析给定的训练数据集,寻找特征中的错误或可能不准确的值,并尝试纠正这些值或排除包含错误的样本。检测样本或特征中的异常值是一种方法。如果某个特征对分析没有贡献或可能显著扭曲结果,我们也可以完全丢弃该特征。
- 创建。我们能否基于现有特征或特征集创建新特征,使得新特征符合相关性、转换、完整性目标。
- 图表。如何根据数据的性质和解决目标选择合适的可视化图表和图形。
# data analysis and wrangling
import pandas as pd
import numpy as np
import random as rnd
# visualization
import seaborn as sns
import matplotlib.pyplot as plt
%matplotlib inline
# machine learning
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC, LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.linear_model import Perceptron
from sklearn.linear_model import SGDClassifier
from sklearn.tree import DecisionTreeClassifier
Dataset Description
数据集描述
Overview
The data has been split into two groups:
- training set (train.csv)
- test set (test.csv)
训练集应用于构建你的机器学习模型。对于训练集,我们提供每位乘客的结果(也称为“真实值”)。你的模型将基于乘客的性别和舱位等“特征”。你还可以使用特征工程来创建新特征。
测试集应用于查看你的模型在未见数据上的表现。对于测试集,我们不提供每位乘客的真实值。你的任务是预测这些结果。对于测试集中的每位乘客,使用你训练的模型预测他们是否在泰坦尼克号沉没中幸存。
Data Dictionary
Variable | Definition | Key |
---|---|---|
survival | Survival | 0 = No, 1 = Yes |
pclass | Ticket class | 1 = 1st, 2 = 2nd, 3 = 3rd |
sex | Sex | |
Age | Age in years | |
sibsp | # of siblings / spouses aboard the Titanic | |
parch | # of parents / children aboard the Titanic | |
ticket | Ticket number | |
fare | Passenger fare | |
cabin | Cabin number | |
embarked | Port of Embarkation | C = Cherbourg, Q = Queenstown, S = Southampton |
Variable Notes
pclass: 社会经济地位(SES)的代理
1st = Upper
2nd = Middle
3rd = Lower
age: 如果年龄小于1,则为小数。如果年龄是估算的,则形式为xx.5
sibsp: 数据集以这种方式定义家庭关系...
Sibling = brother, sister, stepbrother, stepsister
兄弟姐妹 = 兄弟、姐妹、同父异母的兄弟、同母异父的姐妹
Spouse = husband, wife (mistresses and fiancés were ignored)
配偶 = 丈夫、妻子(情妇和未婚夫被忽略)
parch: 数据集以这种方式定义家庭关系...
Parent = mother, father
Child = daughter, son, stepdaughter, stepson
一些孩子仅与保姆一起旅行,因此他们的parch=0。
Acquire data¶
获取数据¶
Python Pandas包帮助我们处理数据集。我们首先将训练和测试数据集导入Pandas DataFrame中。我们还将这些数据集合并,以便对两个数据集一起进行某些操作。
train_df = pd.read_csv('../input/train.csv')
test_df = pd.read_csv('../input/test.csv')
combine = [train_df, test_df]
Copy
Analyze by describing data
通过描述数据进行分析
Pandas还帮助描述数据集,回答我们项目早期的以下问题。
数据集中有哪些特征可用?
注意特征名称,以便直接操作或分析这些特征。这些特征名称在Kaggle数据页面上有描述。
print(train_df.columns.values)
Copy
['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch'
'Ticket' 'Fare' 'Cabin' 'Embarked']
哪些特征是分类特征?
这些值将样本分类为相似样本的集合。分类特征中的值可以是名义的、顺序的、比率的或区间的?这有助于我们选择适当的可视化图表。
Categorical: Survived, Sex, and Embarked. Ordinal: Pclass.
分类特征:是否生存、性别和登船港口。顺序特征:舱位。
哪些特征是数值特征?
这些值在样本之间变化。数值特征中的值可以是离散的、连续的或时间序列的?这有助于我们选择适当的可视化图表。
Continous: Age, Fare. Discrete: SibSp, Parch.
连续特征:年龄、票价。离散特征:兄弟姐妹数量、父母数量。
# preview the data
train_df.head()
Copy
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 |
哪些特征是混合数据类型?
同一特征内的数值和字母数字数据。这些是需要纠正的目标。
票号是数字和字母数字数据类型的混合。舱位是字母数字的。
哪些特征可能包含错误或拼写错误?
对于大型数据集,这更难以审查,但从较小的数据集中查看一些样本可能会直接告诉我们哪些特征可能需要纠正。
姓名特征可能包含错误或拼写错误,因为描述姓名的方式有很多种,包括使用称谓、圆括号和用于替代或简短名称的引号。
train_df.tail()
Copy
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|---|
886 | 887 | 0 | 2 | Montvila, Rev. Juozas | male | 27.0 | 0 | 0 | 211536 | 13.00 | NaN | S |
887 | 888 | 1 | 1 | Graham, Miss. Margaret Edith | female | 19.0 | 0 | 0 | 112053 | 30.00 | B42 | S |
888 | 889 | 0 | 3 | Johnston, Miss. Catherine Helen "Carrie" | female | NaN | 1 | 2 | W./C. 6607 | 23.45 | NaN | S |
889 | 890 | 1 | 1 | Behr, Mr. Karl Howell | male | 26.0 | 0 | 0 | 111369 | 30.00 | C148 | C |
890 | 891 | 0 | 3 | Dooley, Mr. Patrick | male | 32.0 | 0 | 0 | 370376 | 7.75 | NaN | Q |
哪些特征包含空白、空值或空值?
这些需要纠正:
Cabin > Age > Embarked features contain a number of null values in that order for the training dataset.
舱位 > 年龄 > 登船港口特征在训练数据集中按此顺序包含多个空值。
Cabin > Age are incomplete in case of test dataset.
舱位 > 年龄在测试数据集中是不完整的。
各种特征的数据类型是什么?
七个特征是整数或浮点数。在测试数据集中有六个。
五个特征是字符串(对象)。
train_df.info()
print('_'*40)
test_df.info()
Copy
<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
数值特征值在样本中的分布是什么?
这有助于我们确定训练数据集在实际问题领域中的代表性等早期见解。
- 总样本为891个,占泰坦尼克号上实际乘客人数(2,224)的40%。
- 生存是一个具有0或1值的分类特征。
- 大约38%的样本幸存,代表实际生存率为32%。
- 大多数乘客(> 75%)没有与父母或孩子一起旅行。
- 近30%的乘客在船上有兄弟姐妹和/或配偶。
- 票价差异显著,少数乘客(<1%)支付高达512美元。
- 在65-80岁年龄范围内有少数老年乘客(<1%)。 </