数据预处理(系统整理)

前两节,我们总结了数据预处理中的一个小部分 -- 数据类型转换。这一节我们系统地总结下数据预处理相关知识点。纵然我们掌握了很多机器学习算法,十八般武艺,样样精通,可是在拿到一份数据集的时候,还是无法直接应用。因为我们的数据集真的是很“dirty”的,里面包含了大量的缺失值,异常值,离群值,非结构化数值等等。通常,在做机器学习或数据挖掘时,数据预处理会占用60%~70%的时间,所以这一部分也是整个机器学习任务中最具挑战性的部分。


Data preprocess.jpg

数据预处理的组成部分:

1.数据清洗
2.数据转换
3.数据描述
4.特征选择
5.特征提取

接下来,我们对这五个部分进行逐一地归纳总结。

1. 数据清洗

数据清洗主要包括缺失值,离群值,异常值以及重复值处理。本想选择一份包含这四种缺陷的数据集来做案例演示,由于我见到的数据集很有限,没有找到合适的,所以就选取不同的数据集进行说明。
1.1 缺失值处理
对缺失值的处理,我们有两种方法:1.当缺失数据的样本较少,或缺失数据的特征对最终结果的影响不大时,可删除含有缺失值的样本或者特征;2.当缺失的数据对最终结果影响较大时,这时我们需对缺失值进行填充。
Titanic数据集链接:https://pan.baidu.com/s/1EZqIAhSYE51NLDX1NNgBPQ
提取码:ln2z

#导入数据分析要用的工具包
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline

titanic = pd.read_csv('D:\\Py_dataset\\titanic.csv')
#查看该数据集的缺失值
titanic.isnull().sum()
#结果展示,可以看出‘Age’特征缺失了177个值,‘Cabin’列缺失了687个值,‘Embarked’缺失了2个值,我们的总样本数为891。
PassengerId      0
Survived         0
Pclass           0
Name             0
Sex              0
Age            177
SibSp            0
Parch            0
Ticket           0
Fare             0
Cabin          687
Embarked         2
dtype: int64
#由于Cabin列的缺失数据过多,所以很难将这一特征利用起来,可将其直接删掉。
titanic = titanic.drop('Cabin',axis = 1)
#Age特征对最终结果的影响较大,所以我们可以对其进行填充,这里我们使用乘客年龄的中位数对其进行填充。
titanic['Age'] = titanic['Age'].fillna(titanic['Age'].median())
#使用登陆最多的港口对Embarked列进行填充。
titanic['Embarked'].value_counts()
#结果展示,可以看出S是登录最多的港口。
S    644
C    168
Q     77
Name: Embarked, dtype: int64
titanic['Embarked'] = titanic['Embarked'].fillna('S')
#我们再次查看下数据的缺失情况
titanic.isnull().sum()
#结果展示,数据集中的缺失值都被我们处理掉了。
PassengerId    0
Survived       0
Pclass         0
Name           0
Sex            0
Age            0
SibSp          0
Parch          0
Ticket         0
Fare           0
Embarked       0
dtype: int64

1.2 离群值处理
举例说明:一般情况下,我们的身高都在170cm~180cm左右,而大姚的身高是226cm,这时我们就可以认为大姚的身高就是一个离群点。离群点对数据的统计特征会带来影响,平时我们会经常看到平均工资的数据,总会感叹自己又拖后腿了,这也是我们的工资水平都被那些超高工资的人给平均了。
我们观察离群点最简单的方法就是画盒图,在盒图的上下两边界之外就是离群点。对于离群点的处理方式,一般情况下可直接删除这些离群点。

#调用画图工具包seaborn
import seaborn as sns;sns.set()
plt.figure(figsize = (6,4))
plt.subplot(1,2,1)
sns.boxplot(y = 'Age',data = titanic)

plt.subplot(1,2,2)
sns.boxplot(y = 'Fare',data = titanic)
Outlier image.png

1.3 异常值处理
举例说明:某人在信息采集表中的收入栏填写的数值是-100,对于我们而言-100肯定是不符合常理的,所以像这样的数值就是异常值。对于这种数据,我们通常可以用平均收入替代该异常值,也可以直接删除该异常值。
1.4 重复值处理
有时候,我们在收集数据的时候,可能会对某一个样本记录两次,这样就会导致我们后期的统计结果出现偏差。在数据清洗的时候,就需要删除这些重复值。
这里以学生在线学习的数据集为例,实际上这份数据集是不重复的,因为我们可以在网上选择好多门课程,可以天天学习,每一次的学习都对应着一条记录,唯一不变的就是你的学号。在这里我们主要是学习重复数据的处理方法,不去深究这份数据是否真正的重复。
enrollments数据集链接:https://pan.baidu.com/s/1lKHwJFcsLe3W3DjG0KPniA
提取码:76rd

