Machine Learning-实战 Titanic生存预测

本文是机器学习实战片,例子是kaggle上老经典的例子了,Titanic生存预测
目的是了解机器学习的大体流程。文末百度网盘链接中包含本文用到的数据集和代码。

环境
win8, python3,jupyter notebook

目录

  • 项目背景
  • 数据概览
  • 数据预处理
  • 特征分析
  • 特征工程
  • 构建模型

1.项目背景

泰坦尼克号是当时世界上体积最庞大内部设施最豪华的客运轮船,当时泰坦尼克号的乘船事件可谓轰动全球,相信大家都看过那部经典电影。泰坦尼克号将乘客分为三个等级: 三等舱位于船身较下层也最便宜,一等舱是整艘船最为昂贵奢华的部分,二等舱在其中间。在这次灾难中能否幸存下来难免会有些运气成分, 但是有些人比其他人更可能生存下来, 比如妇女, 儿童和上层阶级。在电影中出现过让”女人和孩子先走“的台词。

2.数据概览

项目共提供了两份数据,train.csv文件作为训练集构建与生存相关的模型;另一份test.csv文件则用作测试集, 用我们构建出来的模型预测生存情况.

字段 字段含义
PassengerId 乘客编号
Survived 是否生还,0表示未生还,1表示生还
Pclass 船票种类,折射处乘客的社会地位,1表示上层阶级,2表示中层阶级,3表示底层阶级
Sex 性别,男性为male,女性为female
Age 年龄,不满1岁的年龄为小数
SibSp 该乘客同船的兄弟姐妹及配偶的数量
Parch 该乘客同船的父母以及儿女的数量
Ticket 船票编号
Fare 买票的费用
Cabin 船舱编号
Embarked 代表在哪里上的船
2.1读取数据:
1
2
3
import pandas as pd
train = pd.read_csv('..\train.csv')
test = pd.read_csv('..\test.csv')
2.2查看前五行数据
1
train.head()

2.3查看数据表整体信息
1
2
train.info()
test.info()

3.数据预处理

训练集中 Age Embarked Cabin有缺省值
测试集中 Age Fare Cabin有缺省值 但根据经验常识Cabin船舱编号排除在特征外

train['Embarked'].value_counts()

3.1对缺失值进行填充

1
2
3
4
train['Embarked'].fillna('S',inplace=True)
train['Age'].fillna(train['Age'].mean(),inplace=True)
test['Age'].fillna(test['Age'].mean(),inplace=True)
test['Fare'].fillna(test['Fare'].mean(),inplace=True)

3.2类型转换

数据类型转换格式如下:运用函数astype()

1
train['Age']  = train['Age'].astype(int)

4.特征分析

在11个特征中, 哪些是和幸存相关的呢?

  • Sex
    在泰坦尼克号的电影中,有句台词是让女人和小孩先走,这里的性别肯定相关性高了,我们看看数据
1
2
3
4
5
6
7
8
9
import seaborn as sns
import matplotlib.pyplot as plt
from pylab import mpl
mpl.rcParams['font.sans-serif'] = ['SimHei'] #解决seaborn中文字体显示问题
plt.rcParams["figure.dpi"] =mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
%matplotlib inline
train[train['Survived']==1].groupby('Sex')['Survived'].value_counts()

sns.barplot(x='Sex',y='Survived',data=train)


可以从柱状图中看出男女的生成比例很明显的不一样。所以Sex是一个强特征。

  • Pclass 对于船舱等级, 一等舱是整个船最昂贵奢华的地方, 有钱人才能享受, 想必一等舱的有钱人比三等舱的穷人更容易幸存, 到底是不是呢? 用数据说话
1
2
sns.pointplot(x='Pclass',y='Survived',hue='Sex',data=train
,palette={'male':'blue','female':'pink'},markers=['*','o'],linestyles=['-','--'])


