数据挖掘导论——分类与预测(一)

简介: 数据挖掘导论——分类与预测

实验内容

背景介绍


泰坦尼克号于1909年3月31日在爱尔兰动工建造,1911年5月31日下水,次年4月2日完工试航。她是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉。然而讽刺的是,泰坦尼克号首航便遭遇厄运:1912年4月10日她从英国南安普顿出发,途径法国瑟堡和爱尔兰昆士敦,驶向美国纽约。在14日晚23时40分左右,泰坦尼克号与一座冰山相撞,导致船体裂缝进水。次日凌晨2时20分左右,泰坦尼克号断为两截后沉入大西洋,其搭载的2224名船员及乘客,在本次海难中逾1500人丧生。

在该案例中,我们将探究什么样的人在此次海难中幸存的几率更高,并通过构建预测模型来预测乘客生存率。


数据


数据来源:根据blackboard上面提供的train.csv和test.csv文件。

字段说明:


09270bc64cfa4ab185ecac31f28f14d7.png


实验要求


1) 对缺失值和异常值进行处理;

2) 用Gradient Boosting Classifier和Logistic Regression模型进行建模;

3) 对比分析实验结果(评价指标包含Accuracy、Recall以及F1-score等)。


实验过程


一、首先引入数据分析以及模型所需要的库

import matplotlib
import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
import seaborn as sns
import warnings
warnings.filterwarnings('ignore')
from IPython.display import display
from sklearn.linear_model import LogisticRegression 
from sklearn.model_selection import train_test_split 
from sklearn import metrics ,ensemble


二、进行数据的读取


使用pandas.read_csv将数据读入。并查看前几个数据


data=pd.read_csv("train.csv")
data.head()


276a2862c734419da804725e3c1b5f78.png


三、进行数据分析


首先,对缺失值进行统计


data.isnull().sum()


bc8fb1776a4541f1b56b7942c99c5a6a.png


可以看到,数据中存在比较多的缺失值,需要进一步填充处理。接下来,查看整体数据情况。


data.describe()


32807aa033dc4a629363cfc3a40737e7.png


获取整体乘客中获救乘客的比例

f,ax=plt.subplots(1,2,figsize=(18,8))
data['Survived'].value_counts().plot.pie(explode=[0,0.1],autopct='%1.1f%%',ax=ax[0],shadow=True)
ax[0].set_title('Survived')
ax[0].set_ylabel('')
sns.countplot('Survived',data=data,ax=ax[1])
ax[1].set_title('Survived')
plt.show()

ce1fc91efbeb4b9eba23ee26c9fcab1b.png

可以看到,在这次事故中,并没有多少乘客幸免于难。在训练集的691名乘客中,只有大约270人幸存下来(38.8%)。

我们需要从数据中提取出更多的信息用以模型的构建,接下来,我们将尝试使用数据集的不同特性进行检查与分析。


1、Sex:性别比例


data.groupby(['Sex','Survived'])['Survived'].count()


35e948e523024aeaa3a2360a685cd2ee.png

图形表示:

f,ax=plt.subplots(1,2,figsize=(18,8))
data[['Sex','Survived']].groupby(['Sex']).mean().plot.bar(ax=ax[0])
ax[0].set_title('Survived vs Sex')
sns.countplot('Sex',hue='Survived',data=data,ax=ax[1])
ax[1].set_title('Sex:Survived vs Dead')
plt.show()

b554404fd6964b48b544ee7199596507.png

不难发现船上的男人比女人多得多。不过,挽救的女性人数几乎是男性的两倍。生存率为一个女人在船上是75%左右,而男性在18-19%左右。

这是建模的一个非常重要的特性。


2、PClass:船舱等级

pd.crosstab(data.Pclass,data.Survived,margins=True).style.background_gradient(cmap='summer_r')

bfdc03c52c5c466e8423507e8175cdd7.png


图形表示

f,ax=plt.subplots(1,2,figsize=(18,8))
data['Pclass'].value_counts().plot.bar(color=['#CD7F32','#FFDF00','#D3D3D3'],ax=ax[0])
ax[0].set_title('Number Of Passengers By Pclass')
ax[0].set_ylabel('Count')
sns.countplot('Pclass',hue='Survived',data=data,ax=ax[1])
ax[1].set_title('Pclass:Survived vs Dead')
plt.show()

4e822dbf257846aebfc23d0cb7354dfd.png


可以发现:船舱等级为1的被给予很高的优先级而救援。尽管数量在pClass 3乘客高了很多,仍然他们的存活率是非常低的,大约25%。对于pClass1来说存活率是63%左右,而pclass2大约是48%。