df = pd.read_csv('D:\\Py_dataset\\enrollments.csv')
#查看前10行数据,可以看到学号448对应了9条数据,我们假定这9条数据是相同的。
df.head(10)
enrollments.data.png

我们的目标是每个学号只保留一条学习记录,所以就需要将多余的记录删除掉。

df = df.drop_duplicates(['account_key'])
df.head()
new_enrollments.png

2. 数据转换

在我们对数据进行建模时,机器学习算法所能处理的数据类型为数值型,所以就需要我们对非数值型的数据进行格式转换,将其转化为数值型数据。涉及数据转换的内容,前面写的比较零散,这一节将这些零散的知识点串起来,具体内容可点击链接参考以前的方法总结。
2.1 离散型数据的转换方法:pd.map(), pd.get_dummies(), sklearn.LabelEncoder(),sklearn.OneHotEncoding()
详细内容可参考:https://www.jianshu.com/p/2c82088390f2
2.2 连续型数据的转换方法:对数据进行切割,pd.cut()
详细内容可参考:https://www.jianshu.com/p/867782d538ce
2.3 数据的归一化和标准化:sklearn.preprocessing.MinMaxScaler(),sklearn.preprocessing.StandardScaler()
数据归一化:v' = (v - min)/(max - min)
数据标准化:v' = (v - μ)/σ
详细内容可参考:https://www.jianshu.com/p/3056827b6513

3. 数据可视化

数据可视化可以帮助我们更加直观地认识数据,可以帮助我们发现数据所无法直接体现出来的规律。数据可视化是探索性数据分析(EDA)过程中非常重要的工具,我们的分析步骤通常为单特征分析 -- 双特征分析 -- 多特征分析。数据可视化同时也贯穿于数据分析的全过程,每一个阶段我们都可以对数据进行可视化展示。
数据可视化详细内容可参考:https://www.jianshu.com/p/74bfef922d12

4. 特征选择

下图是我们titanic数据集的前五行,我们将'Survived'列作为标签值,将其余的列作为特征值,假如我们要采用分类算法对其进行建模,是否我们要使用所有的特征呢?当然不是,从下图的数据集中就可以看出,'PassengerId','Name','Ticket'对最终结果'Survived'是没有任何影响的,所以这些特征我们不采用。我们尽可能的选择对最终结果影响较大的特征,这可能就需要我们具备一些领域知识来进行判断。当然如果不确定某个特征是否重要,我们可以做个对照试验,加上这个特征建立一个模型,不加这个特征建立一个模型,最终对比两个模型的效果。

titanic.png

5. 特征提取

特征提取与特征选择不同,特征选择是从众多特征中选择对结果影响较大的特征,特征提取是对现有的特征进行组合,以较低维数的特征来尽可能地表达事物的全貌。我们最常用的特征提取方法有两种:LDA和PCA。
LDA:线性判别分析,是一种有监督学习的降维算法。其核心思想是:降维后的数据类别之间的距离尽可能的大,类内的距离尽可能的小。
LDA算法具体内容可参考:https://www.jianshu.com/p/aed99ea310e1
PCA:主成分分析,是一种无监督学习的降维算法。其核心思想是把原始数据投影到方差最大的方向,以保留尽可能多的特征。
PCA算法具体内容可参考:https://www.jianshu.com/p/59d1a9e63799

以上,我们对数据预处理做了一个完整的总结。在拿到一份数据集之后,我们就可以按照数据清洗、数据变换、数据可视化、特征选择,特征提取的方式对数据进行处理。数据的质量对最终的模型效果起着决定性作用,所以数据预处理工作是机器学习任务中最重要的一环。

由于我对数据挖掘与机器学习的认识水平很有限,在总结上述内容的过程中,难免存在错误,还请大家在阅读过程中提出宝贵的修改意见,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 219,366评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,521评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,689评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,925评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,942评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,727评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,447评论 3 420
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,349评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,820评论 1 317
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,990评论 3 337
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,127评论 1 351
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,812评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,471评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,017评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,142评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,388评论 3 373
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,066评论 2 355

推荐阅读更多精彩内容