可以看到一等舱人员的幸存机会远大于三等舱, 果然和船舱等级相关.

  • Age

    可以看到女人普遍存活率都很高,男性在0-10岁之间存活率高,显然年龄是有影响的。

  • SibSp 从之前的描述性统计了解到, 兄弟姐妹与配偶的人数最多为8, 最少为0, 哪个更容易生存呢?

    可以看出关键时候,有兄弟姐妹和配偶的会提高存活几率,1到2个为宜,多了容易全部die

  • Parch 该乘客同船的父母以及儿女的数量,看看船上有父母孩子的存活率会不会更高呢?

    由上图可以看吹1-3个存活率会更高,毕竟人多力量大。但这个力量也不能太大,太大容易翻船哈哈哈。

5.特征工程

对分类特征进行向量化

1
2
3
4
5
6
7
8
#采用DictVectorizer对特征向量化
# DictVectorizer为分类(也称为标称,离散)特征实现所谓的one-of-K或“one-hot(独热)”编码
from sklearn.feature_extraction import DictVectorizer
dict_vec = DictVectorizer(sparse=False)
X_train = dict_vec.fit_transform(X_train.to_dict(orient='record'))
X_test = dict_vec.fit_transform(X_test.to_dict(orient='record'))

# 查看特征:dict_vec.feature_names_

6.构建模型

使用随机森林和Xgboost分别进行模型训练

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#从sklearn.ensemble中导入RandomForestClassifier
from sklearn.ensemble import RandomForestClassifier
#使用默认配置初始化RandomForestClassifier
rfc = RandomForestClassifier()

#使用默认配置的RandomForestClassifier进行预测操作
rfc.fit(X_train,y_train)
rfc_y_predict = rfc.predict(X_test)
rfc_submission = pd.DataFrame({'PassengerId':test['PassengerId'],'Survived':rfc_y_predict})
rfc_submission.to_csv('D:\\Pywork\\Titanic\\rfc_submission.csv',index=False)

from sklearn.cross_validation import cross_val_score
#使用5折交叉验证的方法在训练集上分别对默认配置的RandomForestClassifier以及XGBClassifier进行性能评估,并获得平均分类准确性的得分
cross_val_score(rfc,X_train,y_train,cv=5).mean()

#从流行包xgboost中导入XGBClassifier进行交叉验证
from xgboost import XGBClassifier
xgbc = XGBClassifier()
cross_val_score(xgbc,X_train,y_train,cv=5).mean()

使用并行网络的方式寻找更好的超参数组合,以期待进一步提高XGBClassifier的预测性能

1
2
3
4
5
6
from sklearn.grid_search import GridSearchCV
params = {'max_depth':[i for i in range(2,7)],'n_estimators':[j for j in range(100,1100,200)],'learning_rate':[0.05,0.1,0.25,0.5,0.1]
}
xgbc_best = XGBClassifier()
gs = GridSearchCV(xgbc_best,params,n_jobs=-1,cv=5,verbose=1)
gs.fit(X_train,y_train)

检查优化完成后的超参数配置
print(gs.best_score_)
print(gs.best_params_)

最后进行模型预测

1
2
3
4
5
#使用经过超参数配置的XGBClassfier对测试数据的预测结果存储在文件xgbc_best_submission中
xgbc_best_y_predict = gs.predict(X_test)
xgbc_best_submission = pd.DataFrame({'PassengerId':test['PassengerId'],'Survived':xgbc_best_y_predict})
#将默认配置的RandomForestClassifier对测试数据的预测结果存储在文件rfc_submission.csv中。
xgbc_best_submission.to_csv('D:\\Pywork\\Titanic\\xgbc_best_submission.csv',index=False)

想要以上涉及到的源代码可以联系我
邮箱:yuting9597@163.com
百度网盘:https://pan.baidu.com/s/1vGq4Et2gReM58Dr_1O-v3Q 密码:uoqv

参考文章:



觉得不错的话,给点打赏吧 ୧(๑•̀⌄•́๑)૭



wechat pay



alipay

Machine Learning-实战 Titanic生存预测
http://yuting0907.github.io/2019/03/23/Machine-Learning-实战-Titanic生存预测/
作者
yuting
发布于
2019年3月23日
许可协议