导读: 直观来看,处理大数据的一个方法就是减少要处理的数据量,从而使处理的数据量能够达到当前的处理能力能够处理的程度。可以使用的方法主要包括抽样和过滤。两者的区别是,抽样主要依赖随机化技术,从数据中随机选出一部分样本,而过滤依据限制条件仅选择符合要求的数据参与下一步骤的计算。
01 数据抽样
一般来说,设一个总体含有N个个体,从中逐个不放回地抽取n个个体作为样本(n≤N),如果每次抽取使总体内的各个个体被抽到的机会都相等,就把这种抽样方法叫作简单随机抽样。从抽样的随机性上来看抽样可以分为随机抽样、分层抽样、整群抽样和系统抽样,下面依次对这些方法进行介绍。
争论:大数据与抽样
在《大数据时代》一书中提到,大数据的方法被定义为“采用全量数据而不用抽样的方法”,因而,有人认为大数据和抽样是矛盾的,抽样技术不能应用到大数据分析上。然而,在数据量大到一定规模的时候,不用抽样、而采用全部数据的方法将无法使用。例如,某个公司要对客户进行分类。如果采用客服回访的方式来进行分类的话,要求全量回访,一个月有几百万的用户,根本不可能做完。但如果是抽样,加上相关指标去训练模型,就能快速高效的解决。
而且,由于大数据价值密度低,很多场景下,仅选择一小部分数据就能够窥到数据全貌。特别采用一些随机化算法设计与分析分析技术的情况下,可以证明,即使采用抽样的方法,甚至在样本个数与数据量无关的时候,计算结果的精度同样是有所保证的。
1. 随机抽样
随机抽样 (也成为抽签法、随机样数表法)常常用于总体个数较少时,它的主要特征是从总体中逐个抽取。其优点是操作简便易行,缺点是在样本总体过大不易实行。
主要方法包括:
(1)抽签法
一般地,抽签法就是把总体中的N个个体编号,把号码写在号签上,将号签放在一个容器中,搅拌均匀后,每次从中抽取一个号签,连续抽取n次,就得到一个容量为n的样本。
比如,某高中要调查高一学生平均每天学习英语的时间信息,假设一个年级有1000人,从中抽取100名进行调查,整个过程可以看成,我们将1000人从1到1000进行编号,并给予相应的号签。然后将1000个号签搅拌均匀,并随机从中取出100个号签,再对号码一致的学生进行调查。
这种方法简单易行,适用于总体中的个数不多时。当总体中的个体数较多时,将总体“搅拌均匀”就比较困难,用抽签法产生的样本代表性差的可能性很大。
(2)随机数法
随机抽样中,另一个经常被采用的方法是随机数法,即利用随机数表、随机数骰子或计算机产生的随机数进行抽样。
例如C语言中提供的rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数。比如写一条C++语句:cout<<rand() % 6;那么就会输出一个范围在0到5之间的随机的整数。
(3)水库抽样
现在需要我们在有限的存储空间里解决无限的数据(含有海量数据的数据流)等概率抽样的问题。
我们首先从最简单的例子出发:要求我们在任意时刻只能存储一个数据,但要保证等概率的抽样。
假设数据流只有一个数据。我们接收数据,发现数据流结束了,直接返回该数据,该数据返回的概率为1。
再假设数据流里有两个数据,我们读到了第一个数据,这次我们不能直接返回该数据,因为数据流没有结束。我们继续读取第二个数据,发现数据流结束了。因此我们只要保证以相同的概率返回第一个或者第二个数据就可以满足要求。因此我们生成一个0到1的随机数R, 如果R小于0.5我们就返回第一个数据,如果R大于0.5,返回第二个数据。
接着我们继续分析有三个数据的数据流的情况。为了方便,我们按顺序给流中的数据命名为1、2、3。我们陆续收到了数据1、2。和前面的例子一样,我们只能保存一个数据,所以必须淘汰1和2中的一个。应该如何淘汰呢?不妨和上面例子一样,我们按照二分之一的概率淘汰一个,例如我们淘汰了2。
继续读取流中的数据3,发现数据流结束了,我们知道在长度为3的数据流中,如果返回数据3的概率为1/3, 那么才有可能保证选择的正确性。也就是说,目前我们手里有1,3两个数据,我们通过一次随机选择,以1/3的概率留下数据3,以2/3的概率留下数据1。那么数据1被最终留下的概率是多少呢?经过分析有:
我们做一下推论:假设当前正要读取第n个数据,则我们以1/n的概率留下该数据,否则留下前n-1个数据中的一个。以这种方法选择,所有数据流中数据被选择的概率一样。
下面给出简单的证明:
假设n-1时候成立,即前n-1个数据被返回的概率都是1/n-1,当前正在读取第n个数据,以1/n的概率返回它。那么前n-1个数据中数据被返回的概率为:(1/(n-1))*((n-1)/n)= 1/n,假设成立。
2. 系统抽样
当总体中的个体数较多时,采用简单随机抽样效率低下。这时,可将总体分成均衡的几个部分,然后按照预先定出的规则,从每一部分抽取一个个体,得到所需要的样本,这种抽样叫作系统抽样。假设要从容量为N的总体中抽取容量为n的样本,可以按下列步骤进行系统抽样:
例如, 为了解某大学一年级新生英语学习的情况,拟从503名大学一年级学生中抽取50名作为样本,目的是采用系统抽样方法完成这一抽样。
由于总样本的个数为503,抽样样本的容量为50,不能整除,可采用随机抽样的方法从总体中剔除3个个体,使剩下的个体数500能被样本容量50整除,然后再采用系统抽样方法。具体步骤如下:
3. 分层抽样
分层抽样的主要特征是分层按比例抽样,主要使用于总体中的个体有明显差异。其和随机抽样的共同点是每个个体被抽到的概率都相等N/M。
一般地,在抽样时,将总体分成互不交叉的层,然后按照一定的比例,从各层独立地抽取一定数量的个体,将各层取出的个体合在一起作为样本,则这种抽样方法是一种分层抽样。我们用一个例子来展示分层抽样。
例如,一个公司的职工有500人,其中不到30岁有125人,30岁至40岁的有280人,40岁以上的有95人。为了了解这个单位职工与身体状况有关的某项指标,要从中抽取一个容量为100的样本,由于职工年龄与这项指标有关,故采用分层抽样方法进行抽取。因为样本容量与总体的个数的比为1:5,所以在各年龄段抽取的个数依次为125/5,280/5,95/5,即25,56,19。
4. 加权抽样
首先来解释加权:加权是通过对总体中的各个样本设置不同的数值系数(即权重),使样本呈现希望的相对重要性程度。
那么在抽样时为什么要加权呢?例如,在城市和农村各调查300样本,城市人口与农村人口比例“城市:农村=1:2”(假设),在分析时我们希望将城市和农村看作一个整体,这时候我们就可以赋予农村样本一个2倍于城市样本的权重;
可以看出,加权抽样能够深刻的影响数据分析。
加权方法主要有:
因子加权:对满足特定变量或指标的所有样本赋予一个权重,通常用于提高样本中具有某种特性的被访者的重要性;例如,研究一种啤酒的口味是否需要改变,那么不同程度购买者的观点也应该有不同的重要性对待:例如:经常购买该啤酒的客户的权重=3,偶尔购买该啤酒的客户的权重为1,从不购买的客户的权重为0.1。
目标加权:对某一特定样本组赋权,以达到们预期的特定目标;例如:我们想要:品牌A的20%使用者 = 品牌B的80%使用者;或者品牌A的80%使用者 = 使用品牌A的20%非使用者。
轮廓加权:多因素加权,目标加权不同(一维的),轮廓加权应用于对调查样本相互关系不明确的多个属性加权;面对多个需要赋权的属性,轮廓加权过程应该同时进行,以尽可能少的对变量产生扭曲。
5. 整群抽样
整群抽样又称聚类抽样。是将总体中各单位归并成若干个互不交叉、互不重复的集合,称之为群,然后以群为抽样单位抽取样本的一种抽样方式。应用整群抽样时,要求各群有较好的代表性,即群内各单位的差异要大,群间差异要小。
整群抽样的优点是实施方便、节省经费;整群抽样的缺点是往往由于不同群之间的差异较大,由此而引起的抽样误差往往大于简单随机抽样。
整群抽样先将总体分为i个群,然后从i个群钟随即抽取若干个群,对这些群内所有个体或单元均进行调查。抽样过程可分为以下几个步骤:
例如,调查中学生患近视眼的情况,抽某一个班做统计,进行产品检验,每隔8个小时抽1个小时生产的全部产品进行检验等。
整群抽样与分层抽样在形式上有相似之处,但实际上差别很大。分层抽样要求各层之间的差异很大,层内个体或单元差异小,而整群抽样要求群与群之间的差异比较小,群内个体或单元差异大;分层抽样的样本是从每个层内抽取若干单元或个体构成,而整群抽样则是要么整群抽取,要么整群不被抽取。
02 数据过滤
在大数据处理之前,除了采用抽样的方法减小数据量而外,有时候还需要选择满足某种条件的数据,从而使得分析集中在具有某种条件的数据上。
例如,在电子商城图书的销售表中对“小说”类别的图书的销量进行分析,就可以在整个销售表中选择出类别为“小说”的图书。
在大数据处理过程中,数据过滤可以采用数据库的基本操作来实现,将过滤条件转换为选择操作来实现。例如,在SQL语言中,我们可以使用select from where语句很容易的实现过滤。
03 基于阿里云的抽样和过滤实现
在阿里云中,提供了多种抽样和过滤的选择。我们用下面这个例子来说明抽样和过滤的使用方法。
《权力的游戏》是一部中世纪史诗奇幻题材的美国电视连续剧。我们收集了一些关于战斗场景的数据,并希望按照特定的条件对数据进行过滤,然后按一定的数据比例,对原始数据进行抽样。原始数据前10条见下表:
▲关于战斗场景的数据
用阿里云先进行过滤,然后再分别进行加权抽样、分层抽样和随机抽样。首先进入阿里云大数据开发平台机器学习平台,选择相应的工作组后进入算法平台。在左侧实验中右键新建空白实验,输入对应的实验名称:
▲新建空白实验
在组件中选择相应的组件,拖拽到右侧实验中:
▲选择相应组件
先对数据进行过滤,然后进行抽样,最终节点设计如下:
▲程序流图
过滤参数中,映射规则全选,过滤条件设置为:attacker_outcome = 'win',参数设置如下:
▲参数设置
抽样参数分别设置如下:
▲加权采样参数设置
▲分层采样字段设置
▲随机采样参数设置
▲分层采样参数设置
点击运行,阿里云平台开始运行各实验节点。完成后,运行成功节点会出现绿色对勾标志。失败节点会显示红叉标志。在运行成功节点上点击右键,选择查看数据,能够查看运行结果数据:
▲程序流程
过滤结果如下:
▲过滤结果
抽样结果分别如下:
加权抽样如图:
▲加权抽样结果
分层抽样如图:
▲分层抽样结果
随机抽样如图:
▲随机抽样结果
从抽样结果看出,加权抽样依赖权重列数值的权重大小进行抽样;分层抽样根据分组列,先对数据进行分组,然后在每个组中进行抽样;随机抽样就是按照抽样比例,对数据进行抽样。三种抽样方式最后得到的结果数据是几乎完全不同的。
关于作者:王宏志,博士,博士生导师,哈尔滨工业大学计算机科学与技术学院副教授,中国计算机学会高级会员,YOCSEF黑龙江省分论坛AC。研究方向包括XML数据管理、图数据管理、数据质量、信息集成等。
本文摘编自《大数据分析原理与实践》,经出版方授权发布。
延伸阅读《大数据分析原理与实践》
转载请联系微信:togo-maruko