机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

人工智能37

本篇博客通过分析泰坦尼克号事故中乘客的信息,从而得出一些 相关关系的判断,并且使用 Python可视化的手段更加具体的展现。

注:本篇博客参考资料:
1、kaggle入门–泰坦尼克号之灾(某书)
2、机器学习系列(3)_逻辑回归应用之Kaggle泰坦尼克之灾
3、缺失值填充的几种方法
4、关于Kaggle 数据挖掘比赛(某乎)
5、Kaggle官网
6、数据分析的小提琴图应该怎么看(某乎)
7、随机森林 n_estimators参数 max_features参数
8、关于pandas中crosstab的用法(某乎)

文章目录

一、数据的初步探索

import seaborn as sns
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams['font.sans-serif']=['Microsoft YaHei']
plt.rcParams['axes.unicode_minus']=False
from datetime import datetime
plt.figure(figsize=(16,10))
import pyecharts.options as opts
from pyecharts.charts import Line
from pyecharts.faker import Faker
from pyecharts.charts import Bar
import os
from pyecharts.options.global_options import ThemeType
from scipy import stats
import pandas_profiling
from autoviz.AutoViz_Class import AutoViz_Class
from IPython.display import display
from statsmodels.stats.weightstats import ztest
import nltk
import plotly.graph_objs as go
import plotly.express as px

!pip install pandas_profiling
!pip install autoviz
!pip install ppscore

df=pd.read_csv("titanic.csv")
display(df.head(10))

读入数据:
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

•PassengerID(ID)
•Survived(存活与否)
•Pclass(客舱等级,较为重要)
•Name(姓名,可提取出更多信息)
•Sex(性别,较为重要)
•Age(年龄,较为重要)
•Parch(直系亲友)
•SibSp(旁系)
•Ticket(票编号)
•Fare(票价)
•Cabin(客舱编号)
•Embarked(上船的港口编号)

使用 Pandas profiling 库:
Pandas profiling可以弥补 pandas describe没有详细数据报告生成的不足。它为数据集提供报告生成,并为生成的报告提供许多功能和自定义。

report=pandas_profiling.ProfileReport(df)
display(report)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
使用 Python Autoviz,一行代码即可完成对数据集所有关系的探索:

AV=AutoViz_Class()
report2=AV.AutoViz("titanic.csv")

初步的分析数据:
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

df_survivors=df[df['Survived']==1]
df_nonsurvivors=df[df['Survived']==0]
df_survivors.head()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
绘制小提琴图:

violin_survivors=go.Violin(
    y=df_survivors['Age'],
    x=df_survivors['Survived'],
    name='Survivors',
    marker_color='forestgreen',
    box_visible=True)

violin_nonsurvivors=go.Violin(
    y=df_nonsurvivors['Age'],
    x=df_nonsurvivors['Survived'],
    name='Non-Survivors',
    marker_color='darkred',
    box_visible=True)

data=[violin_nonsurvivors,violin_survivors]

layout=go.Layout(
        paper_bgcolor='rgba(0,0,0,0)',
        plot_bgcolor='rgba(0,0,0,0)',
        title='"Age" of survivors vs Ages of non-survivors',
    xaxis=dict(
        title='Survived or not'
    ),
    yaxis=dict(
        title='Age'
    )
)

fig=go.Figure(data=data,layout=layout)
fig.show()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

二、数据的缺失值处理

train_data=pd.read_csv("titanic.csv")
test_data=pd.read_csv("titanic.csv")

train_data['Survived'].value_counts().plot.pie(autopct='%1.2f%%',figsize=(10,7),fontsize=20)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

train_data.Embarked[train_data.Embarked.isnull()]=train_data.Embarked.dropna().mode().values

train_data['Cabin']=train_data.Cabin.fillna('U0')

三、使用随机森林处理年龄


from sklearn.ensemble import RandomForestRegressor

age_df=train_data[['Age','Survived','Fare','Parch','SibSp','Pclass']]
age_df_notnull=age_df.loc[(train_data['Age'].notnull())]
age_df_isnull=age_df.loc[(train_data['Age'].isnull())]
train_data.loc[train_data['Age'].isnull()]

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


