前言:
泰坦尼克号的故事想必大家都很清楚,本题就是预测泰坦尼克号中哪些人可以存活下来。作为一个小白,我也是借由此题和这篇博客熟悉一下机器学习实际项目的流程,复习一下前段时间学习的知识。
这道题的主页:https://www.kaggle.com/c/titanic
题目:
项目流程:
获取并查看数据
导入数据
import pandas as pd
titanic = pd.read_csv("d:\\pycharm\\work\\train.csv")
快速查看数据结构
titanic.head()
titanic.info()
titanic.describe()
数据集的前五行
数据集的简单描述
数据集中数值属性的摘要
通过以上,我们可以看到训练集中一共有891条数据,包括乘客编号,是否存活,姓名,身份地位,年龄等12个特征(其中7个数值特征,5个字符特征)。并且年龄、客舱号、登船港口有缺失值。
创建验证集
我们可以先将训练集中的一部分数据分出来作为验证集,这是为了验证最后得到的模型是否具有一个较好的泛化能力,避免模型在训练集上表现良好但是在测试集表现较差也就是过拟合。
创建验证集有几种方法:
1.使用numpy.random.permutation(len(data))对数据集的数字索引随机排序,分出20%作为验证集。
2.如果你使用的数据集是不断更新的,那么使用第一种方法可能会导致每次更新后,得到的训练集不同。常见的解决办法是计算每个实例标识符的hash值,只取hash的最后一个字节,如果该值小于等于51(约256的20%),则将该实例放入验证集。这样可以确保数据集在每次更新后仍然一致,新实例的20%将被放入新的验证集。
3.前面两种是纯随机的抽样方法,可能会导致一些抽样偏差。使用sklearn中的Stratified Shuffle Split类可以实现分层抽样。
我这里用的是第一种,纯随机的抽样。
import numpy as np
np.random.seed(42) #设置随机种子,相同的种子产生的随机序列相同
shuffled_index = np.random.permutation(len(titanic))
test_set_size = int(len(titanic) * 0.2)
test_index = shuffled_index[:test_set_size] #前20%分给测试集
train_index = shuffled_index[test_set_size:] #后80%分给训练集
数据可视化及分析
Pclass身份地位
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib notebook
fig = plt.figure()
sns.countplot(x='Pclass',hue = 'Survived',data = titanic)
sns.barplot(x='Pclass',y = 'Survived',data = titanic)
可以看到Pclass为1也就是身份地位最高的乘客的存活率明显高于Pclass为2和3的乘客。
Sex性别
sns.countplot(x='Sex',hue = 'Survived',data = titanic)
男性乘客的数量要比女性乘客的数量多很多,但是存活下来的人数却比女性少,很显然,女性乘客的存活率要更高。
SibSp兄弟姐妹\配偶数
sns.barplot(x='SibSp',y = 'Survived',data = titanic)
看起来,如果一个乘客的SibSp数目太多或者为0,那么他们的存活率要稍低一些。
Parch父母\子女数
sns.barplot(x='Parch',y = 'Survived',data = titanic)
和SibSp一样,Parch数位于中间的乘客似乎比两边的乘客存活率要高一些。
Age年龄
因为年龄是连续的数值,我这里先做一个分箱处理使数值离散化,看起来更直观一些。
#对age进行离散化和分箱
bins_age = [0,3,10,18,40,80]
cats_age = pd.cut(titanic['Age'],bins_age)
sns.countplot(x = cats_age, hue = titanic['Survived'])
sns.barplot(x = cats_age, y = titanic['Survived'])
从图中看,存活率随着年龄的升高而降低。年龄很小的孩子往往有较高的存活率。
Fare票价
由于Fare也是离散值,所以处理大致和Age相同。我这里是根据Fare的四分位数大致划分。
#对票价(fare)进行离散化处理
bins_fare = [0,8,15,35,80,