首页 > 编程知识 正文

数据预处理是数据分析和数据挖掘的基础吗,数据挖掘概念描述

时间:2023-05-04 01:46:45 阅读:253631 作者:4306

数据挖掘简介

数据挖掘,顾名思义,就是在大量的数据中发现有用的信息,随着信息技术发展,每天都会产生大量的数据,可以说我们正处于一个大数据的时代。面对如此多的数据,传统的分析方法不再适用,这就需要我们用新的技术工具来从数据中找到隐藏的信息。
数据挖掘的应用相当广泛,比如最“超市出售商品间的关联分析”(数据分析课上必然提到的“啤酒尿布”的例子),“根据历史数据做气候观测”、“生物学生的基因序列分析”等等等等。说到“啤酒尿布”这个例子(虽然后面被证明可能是rdxz的,但不失为一个精彩的事例),在我刚学习数据挖掘的时候,有一个疑问是为什么明明面包牛奶的关联性更强,但是我们从来不去讲面包和牛奶之间的关联分析,而是单单要说啤酒和尿布。其实这恰好说明了数据挖掘本身的意义,发现“隐藏的”,不易被发现的知识。面包和牛奶的搭配是我们的生活常识,如果大家都知道的东西,再去发现也就没有什么意义了,正是这种看似毫不相关实则息息相关的问题才是我们做挖掘的过程中应该关注的。
数据挖掘与数据库技术的发展和成熟时分不开的,其完整名字是数据库中的知识发现(Knowledge discovery in database, KDD),也就是将数据库中的 raw data 经过一系列的加工计算分析,得出有用信息的这个过程。该过程通常用如下几个步骤来描述:

@(图片来源:数据挖掘导论)
数据预处理即将未加工数据转换成适合分析的形式,包括多数据源的数据融合、数据清洗、维规约等等。数据预处理还没有很好的自动化工程化的方法,所以通常会耗费很多时间和精力,且需要加入人为经验的干预。
在数据挖掘的过程中我们也会遇到很多的问题,比如特征值过多导致的维度灾难,静态模型不够灵活,数据中包含的一些特征偏见等等,我们需要不断探索合适的方法来解决这些问题。

数据挖掘的目标

数据挖掘通常有两大目的:
描述预测
描述就是找出数据中潜在的模式/关联,比如我们上面说过的啤酒尿布的例子,而预测是根据其他的属性值来对某一特定属性值来进行预测,例如根据一个顾客的购买历史预测他是否会购买一种新产品等等。

数据挖掘中的基本概念

首先第一个概念就是数据集了,也就是我们拿到的数据。数据集是数据对象的集合。

名字:rzdsb,性别:男,年龄:21,身高:170;名字:fddhy,性别:女,年龄:23,身高:160;名字:wndyc,性别:女,年龄:20,身高:165;......

以上内容就可以看做是一个简单的数据集。其中的每一个个人信息就是一个数据对象。数据对象也叫记录、点、向量、模式、事件、案例、样本、观测或实体。常用的还是前几种叫法,一个数据可以抽象成为特征空间中的一个点,比如二维数据就可以用平面坐标中的一个点来表示。如果该数据有 4 个属性,那么我们可以将其表示为一个四维的向量,参考上面例子来说第一个数据对象就是{rzdsb,男,21,170}。都是非常形象的表示方法。
数据对象拥有一些基本特性叫做属性,也就是上述的“姓名”、“年龄”等等,属性也叫变量、特性、字段、特征或维。不同对象的属性值可能不同,同一对象的属性值也可能随时间的变化而变化。属性可以是“男”这种描述,也可以是“170”这种数字。
了解属性本身的类型和性质非常重要。同样是数字的属性,ID 和身高这两个属性就有很大不同,通过身高我们可以做统计分析,求均值、做线性拟合等等,但是对 ID 这类仅用来区分不同数据对象的属性做这些分析就没有意义。因此我们要对自己的数据集做充分的了解才行。
属性还可以分为连续属性(continuous)和离散属性(discrete)。根据属性可以取值的个数来区分。离散属性有有限个值或无限可数个值,通常用整数变量表示;连续属性是取实数值的属性。这样说也不够形象,可以想象性别属性取值只有男/女两种,年龄属性我们都是取整数,而没有人会是 18.333333 岁。但是高度属性就是连续的,理论上它可以取无限个值且不可以依次数出,即使高度限制在某个区间内,比如 170cm-180cm,但其属性值还是可以取到该区间内的任意实数,只不过我们在使用该属性值的时候回将其限制在一定的精度范围内。
除此之外,还有一种特别的属性叫做二元属性,它属于离散属性的一种,但是只有两种可能的取值,即非 0 即 1。
之前我们有说过要对数据做预处理,以便将数据整理成便于分析的形式。通常我们会将一个数据集以矩阵的形式表示出来。每一个数据对象是一个向量,那么所有的数据根据属性一一对应就成了一个矩阵。如果我们现在有了一个 m*n 的数据矩阵,意思是每一行代表一个数据对象,每一列代表一个属性,我们有一个包含 m 个数据对象的数据集,每个数据有 n 个属性值。