X=age_df_notnull.values[:,1:]
Y=age_df_notnull.values[:,0]
RFR=RandomForestRegressor(n_estimators=1000,n_jobs=-1)
RFR.fit(X,Y)
predictAges=RFR.predict(age_df_isnull.values[:,1:])
train_data.loc[train_data['Age'].isnull(),['Age']]=predictAges
predictAges

train_data.describe()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

四、分析数据之间的关系

1. 性别与生存率的关系


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

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

plt.style.use('ggplot')
plt.title('性别与存活率的关系')
plt.ylabel('存活率')
plt.xlabel('性别')
plt.xticks(rotation=0)
train_data[['Sex','Survived']].groupby(['Sex']).mean().plot.bar(figsize=(10,8),fontsize=20)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

2.舱位等级与生存率的关系


train_data.groupby(['Pclass','Survived'])['Pclass'].count()
train_data[['Pclass','Survived']].groupby(['Pclass']).mean().plot.bar(figsize=(10,8),fontsize=20)
plt.title('舱位等级与存活率的关系')
plt.ylabel('存活率')
plt.xlabel('1-头等舱       2-二等舱         3-三等舱')
plt.xticks(rotation=0)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

3. 舱位等级,性别和年龄的关系


fig,ax=plt.subplots(1,2,figsize=(16,10))
sns.violinplot("Pclass","Age",hue="Survived",data=train_data,split=True,ax=ax[0])
ax[0].set_yticks(range(0,100,10))
sns.violinplot("Sex","Age",hug="Survived",data=train_data,split=True,ax=ax[1])
plt.show()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

4. 不同年龄阶段的总体分析


plt.figure(figsize=(10,8))
plt.subplot(121)
train_data['Age'].hist(bins=80)
plt.xlabel('年龄')
plt.ylabel('人数')

plt.subplot(122)
train_data.boxplot(column='Age',showfliers=True)

showfliers:显示是否有脱离的异常值
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


facet=sns.FacetGrid(train_data,hue="Survived",aspect=4)
facet.map(sns.kdeplot,'Age',shade=True)
facet.set(xlim=(0,train_data['Age'].max()))
facet.add_legend()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


fig,axis1=plt.subplots(1,1,figsize=(18,4))
train_data['Age_int']=train_data['Age'].astype(int)
average_age=train_data[['Age_int','Survived']].groupby(['Age_int'],as_index=False).mean()
sns.barplot(x='Age_int',y='Survived',data=average_age)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


bins=[0,12,18,65,100]
train_data['Age_group']=pd.cut(train_data['Age'],bins)
by_age=train_data.groupby('Age_group')['Survived'].mean()
by_age

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

by_age.plot(kind='pie')

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

5.称谓与存活的关系


train_data['Title']=train_data['Name'].str.extract('([A-Za-z]+)\.',expand=False)

train_data.Title

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

pd.crosstab(train_data['Title'],train_data['Sex'])

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

train_data[['Title','Survived']].groupby(['Title']).mean().plot.bar()
plt.xticks(rotation=40)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

6.名称长度与存活率的关系


fig,axis1=plt.subplots(1,1,figsize=(14,4))
train_data['Name_length']=train_data['Name'].apply(len)
name_length=train_data[['Name_length','Survived']].groupby(['Name_length'],as_index=False).mean()
sns.barplot(x='Name_length',y='Survived',data=name_length)

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

7.亲属与存活率之间的关系

这里涉及到直系亲属以及旁系亲属
•Parch(直系亲友,这里就认为是父母与孩子)
•SibSp(旁系,这里就认为是兄弟姐妹)


sibsp_df=train_data[train_data['SibSp']!=0]
no_sibsp_df=train_data[train_data['SibSp']==0]
plt.figure(figsize=(10,5))
plt.subplot(121)
sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('sibsp(有兄弟姐妹的)')

plt.subplot(122)
no_sibsp_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('no_sibsp(没有兄弟姐妹的)')
plt.show()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


