数据预处理是数据挖掘流程的第2步,如果把数据挖掘看成做一道菜的话,数据预处理就是选择和清洗蔬菜的过程,这一步没做好会影响整个菜品的口感。数据预处理的目的就是把整个数据集调整为对于算法干扰最小的结构,以便提高最终算法的训练效果。本章主要讲述采样、去噪、归一化和数据过滤。
3.1采样
采样就是按照某种规则从数据集中挑选样本数据。通常的应用场景是数据样本过大,抽取少部分样本来训练或者验证,这样不仅会节约计算资源,在特定条件下也会提升实验效果。
3.1.1 随机采样
随机采样( Random Sampling )是所有采样中最常用的一种,也是最容易实现的采样方法。具体的实现形式是从被采样数据集中随机地抽取特定数量的数据,需要指定采样的个数。随机采样分为有放回采样和无放回采样两种,
(1)举例说明。这两种采样方法有什么区别呢?例如,在1个箱子里放了100个球,我们需要从中拿出10个,然后就闭着眼睛随便取1个出来,取出来之后记录一下取了哪个球,然后把取出来的球放回去,再重新取,如此累计10次,这就是有放回采样。而无放回采样就是直接随机取10个出来,并且不再放回。
(2)示例代码。随机采样的Python2.7示例代码如下,其中:
dataMat是数据集;
number是采样数;
RandomSampling是无放回采样;
RepetitionRandomSampling是放回采样。
这里的代码只是一个示例,随机行为的实现采用了Python自带的random函数来执行。(3)效果展示。输入分为两个字段,按照从1~30排列,如图3-1所示。
图3-1部分输入数据
无放回的采样结果RandomSampling ( dataMat, 7)。因为是无放回式采样,所以采样数据不会出现重复的样本数据,结果如图3-2所示。
图3-2无放回式采样结果
有放回的采样结果RandomSampling ( dataMat, 10 ) ,结果如图3-3所示。
图3-3 有放回式采样结果
因为是有放回的采样,所以可能会出现重复的样本。
3.1.2 系统采样
系统采样(Systematic Sampling )在一般情况下是无放回式抽样。系统采样又称为等距采样,即先将总体的观察单位按某一顺序号分成n个部分,再从第一部分随机抽取第k号观察单位,依次用相等间距,从每一部分中各抽取一个观察单位来组成样本。系统采样的使用场景主要是针对按照一定关系排列好的数据。
(1)举例说明。例如我们想调查一个年级每个班级学生的精神面貌,但时间有限,只能抽样几名同学来做调查。于是可以选取每个班的进门靠墙位置的第1名同学来做调研,这就是一种系统采样的场景。相比于随机采样法,系统采样法更照顾了数据集的每个小分类中的样本集。
(2)示例代码。系统采样的Python示例代码如下,其中:
dataMat是数据集;
number是采样数;
SystematicSampling是系统采样。
(3)效果展示。
输入数据分为两个字段,按照从1~30排列,如图3-4所示。
系统采样的结果SystematicSampling ( dataMat, 10 ) ,如图3-5所示。
图3-4部分输入数据
因为是系统采样,结果按照相同的步长进行数据采样。系统采样在实际的应用中并不普遍,因为系统采样对于样本的限定过大,在实际的应用场景中,针对不同层级的采样需求往往通过分层采样来实现。
图3-5 系统采样结果
3.1.3分层采样
分层采样( Stratified Sampling )是先将数据分成若干个类别,再从每一层内随机抽取一定数量的观察样本,然后将这些抽取出来的样本组合起来。分层采样常常被用于在生成训练样本的场景中。因为在监督学习中,通常情况下正负样本的比例是不可控的,当正负样本的比例过大或者过小的时候,对于训练结果都是有影响的,所以往往我们需要用分层采样来控制训练样本的正负样本比例。
(1)举例说明。例如你想比较3家饭店中哪一家的菜品更好吃,可以分别去这3家饭店,然后随机点5道菜来试吃(选几道菜可以自定义) ,这就是分层采样的思想。如果是系统采样的话,需要有一个约定,如需要去3家饭店都点菜单上的前5道菜品尝。
(2)示例代码。假设我们有3层分类的数据,分别存储在dataMat1,dataMat2和dataMat3这3个数据空间中,我们的分层采样的比例为1 :1 :1 ,通过对于每一层进行无放回的随机采样,然后合并采样结果就是最终需要的结果集。
分层采样的Python示例代码,其中:
dataMat1, dataMat2和dataMat3是3组数据集;
number是采样数;
StratifiedSampling是系统采样。
(3)效果展示。
输入数据分为两个字段,按照从1~30排列,如图3-6所示。第1个字段表示数据数值。第2个字段表示层次的序号,本样例一共分成3层。
图3-6部分输入数据
分层采样的结果StratifiedSampling(dataMat1,dataMat2,dataMat3,9) ,如图3-7所示。
图3-7分层采样结果
分层采样从每一个层级中随机抽取出特定的数据,每个层级抽取的比例是可以自定义的。
3.2归一化
归一化是指一种简化计算的方式,将数据经过处理之后限定到一定的范围之内,一般都会将数据限定在[0,1]。数据归一化可以加快算法的收敛速度,而且在后续的数据处理上也会比较方便。另外,归一化算法是一种去量纲的行为,关于量纲对于计算的影响可以举这样一个例子:假设一组数据有3个字段,都表示3个小时的时间,但是量纲分别是小时、分钟和秒(见表3-1)。
表3-1 3个小时
当时间增加1个小时之后,见表3-2
表3-2增加1个小时
对比以上两个表可以看出,仅从数字的角度来看,3个字段的数据波动的幅度为秒>分钟>小时,但是从实际意义的角度出发, 3个字段在时间维度上的波动是相同的,都是改变了一个小时,但是在数字大小的波动却差别很大。归一化的作用就是去除这样的量纲给计算带来的影响。
归一化的具体计算方法可以用数学公式来表示: y=(x-MinValue)/ (MaxValue-MinValue) ,这里的
MaxValue和MinValue分别是针对矩阵的每一个字段的最大值和最小值,x是字段中的值,y为最终归一化结果。
(1) 示例代码。Python示例代码如下,其中:
width函数用来获得矩阵的字段数量;
AutoNorm函数对矩阵执行归一化。
(2)效果展示。输入数据(见图3-8)是一组星纲各不相同的数据(数据只显示了一部分) ,如age字段的单位是岁", chol字段的单位是毫升。通过归一化算法之后的数据呈现如图3-9所示(部分显示)。
图3-8输入数据
在执行归一化的算法时有一个地方需要注意,因为公y=(X-MinValue)(MaxValue-MinValue)的分母是MaxValue-MinValue ,如果某一个字段的最大值和最小值是相同的,会出现分母为零的情况。所以对于字段数据全部相同的情况要加以判断,通常来讲如果当前字段全部相等且为非零数值,就转换为1来处理。如果当前字段全部数值都是0,那就直接保留0。
图3-9 归一化之后的数据
3.3去除噪声
数据挖掘领域有很多专有名词,去噪就是其中的一个。去噪在一般情况下是指去除数据集中有干扰的数据(对场景描述不准确的数据)。说到噪声数据,到底它是怎么产生的呢?这里有一个实际例子来说明:我们的手机信号都是来自于基站发射的电磁波,有的地方信号比较强,有的地方就会比较弱。运营商的工程师们会负责统计不同区域的信号强弱来进行网络规划,这些工程师们采集信号的方法就是将一个信号接收终端固定在车上,然后开车绕着基站转,信号终端就会自动采集不同区域的信号强度,生成一份数据。但是如果在车运行的过程中出现急刹车或者其他突发事件,可能就会对信号采集造成一定影响,生成一些噪声数据。当然,产生噪声的原因还有很多,这里只是举了一个简单的例子。
噪声数据究竟对于模型训练有什么影响呢?因为很多算法,特别是线性算法,都是通过迭代来获取最优解的,如果数据集中含有大量的噪声数据,将会大大影响数据的收敛速率,甚至对于训练所生成模型的准确度也会有很大的负面作用.
前面介绍了产生噪声的原因和噪声数据对于机器学习训练的影响,接下来会重点介绍常用的去噪方法。根据不同的业务场景,其实有不同的处理方法,这里介绍一种叫正态分布30原则。正态分布也叫常态分布是连续随机变量概率分布的一种,自然界、人类社会、心理和教育中大量现象均按正态分布(见图3-10) ,如能力的高低、学生成绩的好坏等都属于正态分布,我们可以把数据集的质量分布理解成一个正态分布。它会随着随机变量的平均数、标准差的大小与单位不同而有不同的分布形态。正态分布可以表示成一种概率密度函数,正态分布公式如下:
其中, σ可以表示成数据集的方差,μ代表数据集的均值,x代表数据集的数据。相对于正常数据,噪声数据可以理解为小概率数据。
图3-10正态分布概率分布
正态分布具备这样的特点: x落在(μ-3σ , μ+3σ)以外的概率小于千分之三。根据这种特点,我们可以通过计算数据集的方差,把3倍方差之外的点设想为噪声数据来排除,这是比较常规的去噪手段。
(1)示例代码。去噪的Python示例代码如下,其中:
GetAverage函数返回均值;
width函数获取矩阵的宽度;
GetVar函数获取方差;
DenoisMat函数用于去噪。
(2)结果如图3-11所示。
图3-11 去噪的结果
通过正态分布去除3倍方差的方法可以去除数据集中的噪声数据,图3-11中的最后这条偏差值较大的数据就会被过滤掉。
3.4数据过滤
数据挖掘用到的数据来源于用户行为日志或是日常记录等,在很多时候不可以把全部数据进行训练。通常对于同一份数据,如果想做不同目的的挖掘,需要做不同方式的处理,数据过滤往往是数据前期处理的重要一环。例如我们有一组数据,里面有一个字段对于结果没有任何的意义(虽然理论上凡是数据就会有意义,但是某些时候可能对于单个字段的量化工作很难实现) ,见表3-3
表3-3用户数据
对于表3-3中的这一组数据,因为大部分的算法是需要对于数据字段进行求导和转置等数学运算的,于是很多时候需要数据是数值型的。第一个字段"用户昵称是字符型的,虽然字符型数据经过特征抽象是可以量化的(见第4章) ,但是对于昵称这一类数据在处理上还是有一定难度,而且对于这个购物场景的影响并不大,所以往往需要过滤掉这样的字段。
用户ID"这样的字段,虽然已经是数值型的,貌似可以进行算法直接处理,但是这种数据的本质与昵称类似,只表示对于某种名称或者文本的唯一标识,并不具备描述行为特性的含义,所以也是需要过滤掉的。在数据过滤的过程中,除了需要对于某些字段进行去除,很多时候还需要对于一些数值型特征进行过滤,这样的过滤处理往往需要依靠SQL语句来实现,如表3-3中数据,假如只需要选择性别是男性的用户数据带入训练,就可以通过SQL语句的where功能实现。
3.5本章小结
本章介绍了数据预处理的一些内容,我们这里只是选取了数据预处理中比较常用的几种方法:采样、归一化、去噪和过滤。其实在实际操作中还有许多其他手段,数据预处理作为机器学习整个流程中一道非常重要的工序,往往需要操作者根据自身的场景或者是数据特点做特定的一些处理方式,可能是一些简单的映射或者是非常复杂的SQL规则。在数据预处理阶段其实目的很简单:把数据集尽量优化成对于算法干扰最小的状态,尽可能地排除数据形式对于模型训练的影响。
本文节选自《机器学习实践应用》
本书主要是分享作者多年来的机器学习算法商业化实践经验。分别从机器学习的发展历程、算法理论、平台工具、实际案例几方面来系统化的介绍机器学习算法与实际业务的结合。全书分为20章,4个部分。4个部分包括机器学习概述、机器学习算法流程、机器学习平台介绍、机器学习行业案例。全书的章节按照机器学习的认知、学习到实际应用的流程来写,通过真实的案例配合图片、代码示例来表述。
专栏295集机器学习全面系统讲授作者:异步社区299币12人已购查看免责声明:内容来自用户上传并发布,站点仅提供信息存储空间服务,不拥有所有权,本网站所提供的信息只供参考之用。