数据预处理

那么我们着重说一下数据预处理的部分吧,更准确地说,是数据清洗。
在机器学习领域有句话叫 “Garbage in, garbage out.” 数据很烂,无疑模型输出就会很烂。这里根据自己不算多的经验做点总结吧。不介绍过多编程问题了,以后再慢慢整理,如果会使用 Python 或 R 来处理数据,那么相信很容易实现清洗数据的这些方法。

1. 为什么要清洗数据?

这个问题上面已经提到了。我们的数据都是从哪里来的呢?可能是从网页上抓取的,也可能来自数据库,一些 API 下载接口下载下来的……,拿到数据以后,其中往往存在很多问题和错误,比如格式混乱,形式不统一,这时需要我们对其做清理。

上图就是我们希望得到的数据格式了。它是标准的矩阵样式,每一行代表一个数据,每一列是一个属性值,非常便于用编程语言导入然后进行分析。
这是一个 Excel 表格,我们还很常见到 JSON, CSV, XML 这些类型的文件等等。

2. 一些关于整洁数据的小建议

这里有一些来自 Coursera 的关于整洁数据的小建议
1. 在每个文件顶部标注变量/属性名称,而且最好清晰易懂,虽然在最后使用数据集的时候不会用到,但是在你处理过程中会很有帮助;
2. 一个数据集单独保存在一个文件当中。有人会喜欢在一个 Excel 文件当中放多个表,这种做法我们不是很提倡的;
3. 保留一个“编码本”。最后我们有了一个包含很多属性变量和值的数据集,但是我们可能需要知道更多关于这个变量的信息,比如对价格这个变量,你想知道它的单位,或是销售额这个变量,到底是以千为单位还是万还是其他。所以这里可以在数据处理过程中记录下变量的相关信息。
4. 你的实验过程和方法也可以分别记录下来,以便后期的分析;
5. 保留原始数据。处理了之后原始数据不要丢掉。

3. 读取数据

这部分不详述了,这个用自己熟知的编程语言去做就可以了。这里可能要留意一下数据文件编码的问题,比如我自己在读文件的时候就报了这样一个错误:

UnicodeDecodeError: 'gbk' codec can't decode byte 0xad in position 23: illegal multibyte sequence

就是一个解码错误的问题。大多数文件读写操作默认的编码是 UTF-8,遇到这种情况指定一下读文件的编码就可以了。

open("filename",'w',encoding="utf8")#encoding is the name of the encoding used to decode or encode the file. This should only be used in text mode. The default encoding is platform dependent, but any encoding supported by Python can be passed. See the codecs module for the list of supported encodings. 4. 常见的组织数据集的方法 排序并提取子集:以此筛选不符合变量范围的数据或值是 N/A 的数据等;对变量检查和总结:例如检查是否为 string 格式,判断是否是 null 或空值,如果是数值,可能要计算一些统计值,例如总数,平均数等等;创建新变量:有些数据可能需要通过一些变换才能得到你需要的目标值,你可以通过创建新变量,然后做映射得到你需要的值;合并数据集:可以利用 ID 对应来合并,如果是属性相同的不同数据集,可以利用属性对应来合并。 5. 数据中常见问题

其实现在数据清洗是一个很大的工程,至今也没有很好的工程化的方法,主要还是要靠人肉去检查判断(这里有说了和没说一样的嫌疑= =)。但现实就是有时候洗数据的时间比实验的时间还要长……
数据清洗是我们不得不面对的问题。数据集里常见的问题有以下几种:
缺失,重复,噪声,不一致,维度高
一下是一些建议做法,当然实际处理的时候要根据自己的需要。