parch_df=train_data[train_data['Parch']!=0]
no_parch_df=train_data[train_data['Parch']==0]
plt.figure(figsize=(10,5))
plt.subplot(121)
parch_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('parch(父母带小孩)')

plt.subplot(122)
no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('no_parch(父母与孩子没有在一起的)')
plt.show()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


parch_df=train_data[train_data['Parch']!=0]
no_parch_df=train_data[train_data['Parch']==0]

plt.figure(figsize=(16,12))
plt.rcParams.update({'font.family': "Microsoft YaHei"})
plt.subplot(2,3,1)
parch_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('parch')

plt.subplot(2,3,2)
parch_df.groupby(['Survived'])['Age'].mean().plot.bar(color='orange',title='有父子关系年龄均值对比')

plt.subplot(2,3,3)
parch_df.groupby(['Survived'])['PassengerId'].count().plot.bar(color='brown',title='有父子关系数量')
plt.xlabel('parch')

plt.subplot(2,3,4)
no_parch_df['Survived'].value_counts().plot.pie(labels=['No Survived','Survived'],autopct='%1.1f%%')
plt.xlabel('no_parch')

plt.subplot(2,3,5)
no_parch_df.groupby(['Survived'])['Age'].mean().plot.bar(color='orange',title='无父子关系年龄均值对比')
plt.xlabel('no_parch')

plt.subplot(2,3,6)
no_parch_df['Survived'].value_counts().plot.bar(color='brown',title='无父子关系数量')
plt.xlabel('no_parch')

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

8.舱位类型与存活率之间的关系

Cabin若为空,也就是没有保存舱位信息,则填充为 U0。这里可以推断出有舱位类型的存活率较高。对于乘客,我猜想如果是地位较高的人,他们的舱位信息应该能较好的保存。因为地位低的人可能出现逃票的情况,或者他们更不重视自己的船票号码(舱位信息),因此舱位信息保存率比较低。


train_data['Has_Cabin']=train_data['Cabin'].apply(lambda x:0 if x=='U0' else 1)
train_data[['Has_Cabin','Survived']].groupby(['Has_Cabin']).mean().plot.bar()

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

9.对不同类型的船舱进行分析

主要目的:练习 pd.dummiespd.factorize的用法


import numpy as np
import re
train_data['CabinLetter']=train_data['Cabin'].map(lambda x:re.compile("([a-zA-Z]+)").search(x).group())

train_data

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾


pd.get_dummies(train_data['CabinLetter'])

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

train_data=train_data.join(pd.get_dummies(train_data['CabinLetter']))

train_data

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

train_data[['CabinLetter','Survived']].groupby(['CabinLetter']).mean().plot.bar()

不同舱位与存活率之间的关系
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

10.出发港口与存活率之间的关系


sns.countplot('Embarked',hue='Survived',data=train_data)
plt.title('Embarked and Survived')

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

Original: https://blog.csdn.net/wxfighting/article/details/123932230
Author: abc123susie
Title: 机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾



相关阅读

Title: 深度理解感受野(一)什么是感受野?

Title: 深度理解感受野(一)什么是感受野?

Introduction

经典目标检测和最新目标跟踪都用到了RPN(region proposal network),锚框(anchor)是RPN的基础,感受野(receptive field, RF)是anchor的基础。本文介绍感受野及其计算方法,和有效感受野概念

什么是感受野?

感受野与视觉

  • 感受野(receptive field)这一概念来自于生物神经科学,是指感觉系统中的任一神经元,其所受到的感受器神经元的支配范围。感受器神经元就是指接收感觉信号的最初级神经元
  • 视觉来自于光在个体感受器上的投射,它将客观世界的物理信息转化为人们可以感知的神经脉冲信号。
    [En]

    Vision comes from the projection of light on individual receptors, which converts the physical information of the objective world into nerve pulse signals that people can perceive.*

感受野的定义

One of the basic concepts in deep CNNs is the receptive field, or field of view, of a unit in a certain layer in the network. Unlike in fully connected networks, where the value of each unit depends on the entire input to the network, a unit in convolutional networks only depends on a region of the input.

