bootstrap自采样再理解

前言

本文要讨论的并非是Bootstrap工具包,而是统计学习中一种重采样(Resampling)技术。

下面引用的是谢益辉博士关于Bootstrap (和 Jackknife)基本思想的论述,希望能帮助读者对于Bootstrap 建立一个初步的认识:

在统计的世界,我们面临的总是只有样本,Where there is sample, there is uncertainty,正因为不确定性的存在,才使统计能够生生不息。传说统计学家、数学家和物理学家乘坐一列火车上旅行,路上看到草原上有一只黑羊,统计学家说,“基于这个样本来看,这片草原上所有的羊都是黑的”,数学家说,“只有眼前这只羊是黑的”,物理学家则说,“你们都不对,只有羊的这一面是黑的”。这是关于统计和其他学科的一个玩笑话,说明了统计的一些特征,比如基于样本推断总体。

一般情况下,总体永远都无法知道,我们能利用的只有样本,现在的问题是,样本该怎样利用呢?Bootstrap的奥义也就是:既然样本是抽出来的,那我何不从样本中再抽样(Resample)?Jackknife的奥义在于:既然样本是抽出来的,那我在作估计、推断的时候“扔掉”几个样本点看看效果如何?既然人们要质疑估计的稳定性,那么我们就用样本的样本去证明吧。

John Fox的那一系列附录中有一篇叫“Bootstrapping Regression Models”,当我看到第二页用方框框标出那句话时,我才对Bootstrap的思想真正有了了解(之前迷茫了很长时间)。Bootstrap的一般的抽样方式都是“有放回地全抽”(其实样本量也要视情况而定,不一定非要与原样本量相等),意思就是抽取的Bootstrap样本量与原样本相同,只是在抽样方式上采取有放回地抽,这样的抽样可以进行B次,每次都可以求一个相应的统计量/估计量,最后看看这个统计量的稳定性如何(用方差表示)。Jackknife的抽样痕迹不明显,但主旨也是取样本的样本,在作估计推断时,每次先排除一个或者多个样本点,然后用剩下的样本点求一个相应的统计量,最后也可以看统计量的稳定性如何。

在R中简单随机抽样的函数是sample(),其中有个参数replacement表示是否放回,经典的抽样基本都是不放回(replace = FALSE),而Bootstrap则是replace = TRUE;从FALSE到TRUE,小小的一个变化,孕育了Bootstrap的经典思想。

统计推断是从样本推断相应的总体, 有参数法和非参数法。早期的统计推断是以大样本为基础的。自从英国统计学家威廉·戈塞特(Willam Gosset)在1908年发现了t分布后,就开创了小样本的研究。费希尔(Fisher)在1920年提出了似然(likelihood)的概念,一直被认为是高效的统计推断思维方法。半个多世纪以来,这种思维一直占有主导地位,统计学家研究的主流就是如何将这种思维付诸实践,极大似然函数的求解是这一研究的关键问题。

介绍

英语Bootstrap的意思是靴带,来自短语:“pull oneself up by one′s bootstrap”,18世纪德国文学家拉斯伯(Rudolf Erich Raspe)的小说《巴龙历险记(或译为终极天将)》(Adventures of Baron Munchausen) 记述道:“巴龙掉到湖里沉到湖底,在他绝望的时候,他用自己靴子上的带子把自己拉了上来。”现意指不借助别人的力量,凭自己的努力,终于获得成功。在这里“bootstrap”法是指用原样本自身的数据抽样得出新的样本及统计量,根据其意现在普遍将其译为“自助法”。
它是一种有放回的抽样方法,它是非参数统计中一种重要的估计统计量方差进而进行区间估计的统计方法。其核心思想和基本步骤如下:
  (1) 采用重抽样技术从原始样本中抽取一定数量(自己给定)的样本,此过程允许重复抽样。
  (2) 根据抽出的样本计算给定的统计量T。
  (3) 重复上述N次(一般大于1000),得到N个统计量T。
  (4) 计算上述N个统计量T的样本方差,得到统计量的方差。
  应该说Bootstrap是现代统计学较为流行的一种统计方法,在小样本时效果很好。通过方差的估计可以构造置信区间等,其运用范围得到进一步延伸。