1. 数据缺失,即某些数据的部分属性值缺失。
- 如果对于某一属性值,缺失的数据占比很小,比如一万条数据当中,缺失该属性的只有 10 条数据,那么我们可以简单去除这十条缺失数据。
- 如果某一属性值缺失非常多,比如一个公司网点分布的数据集,属性包含城市,经纬度,邮编,地址……邮编这个属性在一万个网点数据当中,九千多个都没有这个属性值,那么这个属性也就没有参考意义了,可以去除。
- 有些属性值缺失很多,但是可以依据其他属性值来填补的,例如用身份证号填充出生日期,根据经纬度范围填充城市等等。
- 也有一些缺失值可以用特定的内容来填充,例如:0,null,未知等,不过这个要根据实际来判断这样填充是否利于后期的数据分析。
- 一些可推断的数值也可以用均值,中位数这些来填充,比如按照时间序列排序的数据。
- 当然还有一些统计学上更加复杂的填充方式,比如贝叶斯,回归等等。
- 如果缺失值不影响统计结果,也可以忽略。

2. 重复
重复这个问题也是需要对数据做一个初步的判断,有些重复数据是无用的,需要查重并删除,但是有些情况,比如主题模型当中,需要统计词频,此时不但不能去重,而且相同词根的词也要做出处理,使其在统计时叠加,否则主题概率会出现问题。

3. 噪声
很多算法对离群值非常敏感,例如 KNN。
判断离群值方法也很多,最直观的一种应该就是可视化了,
比如这个例子

数据集中的部分放大以后是这样的:

然而,高维数据很难在空间中表示出来,很多属性也不支持这种直观的表达。
这里我们还可以借助很多统计和计算方法:
1. 简单的统计。已知一个属性值的特定范围,就可以简单地把范围以外的数据筛选出去。比如上图中是一个城市中的一些建筑位置统计,你知道该城市的经纬度范围,在此之外的点一定是有错误的。
2. 3σ 原则。即数据符合正态分布,那么与均值的差超过三倍标准差的都可视作异常值。
3. 基于距离。在数据量不大,而且距离易于计算的时候可以使用。距离判断的方法可以参考之前分享过的文章。
4. 基于箱形图分析。箱形图依据的也是简单的统计量,下图是箱形图的一个示例:

还有其他判断方法这里就不多介绍了。异常值或离群点的处理方法一般也是以下几种:
1. 删除:对于异常值不多且易于判断的可以删除
2. 不处理:对于对异常值不敏感的算法可以不处理
3. 均值替代:可以减少数据的损失
4. 手工更正:如果离群值是明显错误且可以更正,那么可以考虑手动更改,比如知道某建筑的经纬度,可以用正确的值替代。

4. 不一致
这里不一致可能是不同属性值之间的不一致,比如城市和对应的邮编,也可能是同属性的单位不一致,或数据类型不一致等等。
这个问题大多数情况还是可以批量解决的,像数据类型转换,字符串的规范化,遇到城市和邮编的这种状况也可以用对应的邮编列表来更正,这个后面再稍微详细说。

5. 维度高
这里针对的是一些可以合并处理的属性或是对分类或聚类无影响的属性。
降维一般分为特征选择和特征检测两大方法。
特征选择即数据中包含大量无关变量,我们要在其中找出主要变量。代表方法为 LASSO 算法。
特征提取即将高维数据转化为低维数据,可能舍弃原有数据,也可能创建新的变量,代表方法就是很常见的主成分分析(PCA)了。
关于 PCA 的数学原理,这里有一篇写的非常好的博客 PCA 的数学原理

6. 其他补充 不同领域有一些不同的预处理标准字符串标准化的一些方法:
统一大小写(尽可能转换为小写)根据空格或某些符号做分割去除多余空格,标点符号,下划线等提取子字符串处理字符串可以用一些已有的方法,比如 Python 中的 strip() 自动去除字符串两端空格和换行符等,也可以用正则表达式。这里 [wiki 语料处理] (https://github.com/RaRe-Technologies/gensim/blob/develop/gensim/corpora/wikicorpus.py)的代码就是 gensim 对wiki 语料库的预处理
这里是正则表达式教程数据类型转换(string -> int, etc)数据处理,包括连续属性的离散化和二元化,即将连续属性变换为分类属性或一个/多个二元属性一些数值属性也需要做归一化/标准化

熟悉 R 语言的朋友可以去看一下 Coursera 上的这个教程,链接见参考第一条,不是很长,但是实例很丰富。
另外这里还有一篇挺好玩的文章,是用 Python 的 pandas 库来做一些 Excel 中的常用操作:http://pbpython.com/excel-pandas-comp.html
参考:https://www.coursera.org/learn/data-cleaning
http://www.cnblogs.com/charlotte77/p/5606926.html
https://en.wikipedia.org/wiki/Dimensionality_reduction
《数据挖掘导论》

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。