This region in the input is the receptive field for that unit.

  • 在卷积神经网络中,感受野(receptive field)不像输出由整个网络输入所决定的全连接网络那样,它是可以存在于网络中任意某层,输出仅由输入部分决定
  • 就是指输出feature map上某个元素受输入图像上影响的区域

    [En]

    ! [] (https://img-blog.csdnimg.cn/20210525205712705.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80MDc1NjAwMA==,size_16,color_FFFFFF,t_70)

如图所示,共有3个feature map输出。该图说明了2个33的conv可以代替1个55的conv层

  1. Layer1中方格可看作是一个元素,33的绿色方格则是一个33的卷积核
  2. Layer2由一个33的卷积核经过卷积运算输出,输出尺寸是33(假设stride=1,padding=0)显而易见,layer2中的绿色方格是由layer1中3*3的绿色方格所决定的。那么这一位置的感受野就是layer1中的绿色方格区域
  3. Layer3由layer2经过3*3的conv层输出,只有一个

; 理论感受野

https://distill.pub/2019/computing-receptive-fields/

如何计算?

卷积层的理论感受野可以由递推公式计算出来。首先定义下参数意义,r r r代表感受野l l l代表层数k k k代表卷积核大小s s s代表步长
r l = r l − 1 + ( k l − 1 ) ∗ ∏ i = 0 l − 1 s i r_l = r_{l-1}+(k_l - 1)*\prod_{i=0}^{l-1}{s_i}r l ​=r l −1 ​+(k l ​−1 )∗i =0 ∏l −1 ​s i ​
最大池化层的理论感受野
r l = r l − 1 + ( k l − 1 ) r_l = r_{l-1}+(k_l - 1)r l ​=r l −1 ​+(k l ​−1 )
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

图中,由1个conv33(stride=1,pad=1),1个ReLu层,1个22MaxPooling层(k=2,s=2,p=0)组成。f 0 f_0 f 0 ​为输入层,f 4 f_4 f 4 ​层 为输出层。很明显能够发现,f 4 f_4 f 4 ​层的感受野为6。推导过程如下

  1. f 1 f_1 f 1 ​默认感受野为1,即r 0 = 1 r_0=1 r 0 ​=1
  2. f 2 f_2 f 2 ​层为33conv层,r 1 = r 0 + ( k 1 − 1 ) ∗ ∏ i = 0 0 s 0 r_1=r_0+(k_1-1)\prod_{i=0}^{0}{s_0}r 1 ​=r 0 ​+(k 1 ​−1 )∗∏i =0 0 ​s 0 ​即r 1 = 1 + ( 3 − 1 ) ∗ 1 = 3 r_1=1+(3-1)*1=3 r 1 ​=1 +(3 −1 )∗1 =3
  3. f 3 f_3 f 3 ​层为激活函数层ReLu,不改变理论感受野大小(也不是没作用,有效感受野里面会提到它的作用)r 2 = 3 r_2=3 r 2 ​=3
  4. f 4 f_4 f 4 ​层为33conv层,和上一个conv层一样,r 3 = 3 + ( 3 − 1 ) ∗ 1 = 5 r_3=3+(3-1)1=5 r 3 ​=3 +(3 −1 )∗1 =5
  5. f 5 f_5 f 5 ​层为22maxpooling层,r 4 = 5 + ( 2 − 1 ) ∗ 1 = 6 r_4=5+(2-1)1=6 r 4 ​=5 +(2 −1 )∗1 =6

按照上述方法可以计算出主流的backbone理论感受野大小,如下图所示。 数据来自https://distill.pub/2019/computing-receptive-fields/
机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
从感受野的计算公式很明显能够看出, stride kernel_size rf_size都会对其产生影响,其中 srtide对感受野大小起决定性作用。

; 有效感受野

有效感受野是在NIPS2016中的Understanding the Effective Receptive Field in Deep Convolutional Neural Networks提出的。

  • 有效感受野是一种超参数, 无法像理论感受野那样被精确计算。但是文献[2]中采用求偏导数的方法对每个图像上的像素点,计算出他们对输出特征图的贡献值,并可视化。
  • 有限感受野往往比理论感受野要小一些,关系大概是 anchor
  • 有效感受野呈 高斯分布,并不是所有像素点的贡献都相同。直观的来说, *感受野中间的像素对于输出会有更大的影响

以下内容整理自:https://blog.csdn.net/DD_PP_JJ/article/details/104448825

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
采用不同初始化权重的方法和添加ReLU作为激活函数进行实验。Uniform初始化方法使卷积核的权重都为1,没有非线性性质。引入ReLU之后,网络中增加了非线性性,分布变得 a bit less Gaussian

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
不同的激活函数对ERF的分布也有影响,这说明ERF的分布也取决于 input。ReLU的高斯分布没有另外两个平滑,生成了一个较少的高斯分布,ReLU导致很大一部分梯度归零。上采样和空洞卷积可以增大感受野

机器学习系列(1)_数据分析之Kaggle泰坦尼克之灾
文章中也给出了答案,见上图,随着网络层数的加深,实际有效的感受野是程n \sqrt{n}n ​ 级别增长。而右图展示了随着网络层数的加深,有效感受野占理论感受野的比例是按照1 n \frac{1}{\sqrt{n}}n ​1 ​级别进行缩减的。其中需要注意的是实际感受野的计算方式:若像素值大于(1-96.45%)的中心像素值,就认为该像素处于实际感受野中

哪些操作可以改变感受野?

  • Convolution
  • DeConvolution
  • Pooling
  • Residential connection
  • Concatenation

参考文献

[1] A guide to convolution arithmetic for deep learning
[2] Understanding the Effective Receptive Field in Deep Convolutional Neural Networks

Original: https://blog.csdn.net/weixin_40756000/article/details/117264194
Author: 黑夜里游荡
Title: 深度理解感受野(一)什么是感受野?

Original: https://blog.csdn.net/weixin_40756000/article/details/117264194
Author: 黑夜里游荡
Title: 深度理解感受野(一)什么是感受野?

相关文章
Anaconda3和tensorflow2的安装 人工智能

Anaconda3和tensorflow2的安装

首先,说一下这篇文章写于2022年1月份,如果你看到这篇文章的时候离这个时间太远,那不建议往下看了(超过一年就不建议看了) 其次,Anaconda的版本是 目前对应的python版本是3.9,tens...
python简易语音助手 人工智能

python简易语音助手

先上图 本程序使用的软件: PyCharm,Designer(PyQt5界面编辑软件) 步骤 1.使用designer绘制出程序界面的图 使用的控件: 按键 文本框 Line Edit 电量显示 Pr...
MoCha——单调块注意力模型 人工智能

MoCha——单调块注意力模型

MoCha——单调块注意力模型 1.概述 加了soft attention的seq2seq模型,在很多领域取得了广泛的应用,例如机器翻译、词性标注等NLP任务,因为它们都可以看成是序列到序列的问题。但...
股票数据分析 人工智能

股票数据分析

股票数据分析 前面我们介绍了Spark 和 Spark SQL,今天我们就使用 Spark SQL来分析一下我们的数据,今天我们主要分析一下股票数据 数据准备 这里郑重申明,我们的全部数据来自tush...
TensorFlow安装 人工智能

TensorFlow安装

啊哦~你想找的内容离你而去了哦 内容不存在,可能为如下原因导致: ① 内容还在审核中 ② 内容以前存在,但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可以到 建议专区 反馈...
GAT 算法原理介绍与源码分析 人工智能

GAT 算法原理介绍与源码分析

GAT 算法原理介绍与源码分析 文章目录 GAT 算法原理介绍与源码分析 * 零. 前言 (与正文无关, 请忽略) - 广而告之 一. 文章信息 二. 核心观点 三. 核心观点解读 四. 源码分析 -...
YOLO v2实现图像目标检测 人工智能

YOLO v2实现图像目标检测

作者介绍 熊文博,男,西安工程大学电子信息学院,2020级硕士研究生,张宏伟人工智能课题组。 研究方向:机器视觉与人工智能 电子邮件:996270714@qq.com 师兄的CSDN主页: 欢迎关注和...