kaggle实战—泰坦尼克(二、数据清洗及特征处理)

  1. kaggle实战—泰坦尼克(一、数据分析)
  2. kaggle实战—泰坦尼克(二、数据清洗及特征处理)
  3. kaggle实战—泰坦尼克(三、数据重构)
  4. kaggle实战—泰坦尼克(四、数据可视化)
  5. kaggle实战—泰坦尼克(五、模型搭建-模型评估)

前言

相信大家都有队pandas,numpy等数据科学库有一定了解,其中不乏有很多人有专门刷过相关课程或者看多相关书籍,例如《python for data analysis》。但是在实操过程中有很多函数还是得看着官方文档来进行敲写,既费时又费力 。最近刚好datawhale发起一个相关打卡活动——实战,我就报名参加了。(ps:极力推荐这本书,大家可以去网上搜索电子版,或者也可以关注微信公众【浩波的笔记】回复data analysis来获取。

这次实践又比较偏模型和实战(完成kaggle上泰坦尼克的任务),直接给你一个任务,让你去完成,上手难度比较大,但是它的实战性可以让你对于什么是数据挖掘,以及数据挖掘的逻辑有很好的把握。所以有没有这样一门课,以项目为主线,将知识点孕育其中,通过边学,边做以及边被引导的方式来使学习效果达到更好,学完之后既能掌握pandas等的知识点又能掌握数据分析的大致思路和流程。通过调查发现,市面上这样的目好像没有可以完全符合这样的标准(失望.jpg)。

数据清洗及特征处理

开始之前,导入numpy、pandas包和数据

#加载所需的库
import numpy as np
import pandas as pd
#加载数据train.csv
df = pd.read_csv('train.csv')
df.head(3)

在这里插入图片描述

数据清洗简述

我们拿到的数据通常是不干净的,所谓的不干净,就是数据中有缺失值,有一些异常点等,需要经过一定的处理才能继续做后面的分析或建模,所以拿到数据的第一步是进行数据清洗,本章我们将学习缺失值、重复值、字符串和数据转换等操作,将数据清洗成可以分析或建模的样子。

缺失值观察与处理

我们拿到的数据经常会有很多缺失值,比如我们可以看到Cabin列存在NaN,那其他列还有没有缺失值,这些缺失值要怎么处理呢

任务一:缺失值观察

(1) 请查看每个特征缺失值个数
(2) 请查看Age, Cabin, Embarked列的数据
以上方式都有多种方式,所以建议大家学习的时候多多益善

#方法一
df.info()

在这里插入图片描述

#方法二
df.isnull().sum()

在这里插入图片描述

df[['Age','Cabin','Embarked']].head(3)

在这里插入图片描述

任务二:对缺失值进行处理
(1)处理缺失值一般有几种思路
(2) 请尝试对Age列的数据的缺失值进行处理
(3) 请尝试使用不同的方法直接对整张表的缺失值进行处理

df.dropna().head(3)

在这里插入图片描述

df.fillna(0).head()

在这里插入图片描述

df[df['Age']==None]=0
df.head()

在这里插入图片描述
思考Q1:dropna和fillna有哪些参数,分别如何使用呢?

重复值观察与处理

由于这样那样的原因,数据中会不会存在重复值呢,如果存在要怎样处理呢

任务一:请查看数据中的重复值

df[df.duplicated()]

在这里插入图片描述df.duplicated(),括号里面什么都不填写,是按照所有列作为依据进行查找的,每一列的值都必须一致才会被标记为重复值。
在这里插入图片描述在这里插入图片描述

如果只需要用某一列作为标记依据,只需要将列名写在括号里就行了。
在这里插入图片描述

任务二:对重复值进行处理
(1)重复值有哪些处理方式呢?
(2)处理我们数据的重复值
方法多多益善
以下是对整个行有重复值的清理的方法举例:

df.drop_duplicates().head()

在这里插入图片描述
这个drop_duplicate方法是对DataFrame格式的数据,去除特定列下面的重复行。返回DataFrame格式的数据。

DataFrame.drop_duplicates(subset=None, keep='first', inplace=False)

subset : column label or sequence of labels, optional
用来指定特定的列,默认所有列
keep : {‘first’, ‘last’, False}, default ‘first’
删除重复项并保留第一次出现的项
inplace : boolean, default False
是直接在原来数据上修改还是保留一个副本

在这里插入图片描述

任务三:将前面清洗的数据保存为csv格式

df.to_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/test_clear.csv')

特征观察与处理

我们对特征进行一下观察,可以把特征大概分为两大类:
数值型特征:Survived ,Pclass, Age ,SibSp, Parch, Fare,其中Survived, Pclass为离散型数值特征,Age,SibSp, Parch, Fare为连续型数值特征
文本型特征:Name, Sex, Cabin,Embarked, Ticket,其中Sex, Cabin, Embarked, Ticket为类别型文本特征。
数值型特征一般可以直接用于模型的训练,但有时候为了模型的稳定性及鲁棒性会对连续变量进行离散化。文本型特征往往需要转换成数值型特征才能用于建模分析。

任务一:对年龄进行分箱(离散化)处理
(1) 分箱操作是什么?
在机械学习中,我们经常会对数据进行分箱处理的操作, 也就是 把一段连续的值切分成若干段,每一段的值看成一个分类。这个把连续值转换成离散值的过程,我们叫做分箱处理。

比如,把年龄按15岁划分成一组,0-15岁叫做少年,16-30岁叫做青年,31-45岁叫做壮年。在这个过程中,我们把连续的年龄分成了三个类别,“少年”,“青年”和“壮年”就是各个类别的名称,或者叫做标签。

(2) 将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示

#将连续变量Age平均分箱成5个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'], 5,labels = ['1','2','3','4','5'])
df.head()

在这里插入图片描述

(3) 将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示

#将连续变量Age划分为[0,5) [5,15) [15,30) [30,50) [50,80)五个年龄段,并分别用类别变量12345表示
df['AgeBand'] = pd.cut(df['Age'],[0,5,15,30,50,80],labels = ['1','2','3','4','5'])
df.head(3)

在这里插入图片描述

(4) 将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示

#将连续变量Age按10% 30% 50 70% 90%五个年龄段,并用分类变量12345表示
df['AgeBand'] = pd.qcut(df['Age'],[0,0.1,0.3,0.5,0.7,0.9],labels = ['1','2','3','4','5'])
df.head()

在这里插入图片描述

(5) 将上面的获得的数据分别进行保存,保存为csv格式

df.to_csv('E:/python-project/deep-learning/datawhale/kaggle/tantatic/hands-on-data-analysis-master/data/test_pr.csv')

- cut和qcut函数的基本介绍
在pandas中,cut和qcut函数都可以进行分箱处理操作。其中cut函数是按照数据的值进行分割,而qcut函数则是根据数据本身的数量来对数据进行分割。

首先我们准备一组连续的数据:

import pandas as pd
d = pd.DataFrame([x**2 for x in range(11)],
             columns=['number'])
display(d)

在这里插入图片描述

cut:按变量的值进行分割
例子:按照数据值由小到大的顺序将数据分成4份,并且使每组值的范围大致相等。

# cut:按照数据值由小到大的顺序将数据分成4份, 并且使每组值的范围大致相等。
d_cut = d.copy()
d_cut['cut_group'] =pd.cut(d_cut['number'], 4)
d_cut

在这里插入图片描述我们可以看到, 上面的代码把数据按照由小到大的顺序平均切分成了4份, 每份的值的跨度大约是25。

其中, (a1, a2]表示 a < x <= b, 默认情况下, 每个区间包括最大值, 不包括最小值。但是最左边的值, 一般设置成最小值(0)减去最大值(100)的0.1%, 也就是0 - 100*0.1% = -0.1。

我们查看一下上面每个分组里变量的个数。

# 查看每个分组里变量的个数
d_cut['cut_group'].value_counts()

在这里插入图片描述可以看到,每个分组里数据的个数并不一样。

如果希望每个分组里的数据个数一样,我们就要用到了qcut方法。

qcut : 按数据的数量进行分割
跟cut()按照变量的值对变量进行分割不同, qcut()是按变量的数量来对变量进行分割,并且尽量保证每个分组里变量的个数相同。

例子:把数据由小到大分成四组,并且让每组数据的数量相同

# 把变量由小到大分成四组,并且让每组变量的数量相同
d_qcut = d.copy()
d_qcut['qcut_group'] = pd.qcut(d_qcut['number'], 4)
d_qcut

在这里插入图片描述

# 查看每个分组里变量的个数
d_qcut['qcut_group'].value_counts()

在这里插入图片描述
从上面的结果我们可以看到,使用qcut()对数据进行分割之后,每个分组里的数据个数都大致相同,但是跟cut()不同的是,每个分组里值的范围并不相同。

任务二:对文本变量进行转换
(1) 查看文本变量名及种类

#查看类别文本变量名及种类
#方法一: value_counts
df['Sex'].value_counts()

在这里插入图片描述

df['Cabin'].value_counts()

在这里插入图片描述

df['Embarked'].value_counts()

在这里插入图片描述

	#方法二: unique
	df['Sex'].unique()
	#array(['male', 'female'], dtype=object)
	df['Sex'].nunique() #2

(2) 将文本变量Sex, Cabin ,Embarked用数值变量12345表示

#将类别文本转换为12345
#方法一: replace
df['Sex_num'] = df['Sex'].replace(['male','female'],[1,2])
df.head()

在这里插入图片描述

#方法二: map
df['Sex_num'] = df['Sex'].map({'male': 1, 'female': 2})
df.head()

在这里插入图片描述

#方法三: 使用sklearn.preprocessing的LabelEncoder
from sklearn.preprocessing import LabelEncoder
for feat in ['Cabin', 'Ticket']:
 lbl = LabelEncoder() 
 label_dict = dict(zip(df[feat].unique(), range(df[feat].nunique())))
 df[feat + "_labelEncode"] = df[feat].map(label_dict)
 df[feat + "_labelEncode"] = lbl.fit_transform(df[feat].astype(str))
df.head()

在这里插入图片描述

(3) 将文本变量Sex, Cabin, Embarked用one-hot编码表示

#将类别文本转换为one-hot编码
#方法一: OneHotEncoder
for feat in ["Age", "Embarked"]:
# x = pd.get_dummies(df["Age"] // 6)
# x = pd.get_dummies(pd.cut(df['Age'],5))
 x = pd.get_dummies(df[feat], prefix=feat)
 df = pd.concat([df, x], axis=1)
#df[feat] = pd.get_dummies(df[feat], prefix=feat)
df.head()

在这里插入图片描述
任务三:从纯文本Name特征里提取出Titles的特征 (所谓的Titles就是Mr,Miss,Mrs等)

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

在这里插入图片描述

思考Q1:dropna和fillna有哪些参数,分别如何使用呢?

dropna( )

对于Serial对象丢弃带有NAN的所有项

In [152]: data=pd.Series([1,np.nan,5,np.nan])

In [153]: data
Out[153]:
0    1.0
1    NaN
2    5.0
3    NaN
dtype: float64

In [154]: data.dropna()
Out[154]:
0    1.0
2    5.0
dtype: float64

对于DataFrame对象,丢弃带有NAN的行

In [19]: data=pd.DataFrame([[1,5,9,np.nan],[np.nan,3,7,np.nan],[6,np.nan,2,np.nan]
    ...: ,[np.nan,np.nan,np.nan,np.nan],[1,2,3,np.nan]])

In [20]: data
Out[20]:
     0    1    2   3
0  1.0  5.0  9.0 NaN
1  NaN  3.0  7.0 NaN
2  6.0  NaN  2.0 NaN
3  NaN  NaN  NaN NaN
4  1.0  2.0  3.0 NaN

In [21]: data.dropna()
Out[21]:
Empty DataFrame
Columns: [0, 1, 2, 3]
Index: []

丢弃所有元素都是NAN的行

In [22]: data.dropna(how='all')
Out[22]:
     0    1    2   3
0  1.0  5.0  9.0 NaN
1  NaN  3.0  7.0 NaN
2  6.0  NaN  2.0 NaN
4  1.0  2.0  3.0 NaN

丢弃所有元素都是NAN的列

In [24]: data.dropna(thresh=3)
Out[24]:
     0    1    2   3
0  1.0  5.0  9.0 NaN
4  1.0  2.0  3.0 NaN

fillna( )以常数替换NAN值

In [25]: data.fillna(0)
Out[25]:
     0    1    2    3
0  1.0  5.0  9.0  0.0
1  0.0  3.0  7.0  0.0
2  6.0  0.0  2.0  0.0
3  0.0  0.0  0.0  0.0
4  1.0  2.0  3.0  0.0

后向填充

In [27]: data.fillna(method='ffill')
Out[27]:
     0    1    2   3
0  1.0  5.0  9.0 NaN
1  1.0  3.0  7.0 NaN
2  6.0  3.0  2.0 NaN
3  6.0  3.0  2.0 NaN
4  1.0  2.0  3.0 NaN

后项填充且可以连续填充的最大数量为1

In [28]: data.fillna(method='ffill',limit=1)
Out[28]:
     0    1    2   3
0  1.0  5.0  9.0 NaN
1  1.0  3.0  7.0 NaN
2  6.0  3.0  2.0 NaN
3  6.0  NaN  2.0 NaN
4  1.0  2.0  3.0 NaN

在这里插入图片描述

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩波的笔记

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值