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()

 #方法二: uniquedf['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: float64In [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 NaNIn [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

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

  1. kaggle实战—泰坦尼克(五、模型搭建-模型评估)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  2. kaggle实战—泰坦尼克(三、数据重构)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  3. kaggle实战—泰坦尼克(四、数据可视化)

    kaggle实战-泰坦尼克(一.数据分析) kaggle实战-泰坦尼克(二.数据清洗及特征处理) kaggle实战-泰坦尼克(三.数据重构) kaggle实战-泰坦尼克(四.数据可视化) kaggle ...

  4. 集成算法-随机森林与案例实战-泰坦尼克获救预测

    集成算法-随机森林 Ensemble learning 目的:让机器学习效果更好,单个不行,群殴走起 Bagging:训练多个分类器取平均 f ( x ) = 1 / M ∑ m = 1 M f m ...

  5. kaggle入门泰坦尼克之灾内容总结

    [泰坦尼克之灾](https://www.kaggle.com/c/titanic):求生问题预测,是一个二分类问题,判断每名乘客的存活情况,读了寒小阳大牛的博客,现做以下整理.阳哥只介绍了逻辑回归算 ...

  6. Kaggle滑水 - 泰坦尼克之灾(决策树)

    本文以Kaggle新手习题--Titanic: Machine Learning from Disaster为场景开展实验,以此熟悉Kaggle平台. 本文的源码托管于我的Github:Practic ...

  7. 《scikit-learn》《Kaggle》泰坦尼克数据集的试验

    下载泰坦尼克数据集,下载地址是:https://www.kaggle.com/c/titanic 这里如果是第一次使用kaggle的话,需要注册,注册时候有一些验证码的问题,可以参考https://w ...

  8. 机器学习实战(五) kaggle练习赛 泰坦尼克获救预测

    这道题的主页:https://www.kaggle.com/c/titanic 目录 一. 读取数据,观察数据分布 二. 数据预处理 1. 填充缺失值 2. 文字到数值的映射 三.模型 1. 用线性回 ...

  9. kaggle练习-泰坦尼克数据

    数据分析项目小试牛刀--kaggle经典案例 过去的一学期中,上了一门叫做<非参数统计>的课程,老师的要求是用latex或者Rmarkdown写作业,编程语言必须用R.课程结束发现自己成绩 ...

最新文章

  1. 【Opencv】直方图函数 calchist()
  2. Unity接入安卓sdk查看应用内存占用
  3. 数学图形(2.23)Cylindric sine wave柱面正弦曲线
  4. Linux软件安装的几种常见方式介绍
  5. Java黑皮书课后题第2章:2.11(人口统计)重写编程练习题1.11,提示用户输入年数,然后显示这个年数之后的人口值,将1.11中的提示用于这个程序
  6. java懒加载设计模式_java设计模式——单例模式
  7. mysql必_MySQL必知必会(一)
  8. js 控制文件名与文件大小
  9. ClassicLink概述
  10. 靠谱测试人员需具备沟通表达能力
  11. 腾讯专利仅次谷歌;​苹果或将 iPhone 订单转给和硕;​Uber 接受比特币支付 | 极客头条...
  12. html5 history解决ajax不能加入历史记录的问题
  13. 使用严格模式的坏处_再见面试官:单例模式有几种写法?
  14. java 正则表达式案例
  15. 记录:Ftrace/systrace 功能使用
  16. Shark简介、部署及编译小结
  17. 校技能节之打铁记~~~~~~
  18. 阿里云服务(四)—云数据库RDS
  19. HTML标签和说明属性
  20. 神牛闪光灯TT865/V850II 860II Sony热靴口损坏,更换新热靴口

热门文章

  1. 分布式面试 - zookeeper 都有哪些使用场景?
  2. BGP——双AS配置
  3. OSPF报文详解——LSA概述
  4. zephir 编译php,使用Zephir来快速编写高性能PHP二进制拓展
  5. jQuery 源码解析(三十一) 动画模块 便捷动画详解
  6. Ansible playbook
  7. 【记录】利用jar包制作docker镜像
  8. Hexo博客的备份与恢复
  9. 【C语言】利用递归函数求n的阶乘
  10. android tv ko,Android TV 键值修改流程