第一章:再抽样技术与交互式分析
本文基于再抽样(subsampling)技术的交互式(interactive)大数据分析。为此,我们总结了一套规范的分析方法论,研究了支撑该方法论的统计学理论基础,并开发了便捷的Python开源软件包(clubear)。本文有三个关键词:大数据(massive data),再抽样(sub-sampling)与交互式(interactive)。对这三个关键词,下面将逐一详细讲解。
1.1 本文对大数据的定义
大数据,这似乎是一个被四处滥用的词语,而且定义极其模糊。为了避免不必要的误会,下面会对本文所涉及的“大数据”做一个尽可能准确的描述,以便于快速甄别这是不是你关心的大数据内容。
首先强调一点,本文研究的都是传统的结构化数据。因此,非结构化数据(例如:图像、声音、自然语言相关的数据)都不是本文的内容。显然,这并不是因为这些非结构化数据不重要,而仅仅是因为本文的能力有限,目前还无法覆盖这些重要的内容。但是,从另一方面看,即使对非常规范的结构化大数据,人们似乎仍然非常缺乏便捷的分析方法论,以及支撑它的软件工具。因此,本文尝试在这个方面做一些探索。
其次需要讨论的是,本文所的“大数据”到底有多大?对“大”的定义到底是什么?这里你需要认真阅读,因为下面将严格界定本文所谓的“大数据”到底有多大。首先,本文的数据量显然不能太小。那么到底多小的数据才叫做小呢?同样一个数据,对某些人而言就是很大,而对某些人而言就很小。为什么?因为所拥有的计算设备(例如:计算机)各不相同。例如,硬盘上1G的数据,对大多数普通人的个人电脑而言是很大的。这种很大表现在分析处理该数据时很艰难。因为常见的数据分析软件(例如:Excel,R,Python等)都很难一次性地将这些数据读入内存。或者能读入,但是读入很慢,处理很慢,对用户的响应很慢。简单三个字概括这种体验就是:很不爽。但是,如果拥有一个32G内存的工作站,这样体验就会好很多。此时,可以把数据一次性读入内存。虽然读入内存这个过程仍然很慢,会产生不小的用户等待时间。但是,数据一旦读入内存,处理起来还是非常快的。从这个位置开始,之后的分析工作中,可能不会太感受到1G数据与1K数据之间特别明显的差距。因此,同样1G的数据,对于一个普通的个人电脑用户而言,可能就很大;而对于一个拥有高性能工作站的用户而言,就不是很大,甚至仍然属于小数据的范畴。
由此可见,所谓数据大小,是没有绝对标准的。数据的大小是相对于所拥有的计算设备而言的。因此,本文定义一个数据叫“小数据”,如果该数据能够被目标计算设备(例如:一台服务器)一次性轻松读入内存。相反,本文定义一个数据叫做“大数据”,如果该数据无法被目标计算设备(例如:一台个人电脑)一次性读入内存(或者读入过程很痛苦,读入后的处理效率很低)。因此,本文对大小数据的定义并不依赖于任何虚无缥缈的概念,而是依赖于用户的切实体验。只要让常见的分析方法和软件(传统分析方法和软件一般要求数据一次性读入内存)难以计算处理的数据,就是本文所界定的大数据。
但是,不是所有的大数据都能够被本文即将介绍的方法论处理(至少目前为止)。如果一个数据实在太大,大到了一台机器放不下(例如:1P的数据),而必须采用分布式存储系统。那么很遗憾,本文即将介绍的再抽样方法也处理不了。本文的方法依赖于高效的再抽样算法,这需要计算机提供匹配的硬件支持。如果所有数据都放在一台机器的硬盘上(最好还是固态硬盘),那么再抽样算法就可以被非常高效的执行。相反,如果数据被分布式存储在不同的计算机上,那么再抽样算法就必须去频繁地访问不同的计算机,这会产生大量的通讯成本(communication cost)。这会大大降低再抽样算法的抽样效率。这显然是再抽样算法的一个缺点和局限性,请一定知晓。
因此,本文能处理的数据量,应该远小于你的硬盘。因为,只有这样大小的数据才能够在硬盘上被高效地抽样处理。请问:这样的数据量有多大呢?假设你的电脑硬盘是1T,那么我们能处理的数据量得比这个小很多,最好不要超过10G。小声问一句,10G对你来说够大了不?对很多朋友而言,10G这个数据量太小了,完全不能满足需求。但是,对于更多的朋友而言,10G的数据量是足够大的,甚至是典型的。如果10G对你而言足够大了,那么请你跟我一起走完下面的再抽样和交互式的旅程,非常精彩!整个过程,不需要高大上的分布式系统,只需要最普通的电脑(例如:你的笔记本),还有Python就可以了。只要满足这两个条件,就非常便捷快速地享受大数据分析带给你的快乐。
1.2 为什么不考虑分布式
再次强调,即将跟大家分享的数据分析框架只需要一台普通的计算设备(例如:你的笔记本电脑),不需要庞大的分布式系统。为什么不考虑分布式的计算框架(例如:Hadoop, Spark)呢?原因很简单,因为在大多数以分析建模为目标的情形下,分布式框架昂贵、复杂,而且似乎没必要。盲目地追随分布式,会带来太多深坑。
第一个深坑:预算问题。要采用分布式系统,你就需要添置计算资源,请问如何添置?如果是购买,那么能入眼的工作站(或者服务器)再便宜也得1万+。至少得是2台吧?要不怎么叫分布式?如果是租,大家可以在各大云服务提供商平台(例如:阿里云、华为云等)去查询一下价格。你会发现租金其实一点也不便宜,比买还贵,一年没有1万+的预算,你租不起任何像样的服务器。请问:你要添置几台服务器?什么样的?需要多少预算支持?是一次性投入?还是每年持续投入?当你回答完这些问题后,下一个问题马上就来了:你要做什么高大上的数据分析,能带来什么好处,能够支撑这么大的预算?在绝大多数情况下,你会发现这个问题很难回答。数据分析已经融入到企业的方方面面,对企业业务运营有贡献,这是毫无争议的。但是,具体到你要做的这个特定分析,能产生什么特定的价值,并且可以用货币衡量,这太难了!面对这样的困境,如何说服领导这样的分析能支撑这样的预算,这是一件很艰难或者根本不可能的任务。
第二个深坑:技术问题。好,假设你终于说服领导购买了必要的计算资源。下一个问题来了:你会吗?你懂吗?这个会和懂包含两个方面。首先,你会安装相应的软件资源吗?其次,安装好之后你会用吗?例如你要用Hadoop和Spark,你有必要的Python基础吗?有了必要的Python基础,你懂Hadoop和Spark的Map-Reduce框架吗?你懂Hadoop和Spark之间的区别吗?这中间可能还会牵涉到其他的技术(例如:Hive)等。如果仅仅是用这些分布式系统做一些简单的代数运算,可能还好。如果再追问一句:如何用Spark做逻辑回归呢?你会发觉整个人都不好了。因为你对这些问题的答案很可能都是否定的。当然,不会没关系,不懂没关系,可以学习嘛。那么这些技术框架好学吗?显然不好学。因为,大多数情况下,你可能有一个属于自己的笔记本(或者台式机),但是你没有分布式计算平台。连平台都没有,你怎么学?好,假设你有平台了,那就好学了吗?答:还是很不容易。大多数情况下,这些平台都是建立在linux操作系统上的。因此,你得先学linux的基本操作。例如:在小黑窗(终端)中通过键盘操作,如何进入不同的目录,如何删除文件,如何更改文件名等。对于一个喜欢WIN或者MAC视窗操作的你来说,这需要一点点时间。你看,不是说好要学习分布式框架(例如:Hadoop)吗?这折腾半天,连Hadoop的边都还没有碰到呢。终于,你所有准备工作都做好了,你会发现分布式框架的学习是有一定难度的。当然,不排除这种可能,天赋秉异的你自学成才,毕竟这样的小伙伴比比皆是。但是,对于绝大多数像我这样的普通人,没有老师带路,是很难上手的。这也是为什么与分布式平台基础操作相关的培训课程比比皆是的原因。这说明这个学习是不容易的。
第三个深坑:必要性问题。什么样的工作真的需要分布式计算框架,非要如此大动干戈呢?显然,这样的工作场景确实存在。例如,对于一个有海量注册用户的电商网站,会面临用户的消费记录、会员积分、基本信息变更等计算任务。这样的计算任务每天都有,而且要求绝对准确。任何不准确不是给消费者带来损失,就是给自己带来损失。因此,这样的数据处理就有两个特点:第一、不能容许任何误差;第二、面面俱到。所谓面面俱到就是要求每个账户样本都要涉及,不能忽略或者抛弃其中任何一个,因此任何抽样算法都不可能有用武之地。因此,这样的业务场景必须用分布式(或者类似的)计算框架处理。毕竟,这不可能是单机能完成的任务。但是,如果是做数据分析呢?大多数分析有必要绝对准确吗?有必要面面俱到吗?与此相关的另一个问题是:数据分析对误差是容许的吗?如果你认为数据分析是不允许任何误差,那么请举一个例子,我相信这样的例子很少。事实上,几乎所有的数据分析都是误差容许的,而且是必须误差容许的。原因很简单,因为所谓数据分析,分析的就是不确定性(例如:消费行为、市场走势)。因此,对于绝大多数数据分析而言,压根就不存在绝对正确的结果。但是,可以有相对靠谱的结果。在相对靠谱的前提下,大方向一致的分析结果,对实际工作的帮助都是一样的。如果高精度分析结果和足够精度分析结果所需要的时间成本都是一样的,那么显然更喜欢高精度分析结果,因为不要白不要。但是,如果高精度分析结果是以巨大的时间成本为代价的呢?如果高精度分析结果是以巨大预算为代价的呢?这就得谨慎考虑了。大多数情况下,那个精度差一点(但是还可以接受),但是时间成本低很多,预算成本低很多的方案,更受欢迎。
当然,必须强调一点,这里并不是在否认分布式系统的巨大价值和现实意义。任何对此的质疑都是可笑的。这里强调的是:面对分析任务的时候,很可能(甚至大概率),你是不需要分布式系统支持的,这里需要一点点审慎的思考。
1.3 论数据分析的误差容许性
请注意,几乎所有的数据分析都是误差容许的,因为几乎所有的数据分析都不可能做到绝对精确的,而最终的数据分析都是用来支撑决策的(推荐、广告、投资等)。对于决策而言,超级精确的结果和足够精确的结果是一样的。例如,一个自动化推荐系统,是否应该给一个用户推荐华为手机呢?通过超级精确的模型测算发现,该用户购买华为手机的概率为65%,因此应该推荐。另外一个足够精确的模型测算发现,该用户购买华为手机的概率为64.5%,请问推荐结果会变吗?答:不会,仍然是推荐。由此可见,对于个性化推荐这个业务场景而言,决策对分析结果是误差容许的。为什么会产生误差容许现象?因为:分析的对象(例如:购买行为)是高度不确定的,分析结果(例如:购买概率)常常是连续的,而决策(是否推荐)是离散的。因此,几乎所有的数据分析都有很高的误差容许度。
为了帮助你建立一个直观感受,跟你分享一个实际数据分析的案例。在本文中我们简称该数据为“航空数据”(airline data)。该数据来自美国统计学会(American Statistical Association)官方网站(http://stat-computing.org/dataexpo/2009/),可以公开下载。对此应该首先对数据的提供者表示深深的感谢。该数据对本文非常重要,因为将以该数据为主要案例,演示整个方法论框架以及代码操作。后面会对该数据做一个更加详细的介绍,这里只做最简单说明。这是一个关于航班信息的数据,有大概1.2亿行观测,在硬盘上占据12G的空间。

图1.1:基于航空数据全样本的均值估计
为便于讨论,这里只考察其中一个变量Distance。该变量表示某一航班从起点城市到终点城市,所经历的飞行距离,单位为英里(Mile)。假设管理者想了解一下该变量的均值。如果要对全样本计算,一个相对方便的做法是利用Python的Pandas库中的read_csv函数,将数据读入处理。由于该数据量很大,对绝大多数工作站而言,无法一次性读入。因此必须分块读入,分块计算,最后汇总。这就立刻产生了不小的代码需求(见图1.1)。假设你有一定的Python基础,因此没有对代码做特别详细的解释。这里仅仅对最关键的部分做一个强调,那就是通过pd.read_csv函数中的iterator和chunksize两个参数控制,让程序将原始数据分块读入(iterator=True),分块计算处理。每次读入行数是chunksize=10**6。显然,不会这么巧最后一块数据(chunk)大小正好是chunksize=10**6,那么iterator=True这个参数会让pd.read_csv根据实际情况读入残余数据而不报错。
先不说最后结果如何,整个代码是有一点难度的。如果不是熟练手,自己去写上面这个代码,是非常容易出各种错误的。假设最后代码终于写好了,可以在服务器上开始运行。最后,一共完成了124个迭代,大概等于124*10**6=1.24亿行数据。最终计算获得的样本均值为:701.699英里。总共耗时(含124次print时间)157秒,超过2.5分钟。时间长吗?也许你会说,时间不长呀!对,如果你把上面的代码复制粘贴直接运行,而且你确认最后的结果就是你想要的,那么2.5分钟时间真的不长。但是,实际的时间消耗会远远大于2.5分钟,这源于几个原因。
第一、你要自己写代码,你会根据研究或者业务需求的变化(可能都是鸡毛蒜皮的变化)不停地修改你的代码,并因此面对新的代码错误,从而产生不小的代码修正时间。我自认为是一个数据分析方面非常熟练的Python编程人员,写上面的代码也花了我10分钟的时间,因为中间有各种意想不到的问题出现(例如:编码问题),需要试错。
第二、更糟糕的是需求不停变化,而且具有不确定性。几乎没有任何一个数据分析的需求是稳定的、不变的。例如,根据初步分析计算结果发现各种问题(例如:数据有异常值,分布厚尾等),因此需要相应的数据处理(例如:删除、变换)。这样的改动需求很多,每一次小小的变化和改动,都要2.5分钟。请问你是否能够消耗得起?事实上,即使面对很小的数据量(例如:1千行),各种奇葩的问题也层出不穷。更何况1.2亿行的大数据,不知道要出多少状况。每次消耗2.5分钟,请问谁消耗得起?
相反,如果放弃对“全样本计算”的执着,事情会简单很多。如前所述,几乎所有的数据分析都是误差容许的。事实上,统计学推断的一个核心智慧就是对误差的评价和判断(例如:标准误差的测算)。毕竟,统计学研究的不是统计,统计学研究的是不确定性。在不确定性存在的情况下,没有任何分析能够绝对准确。即使全样本数据也是对总体的一个估计,也是有误差的。当然,因为全样本的样本量很大(N=1.2*10**8),所以相应估计量的精度一定最高。按照标准的基于独立同分布假设的统计学理论可以知道,均值的标准误差(SE:standard error)为:SE=Std/sqrt(N),其中Std为标准差,N为样本量。对于航空数据的Distance指标而言,标准差(Std)大概为549.67(见图1.2)。因此,全样本均值的标准误差SE大概为:549.67/sqrt(1.2*10**8)=0.05英里。一英里大概是1.6公里,那么0.05英里大概是80米。而0.05英里大概是平均航空距离701英里(见图1.1)的万分之1不到。请问:真有这个必要吗?什么样的管理决策需要万分之1的精确度?
答案显然是否定的。也许精确到10英里范围内就非常好了。如果能接受这个标准,那么就可以接受再抽样(subsampling)算法。什么是再抽样?从统计学理论的角度看,任何实际数据,无论多大,都是从一个概率分布生成的。这个抽象的概率分布才是总体。而我们看到的航空数据是一个抽样数据,是从总体中随机抽取的。而这个样本太大了(N=1.2*10**8)。而所谓再抽样算法就是从这个样本中再随机的抽取一个小样本(例如:n=10**4),然后基于小样本计算同样的统计量(例如:样本均值)。小样本带来的优点很明显,那就是:快!因为再抽样样本的样本量n(请注意区分n和N)很小,因此可以快速获得,快速分析,并形成快速反馈。当然,小样本的缺点也很明显,那就是:一次再抽样所产生的精度可能达不到我们需求(例如:误差1英里)。
再抽样算法的精度问题很好解决,那就是多做几次再抽样,每次都计算同样的统计量,然后再用科学规范的方法将每次再抽样的计算结果整合在一起。请注意整合再抽样计算结果的方法很多,不一定是把各个结果再算一个均值这么简单,这里需要扎实的统计学理论去做支撑。但是,无论任何整合方法,目标都是一致的,那就是要形成一个更加准确的估计量。理论上要求,如果再抽样的次数趋向于正无穷,那么最终估计量的精度应该和全样本估计完全一致。这是一个重要的理论要求,它保证了人们采纳的再抽样方法(含抽样方法以及计算方法)的大方向是正确的。但是,在实际工作中,显然没人希望做无穷多次再抽样,那样的计算成本岂不是无穷大!
那到底要多大的再抽样样本以及次数呢?给大家一个直观的感受,请见图1.2。这是基于我们开发的Python开源软件包clubear的计算结果。在这里,我们设定再抽样的样本量是n=10**4。这个样本量应该越大越好,但是不能大到影响计算速度。一个简单的规则是,在每次抽样的时间不超过(例如)1秒的情况下,样本量越大越好。我们这里的初步测试结果显示,n=10**4完全可以满足这个结果,请注意这已经是一个不小的样本量了。

图1.2:基于clubear再抽样算法获得的均值估计
请问如何确认再抽样的次数呢?答:不需要确认。给一个相对大一点点的数字,让程序跑去吧。很遗憾,纸面上没法呈现clubear能带给你的卓越体验。因此,强烈建议你下载安装该软件包(linux终端命令:pip install clubear),然后测试一下。你会看到标准误差SE,随着再抽样次数的增加,动态变化,并逐步降低。如果,人们认为10英里的精度就可以接受,那么你会发现迭代次数niter=10是绰绰有余的(对应的SE为:174.0/100=1.74)。最终获得的均值估计是多少呢?答:701.45英里(见图1.2)。这显然是一个带有再抽样误差的估计量,因为它跟全样本计算结果701.4英里(见图1.1)不一样。但是,差多少呢?不到1英里。对于实际决策有影响吗?我认为没有。但是,获得的体验好太多。因为,整个计算过程只需要3.0秒。跟全样本计算所需要的157秒(见图1.1)相比,这是一个157/3大概50倍的改善。这样的体验是不是更好?当然,这样体验的获得,是以精度的牺牲为代价的。相对于全样本分析而言,再抽样所产生的统计精度要差不小。但是,如图1.2展示,这样的精度可能对实际工作而言是完全足够了。
1.4、支撑再抽样算法的核心理论
通过上面的分享,我希望你能体验到再抽样算法带给你的卓越体验。面对一个没法一次性读入内存的大数据时,你不再恐惧害怕,取而代之的是很好的操控感,而如此卓越的操控感是以高效的再抽样算法,以及相关的统计学理论为支撑的。本节将对相关的统计学理论做一个高度概括的讨论。
请注意,任何一种统计分析本质上都是在计算各种统计量,并通过合理的图表呈现出来。而这些统计量中,绝大多数都是矩估计(或它的等价量)。常见的统计量(例如:样本均值、方差、最小二乘估计)都是矩估计。绝大多数模型的极大似然估计,也可以通过泰勒展开,被简单的矩估计近似,并因此有了极限分布理论。甚至,很多诞生于非光滑目标函数(例如:分位数回归)的估计量,其极限行为也可以被简单的矩估计近似。因此,矩估计是研究理解很多复杂统计学方法的一个不错起点,对于本文的再抽样方法而言,也是这样的。因此,接下来将通过一个简单的、非线性的矩估计,说明再抽样算法背后的统计学理论,并由此引申出关于再抽样样本量n和全样本量N之间的互动关系。
假设全样本为

,其中N是全样本的样本量。对于航空数据而言,N大概就是1.2亿,这是一个很大的数字。然后,通过合理的抽样方法(例如:有放回简单随机抽样),获得了一个再抽样样本(subsample),记为

,其中

标记的是第几次再抽样,假设每次再抽样的样本量为

。对于图1.2展示的案例而言

是1万(10**4)。假设对于每个样本

采集了一个变量

(例如:图1.2中的Distance变量),该变量的均值为

。对于航空数据Distance而言,这可不是我们在图1.1中看到的那个701.699。要知道701.699也是一个估计量(全样本均值)的一个具体实现。而

是该统计量的期望(或者无穷次实现后的均值)。再假设,人们感兴趣的参数是关于均值的一个非线性变换

,其中

是一个已知的可微可导的函数。请问应该如何估计

?如果可以对全样本做便捷的计算,最简单的估计量就是矩估计。具体而言,首先估计

的样本均值:

=

(例如:图1.1中的701.699),然后对

产生一个矩估计为:

。在假设一切良好技术条件(例如:有限二阶矩)成立的条件下,该矩估计可以通过下面的泰勒展开来近似:

其中

和

分别是

函数在

这一点的一阶导数和二阶导数。请注意,约等号的左边是矩估计,右边第一项是目标参数

,第二项是一个中心化的样本均值

,当然前面还被乘以了一个系数

。因此,第二项的均值为0,方差为

,其中

是

的方差。根据中心极限定律,该项的大样本分布应该接近正态。所有相关讨论说明,该项的大小大概为

。而正是因为第二项的存在,成就了矩估计

的极限正态性。值得重点讨论一下的是约等号右面的第三项。如果忽略前面的常数

,那么该项的大小主要受

影响。请注意这是一个非负的随机变量,因此它的大小可以通过它的期望刻画,即:

。这说明,该项的大小为

,这是一个比

要小很多的量。因此,第三项虽然存在,但是并不会影响矩估计

的极限性质,因此在传统的极限性质研究中都被忽略了。请注意,目前的讨论都是基于全样本

的。
接下来讨论基于再抽样子样本(subsample)的计算。可以将上面的计算重复一遍,但是不是对全样本

,而是对再抽样的子样本

。例如,可以基于第

个子样本重新计算

如下:

,并因此对目标参数

计算矩估计为:

,其泰勒展开为:

可以从理论上严格证明,之前关于

泰勒展开的所有讨论对

也都成立,唯一的区别是全样本量N变成了子样本量n。显然,子样本估计量

的精确度不如全样本估计量

,因为它们的收敛速度不相同。为了弥补这个缺陷,可以将来自不同子样本的估计量再做一个平均,整合获得一个更优质的估计量如下:

关于该估计量,首先一下它的方差。主要由上式约等号右侧的第二项决定。同单个的子样本估计

相比,这部分的方差会变得更小。如果再抽样的子样本n比N小很多,而且

不是很大,那么不同的子样本之间是几乎独立的。因此,被进一步平均后的估计量

会随着K的增加不断变小。一般情况下,无论

多大,

的方差都不可能比全样本估计量

更小,因为后者可能是理论上的最优估计。但是,可以严格证明,只要

足够大,再抽样估计量

的方差可以无限逼近全样本估计量

的方差。这说明什么?这说明从方差的角度看,再抽样估计可以做到与全样本估计量无限接近的程度,这是一个优良的性质。
但是,决定一个估计量精度的不仅仅有方差,还有偏差。因此,我们还需要研究一下

的期望同目标参数

的关系。你会发现,这主要由

泰勒展开中的第三项的期望决定,那就是:

一个非常令人遗憾的现象发生了。再抽样估计量

的偏差,跟再抽样的次数

之间毫无关系,不会随着再抽样次数

的增加而减小。这个结果并不令人意外,因为在给定全样本

的前提下,不同的子样本

是独立同分布生成的。那么,它们所产生的子样本估计量

是同分布的,共享相同的偏差。因此,最终平均后的偏差并不会随着再抽样次数

的增加而减小。这是一个令人感到遗憾的消息。
再仔细看一下,这个消息虽然不是啥好消息,但是也没有糟糕透顶,为什么?请注意最优估计量是全样本估计量

,它的收敛速度是

,而再抽样估计量

的偏差是

。因此,只要再抽样估计量

的偏差比全样本估计量

的标准差小很多,那么再抽样所产生的的偏差就是可忽略的。这就要求再抽样的样本量

最好要远远大于全样本量开根号,即

。这意味着什么呢?如果全样本量是

=100万,那么只要再抽样的子样本量

远远大于1000,再赋予一个足够大的

,那么再抽样所产生的的估计量的精度可以非常逼近全样本统计量的精度。如果全样本量是

=1亿,那么再抽样的子样本量

最好要远远大于10000。请问这个要求高吗?答:并不高,尤其考虑到计算机的性能还在不停的改进。
当然本节讨论的是最简单的估计量(矩估计),以及最简单的子样本估计量整合方法(简单平均)。在实际工作中,我们可能会碰到更复杂的估计量以及更精心设计的整合方法,它们的统计学性质需要重新研究探讨。但是有趣的是,在绝大多数常见情况下,这个关于

和

的规律都是成立的。只要再抽样的样本量

远大于全样本量开根号

,相关估计量的统计学性质可以无限接近全样本的最优估计量。这就构成了再抽样算法最核心的理论基础。
但是,这里需要再强调一点。上面的讨论是关于再抽样算法的理论性质。这些讨论说明,再抽样算法的大方向是正确的。而这些理论并不是要人们去追逐全样本的精度。对此,前面一节已经做了非常详细的讨论。对于绝大多数实际分析问题,全样本精度是没必要追求的。而且,如果通过再抽样算法获得全样本统计量一样的精度,事实上付出的计算成本更高(因为这要不小的

,以及非常大的

)。因此,上面的讨论仅仅是一个理论层面的讨论。面对真实的数据分析,再抽样算法的核心就是:牺牲不必要精度,节省宝贵时间。
1.5再抽样算法的建模框架
在了解再抽样算法的统计学理论基础后,再讨论一下建模分析的基本框架。为此,需要首先探讨一下,大规模数据分析和传统数据分析在计算体验上的核心区别。
还是以航空数据为例。假设该数据的样本量不大,只要1.2万,因此可以被轻松读入内存。读入内存后你很快能获得以下发现。第一、有的指标是定量的(例如:距离 Distance),而有的指标是定性的(例如:目标城市Dest)。第二、很多定量指标,有不少的缺失,或者不合理记录。为此,你可能需要把这些数据清理掉。第三、你还可以发现很多数据的分布是严重厚尾的(例如:延迟到达时间ArrDelay),其非中心化峰度(Kurtosis)可以高达20+,其简单的直方图如图1.3所示。对于这样的变量,你可能需要做一些必要的处理(例如:离散化),才能放心进入下一个分析流程。还有第四、第五,等等很多。当然,这都不是问题。毕竟样本量很小,只有1.2万。如此小样本的数据就像一锅水,体量太小了。你完全可以将其玩弄于股掌之间,反复倒腾,直到把这一锅水的所有问题全部解决掉,然后再下米做饭(建立模型)。对,这就是我们传统的数据分析方法,非常便捷。

图1.3:基于再抽样算法的直方图
但是,如果咱们将要处理的数据样本量不是1.2万,而是1.2亿。你面对的问题不是一锅水,而是一个大大的水池,湖泊,甚至。请问数据清理过程又该如何调整呢?是否还能直接跳到水里,把整个水库都清理干净?这是显然不可能的,或者可能但是成本极其高昂。大家从图1.1展示的案例就可以看到,像计算样本均值这样简单的工作,所消耗的计算成本都是如此高昂,更何况那些更复杂并且数目众多的数据清理操作。如此产生的时间成本太昂贵了,没人能够轻易承受。那应该怎么办呢?
面对这样的问题,传统的生活经验会给我们很多智慧。第一个智慧,也是最大的智慧就是:怀疑!我们真的需要一水库这么大的数据量吗?通过图1.2所展示的实验可以看到,答案是否定的。在绝大多数情况下,很可能一个池塘的水量就绰绰有余了。因此,第二个智慧来了。与其跳进水库去做清理工作(这是一个成本太高,甚至压根不可能的工作),不如在水库边上架设一个水泵(pump),根据需求量往外抽水。抽出来的水暂时存储在一个蓄水池(tank)里,作进一步加工处理。加工后的水,再做最后输出。因此,人们不需要对整个水库的水操心,但是需要精心设置水泵和蓄水池的各种参数。例如,应该对水泵的抽水量(subsample size)有一个合理设定。太大的抽水量会消耗太多时间,但是太小有可能达不到需要的精度,因此需要设置一个合理的抽水量。把抽出来的水暂时储存在一个蓄水池里。然后对蓄水池的水,做各种消毒措施(例如:清理异常值,产生新变量等),最后保证从蓄水池出来的水可以放心做饭,用于建模(model)。
你看,这就是我们再抽样方法建模的基本框架。分为三个环节:抽水(pump),蓄水(tank),做饭(model)。这三个阶段分别对应了clubear开源Python包的三个class:pump,tank,以及model。请你一定要深刻理解,这样有助于后面的代码学习。