Jackknife: 和上面要介绍的Bootstrap功能类似,只是有一点细节不一样,即每次从样本中抽样时候只是去除几个样本(而不是抽样),就像小刀一样割去一部分。

用于random forest的数据采样

  1. 从原始样本库里随机产生一个样本。
  2. 放回到库中。
  3. 继续1;
    上述过程重复n次,产生了一个规模为n的数据集 X X

在随机森林中,我们会构建m个数据集,从而训练m个决策树,通过m个决策树来共同投票决定最终的结果。这就是重采样构建数据和投票机制来塑造的随机森林模型。

来个例子和代码

bootstrap自采样再理解_第1张图片
我们举个例子:假设我们的蓝色点代表男生;黄色点代表女生,我们想知道他们的比例是否大体相当。那么我们采用bootstrap的步骤则是:
1. 每次采样10个人,看男女比例。
2. 重复上述过程10000次,把每次的男女比例求平均,代表最终的男女比例。

代码

def scalegirl(samples):
    count =0.0
    total = samples.size
    for sex in samples:
        if(sex==0):
            count+=1.0
    print(count)
    return count/(total-count)

boy = (np.ones(1000))
girl = (np.zeros(800))

#girl/boy=0.8

print(girl.shape)
all = np.hstack((boy, girl))
scale = 0.0
iter = 10000
for i in range(iter):
    bootstrapSamples = resample(all,n_samples=100,replace=1)
    print(bootstrapSamples)
    tempscale = scalegirl(bootstrapSamples)
    print(tempscale)
    scale+=tempscale
print(scale/iter)
print(all)

》》0.815429978263103

总结

  1. 从上个例子中,我们可以看到,通过自采样的方法,从统计角度,得到的男女比例和真实的值非常接近。这也是自采样的本质所在。
  2. 这种看似简单的方法,对后来的很多技术都产生了深远的影响。机器学习中的Bagging,AdaBoost等方法其实都蕴含了Bootstrap的思想。因为里面既有部分到全体的模拟概念,还有统计的含义,还有投票的概念。
  3. 有时候我们无法得知真相,只有通过样本来推断。
  4. 当今计算机技术的高度发展,使统计研究及其应用跃上了一个新台阶。
  5. 这不仅提高了计算的速度,而且可以把统计学家从求解数学难题中释放出来,并逐渐形成一种面向应用的、基于大量计算的统计思维——模拟抽样统计推断, Bootstrap 法就是其中的一种。

简单而强大

Bootstrap方法最初由美国斯坦福大学统计学教授Efron在1977年提出。作为一种崭新的增广样本统计方法,Bootstrap方法为解决小规模子样试验评估问题提供了很好的思路。当初,Efron教授将他的论文投给了统计学领域的一流刊物《The Annals of Statistics》,但在被该刊接受之前,这篇后来被奉为扛鼎之作的文章曾经被杂志编辑毫不客气地拒绝过,理由是“太简单”。从某种角度来讲,这也是有道理的,Bootstrap的思想的确再简单不过,但后来大量的事实证明,这样一种简单的思想却给很多统计学理论带来了深远的影响,并为一些传统难题提供了有效的解决办法。Bootstrap方法提出之后的10年间,统计学家对它在各个领域的扩展和应用做了大量研究,到了20世纪90年代,这些成果被陆续呈现出来,而且论述更加全面、系统。

参考文献

http://scikit-learn.org/stable/modules/generated/sklearn.utils.resample.html
https://en.wikipedia.org/wiki/Bootstrapping_(statistics)

你可能感兴趣的:(算法,数据挖掘)