3、PClass,Sex:船舱等级与性别


pd.crosstab([data.Sex,data.Survived],data.Pclass,margins=True).style.background_grad


4682ad8750f84dd8b1697cb3c856dce7.png


图形表示


sns.factorplot('Pclass','Survived',hue='Sex',data=data)
plt.show()


7912375473964d08a7d10d0cf4437128.png


我们用factorplot生成这个图,看起来更直观一些。我们可以很容易地推断,从pclass1女性生存是95-96%,只有3%的女性从pclass1没获救。显而易见的是,不论pClass,女性优先考虑。


4、Age:年龄


print('Oldest Passenger was of:',data['Age'].max(),'Years')
print('Youngest Passenger was of:',data['Age'].min(),'Years')
print('Average Age on the ship:',data['Age'].mean(),'Years')

b577d269f93e435aa720d4d682ebe881.png


图形表示


f,ax=plt.subplots(1,2,figsize=(18,8))
sns.violinplot("Pclass","Age", hue="Survived", data=data,split=True,ax=ax[0])
ax[0].set_title('Pclass and Age vs Survived')
ax[0].set_yticks(range(0,110,10))
sns.violinplot("Sex","Age", hue="Survived", data=data,split=True,ax=ax[1])
ax[1].set_title('Sex and Age vs Survived')
ax[1].set_yticks(range(0,110,10))
plt.show()

842ac3a3eed748c5945c85650822b1e8.png


可以发现,20-60岁的乘客获救几率更高一些,对于男性来说,二十五岁以后的男性随着年龄的增长,存活率降低。

【缺失值填充】

可以发现,年龄特征存在很多空值,我们需要填补这些空值以便进行预测。为了替换这些空值,我们可以给他们分配数据集的一些平均年龄。通过检查姓名特征(先生,夫人等称呼)可以乘客进行合理分组,这样分组填补将使预测更加准确。

data['Initial']=0
for i in data:
    data['Initial']=data.Name.str.extract('([A-Za-z]+)\.') 


这里我们使用正则表达式对信息进行匹配提取

图形化


pd.crosstab(data.Initial,data.Sex).T.style.background_gradient(cmap='summer_r') #用性别核对姓名首字母


4b787b5ffc634259979f964385d6eaba.png

data['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'],inplace=True)
data.groupby('Initial')['Age'].mean()

add0e66892594149b9edf06fa6aafc3b.png


接下来对缺失值进行填充


data.loc[(data.Age.isnull())&(data.Initial=='Mr'),'Age']=33
data.loc[(data.Age.isnull())&(data.Initial=='Mrs'),'Age']=36
data.loc[(data.Age.isnull())&(data.Initial=='Master'),'Age']=5
data.loc[(data.Age.isnull())&(data.Initial=='Miss'),'Age']=22
data.loc[(data.Age.isnull())&(data.Initial=='Other'),'Age']=46
data.Age.isnull().any() #看看填充结果

cb669d36a51144e89f6fae2c6f887ae6.png



相关文章
|
4月前
|
机器学习/深度学习 算法 数据挖掘
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】SVM原理详解及对iris数据集分类实战(超详细 附源码)
319 1
|
10月前
|
机器学习/深度学习 人工智能 算法
04 机器学习 - 数据挖掘与机器学习导论
04 机器学习 - 数据挖掘与机器学习导论
130 0
|
4月前
|
机器学习/深度学习 存储 算法
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
284 0
【数据挖掘】KNN算法详解及对iris数据集分类实战(超详细 附源码)
|
机器学习/深度学习 数据采集 算法
数据挖掘导论——综合实验(下)
数据挖掘导论——综合实验
179 0
数据挖掘导论——综合实验(下)
|
机器学习/深度学习 数据可视化 数据挖掘
数据挖掘导论——综合实验(上)
数据挖掘导论——综合实验
140 0
数据挖掘导论——综合实验(上)
|
数据采集 机器学习/深度学习 数据可视化
数据挖掘导论——分类与预测(三)
数据挖掘导论——分类与预测
245 0
数据挖掘导论——分类与预测(三)
|
数据挖掘
数据挖掘导论——分类与预测(二)
数据挖掘导论——分类与预测
255 0
数据挖掘导论——分类与预测(二)
|
数据可视化 数据挖掘 Linux
数据挖掘导论——可视化分析实验
数据挖掘导论——可视化分析实验
148 0
数据挖掘导论——可视化分析实验

热门文章

最新文章