从Kaggle官网下载数据:train 、test。
赛事描述:
- 泰坦尼克号的沉没是历史上最臭名昭著的沉船之一。1912年4月15日,泰坦尼克号在处女航时与冰山相撞沉没,2224名乘客和船员中有1502人遇难。这一耸人听闻的悲剧震惊了国际社会,并导致更好的船舶安全法规。船难造成如此巨大的人员伤亡的原因之一是船上没有足够的救生艇供乘客和船员使用。虽然在沉船事件中幸存下来是有运气因素的,但有些人比其他人更有可能存活下来。比如妇女、儿童和上层阶级。
- 在此次比赛中,我们需要参赛者预测哪一类人更有可能存活下来。尤其是,我们需要你用机器学习的工具去预测哪些乘客在这次灾难中幸存。
目录
- 提出问题
- 理解数据
- 数据处理(数据预处理and特征工程)
- 模型构建与评估
- 总结
一.提出问题:
根据已知信息预测test中418名乘客生存与否,并将预测结果提交。
问题分析:
即基于一组预测变量预测一个分类结果(二分类)。有监督机器学习领域中包含可用于分类的方法:逻辑回归、KNN、决策树、随机森林、支持向量机、神经网络等。本文选择Logistic 和 KNN 来做分类预测。
二.理解数据:
先初步了解一下变量个数、数据类型、分布情况、缺失情况等,并做出一些猜想。
#调入所需模块
#数据处理
import numpy as np
import pandas as pd
import re
#作图
import matplotlib.pyplot as plt
%matplotlib inline
import seaborn as sns
#设置作图风格
sns.set_style("darkgrid")
OK,先浏览数据:
#读取数据
train = pd.read_csv(r"G:\Kaggle\Titanic\train.csv")
test = pd.read_csv(r"G:\Kaggle\Titanic\test.csv")
#看一下训练集前6行
train.head(6)
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 |
5 | 6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | NaN | Q |
训练集字段:乘客ID、是否生存、舱位等级、姓名、性别、年龄、堂兄弟和堂兄妹个数、父母和孩子的个数、船票编码、票价、客舱、上船口岸。
#随机查看测试集的数据
test.sample(6)
PassengerId | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked | |
---|---|---|---|---|---|---|---|---|---|---|---|
417 | 1309 | 3 | Peter, Master. Michael J | male | NaN | 1 | 1 | 2668 | 22.3583 | NaN | C |
224 | 1116 | 1 | Candee, Mrs. Edward (Helen Churchill Hungerford) | female | 53.0 | 0 | 0 | PC 17606 | 27.4458 | NaN | C |
99 | 991 | 3 | Nancarrow, Mr. William Henry | male | 33.0 | 0 | 0 | A./5. 3338 | 8.0500 | NaN | S |
410 | 1302 | 3 | Naughton, Miss. Hannah | female | NaN | 0 | 0 | 365237 | 7.7500 | NaN | Q |
41 | 933 | 1 | Franklin, Mr. Thomas Parham | male | NaN | 0 | 0 | 113778 | 26.5500 | D34 | S |
70 | 962 | 3 | Mulvihill, Miss. Bertha E | female | 24.0 | 0 | 0 | 382653 | 7.7500 | NaN | Q |
与训练集相比,少了目标变量Survived,其余字段都是一样的。
train.info()
print("==" * 50)
test.info()
#查看数值型数据情况:
train.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.describe(include=['O'])
Name | Sex | Ticket | Cabin | Embarked | |
---|---|---|---|---|---|
count | 891 | 891 | 891 | 204 | 889 |
unique | 891 | 2 | 681 | 147 | 3 |
top | Kink-Heilmann, Miss. Luise Gretchen | male | 1601 | C23 C25 C27 | S |
freq | 1 | 577 | 7 | 4 | 644 |
A.基本描述:
类别型变量:Survived、Pclass(顺序)、Sex、Embarked。数值型变量:Age、 SibSp(离散)、Parch(离散)、Fare.
总共4个字段有缺失,缺失程度不一样(Age、Cabin缺较多,Fare、Embarked缺较少)
训练集中:
- (1)共有891名乘客,生存率为38%
- (2)年龄最小为0.42,最大为80岁,除去缺失值,平均年龄为29,高龄人士较少
- (3)约25%的乘客有一个或以上的兄弟姐妹陪伴的,75%以上的乘客没有与父母孩子同行
- (4)票价平均值在32美元,最高值在512美元,差距较大
- (5)每个人的名字都是无重复的
- (6)男性共计577人,男乘客较女乘客多
- (7)Ticket有681个不同的值
- (8)Cabin的数据缺失较多,891人中有记录的仅为204人
- (9)上船口岸有缺失值,644人在S港口上船,占比较大
B.猜想:
现已知目标变量为Survived,其余都作为建模可供考虑的特征。下面我们要探究一下现有的每一个变量对乘客生存的影响程度,有用的留下,没用的删除,也看能不能发掘出新的信息帮助构建模型。可做出以下猜想:
1.Pclass、Fare反映一个人的身份、财力情况,在危难关头,社会等级高的乘客的生存率比等级低的乘客的生存率高。
2.在灾难发生时,人类社会的尊老爱幼、女性优先必会起作用。故老幼、女性生存率更高。
3.有多个亲人同行的话,人多力量大,生存率可能更高些。
4.名字、Ticket看不出能反映什么,可能会删掉。
5.Id在记录数据中有用,在分析中没什么用,删掉。
C:缺失数据:
对于缺失的数据,需要根据不同情况进行处理。
处理缺失值方式(在scikit-learn中,build models时若有缺失值会报错):
删(简单粗暴,dropna)
- 完整实例删除,即删行(简单粗暴,当样本量大,且缺失案例较少时用)
- 删除有缺失值的特征(该列缺失严重,且该特征对建模效果影响不大时用)
Imputation(从已知的部分数据中推断出缺失值,虽然估计值并不绝对百正确,但是比上述删除列的做法来说,此法建模效果更好一点)
- 用该特征的均值、中位数、众数等去估算(普通版)
- 由其他已知的数值型数据,去估算缺失值的值(进阶版)
D.数据类型转换:
字符型都要转换成数值型数据。
# 三.数据处理(数据预处理and特征工程) 首先合并train和test,为了后续写代码能同时处理两个数据集:combination_data = [train,test]
**下面将根据现在数据的类型,分数值型和字符串来讨论、研究,同时完成缺失值进行处理、根据每个变量与生存率之间的关系进行选择,必要时将删除变量或者创造出新的变量来帮助模型的构建。最终所有的数据类型都将处理为数值型。** ## 数值型: - PassengerId 乘客编码,做区分用,对预测无作用,删掉。
del train["PassengerId"]
- Pclass 船舱分三等,某种程度上代表了乘客的身份、社会地位,下面探究一下Pclass的作用:
train[["Pclass","Survived"]].groupby("Pclass",as_index=False).mean().sort_values(by="Survived",ascending=False)
Pclass | Survived | |
---|---|---|
0 | 1 | 0.629630 |
1 | 2 | 0.472826 |
2 | 3 | 0.242363 |
sns.barplot(x="Pclass",y="Survived",data=train)
train[["SibSp","Survived"]].groupby("SibSp",as_index=False).mean().sort_values(by="Survived",ascending=False)
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 |
SibSp为3、4、5、8人时,生存率都较小,甚至为0,有影响但不明显。
- Parch
train[["Parch","Survived"]].groupby("Parch",as_index=False).mean().sort_values(by="Survived",ascending=False)
Parch | Survived | |
---|---|---|
3 | 3 | 0.600000 |
1 | 1 | 0.550847 |
2 | 2 | 0.500000 |
0 | 0 | 0.343658 |
5 | 5 | 0.200000 |
4 | 4 | 0.000000 |
6 | 6 | 0.000000 |
看到Parch为4、5、6的生存率也较小,影响不是很明显。跟上面的SibSp情况类似,现将两变量人数合起来看对生存率的影响如何:
for dataset in combination_data:
dataset["Family"] = dataset["SibSp"] + dataset["Parch"] + 1