Bootstrapping 算法



自助法 (自举法)


我们的项目并不总是有充足的数据。通常,我们只有一个样本数据集可供使用,由于缺乏资源我们无法执行重复实验 (例如A/B测试)。


幸运的是,我们有重采样的方法来充分利用我们所拥有的数据。自举法(Bootstrapping)是一种重采样技术,可以为我们解决这个问题。


Bootstrapping 算法,指的就是利用有限的样本经由多次重复抽样,重新建立起足以代表母体样本分布的新样本,在机器学习中解决了样本不足的问题。

bootstrapping 的运用基于很多统计学假设,因此采样的准确性会影响假设的成立与否。


中文名
Bootstrapping算法
应用学科
统计学
优    点
简单易于操作
缺    点
假设的成立与否影响采样的准确性




统计学中,bootstrapping 可以指依赖于重置随机抽样的一切试验。bootstrapping 可以用于计算样本估计的准确性。对于一个采样,我们只能计算出某个统计量(例如均值)的一个取值,无法知道均值统计量的分布情况。但是通过自助法(自举法)我们可以模拟出均值统计量的近似分布。有了分布很多事情就可以做了(比如说有你推出的结果来进而推测实际总体的情况)。

bootstrapping 方法的实现很简单,假设抽取的样本大小为 n:

在原样本中有放回的抽样,抽取 n 次。每抽一次形成一个新的样本,重复操作,形成很多新样本,通过这些样本就可以计算出样本的一个分布。新样本的数量通常是 1000-10000。如果计算成本很小,或者对精度要求比较高,就增加新样本的数量。

  • 优点:简单易于操作。
  • 缺点:bootstrapping 的运用基于很多统计学假设,因此假设的成立与否会影响采样的准确性。




自助法在数据集较小、难以有效划分训练/测试集时很有用,将多次随机抽样作为训练集,将初始数据作为测试集。


自举法的快速回顾

自举法的目标是基于从原始样本中获得的多个数据样本,为总体参数(例如总体均值 θ)创建一个估计值(例如样本均值 x̄)。

自举法 是通过重复采样(替换)样本数据集来创建许多模拟样本来完成的。 每个模拟的样本被用来计算参数的估计,然后这些估计被组合起来形成一个抽样分布。

然后,自举抽样分布允许我们得出统计推论,如估计参数的标准误差。



为什么自举法是有效的?

你一定想知道,重复采样同一个样本数据集的行为怎么能让我们对总体统计数据做出推论呢?


理想情况下,我们希望从真实的总体中提取多个独立的真实样本以理解总体统计数据。然而我们已经确定,这可能并不总是可行的。因此我们必须使用样本数据集,这是我们拥有的关于总体的最好(也是唯一)信息。


自举法合理的假设是,大多数样本(如果是随机抽取的)将看起来与它们的总体非常相似。这意味着我们的样本数据可以被视为一个总体,我们现在假装它代表真实的总体(一定要记住这一点)。


有了这个假设群体,我们可以从中抽取多个(自举)随机样本。这就好像我们从真实总体中获得了多个样本。


注: 实际上,原始样本只是真实总体中的一个样本。


由于允许进行置换抽样,所以自举的样本也可以看作是在不同方法和假设下产生的随机样本。


从这些自举样本中汇总的抽样信息最终将帮助我们获得(相对)准确的总体参数估计值,例如总体均值。



案例


假定盒子中有蓝、黄共 n 个小球,自助样本可按如下步骤获得:


  • 1. 从盒中随机抽取一个小球并记录其颜色;
  • 2. 把小球放入盒中;
  • 3. 混匀。再随机抽取一个小球,记下其颜色;
  • 4. 放回盒子中,混匀,重新抽取;
  • 5. 重复步骤③和④ n 次,便可得到一个自助样本。重复上述抽样过程 M 次,便可得到 M 个自助样本。



我们举个例子:假设我们想知道蓝球和黄球的比例是否大体相当。那么我们采用 bootstrapping 的步骤则是:

  • 1. 每次采样 100 个球
  • 2. 重复上述过程 10000 次,把每次的蓝、黄球比例求平均,代表最终的蓝、黄球比例


import numpy as np  
from sklearn.utils import resample  

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

blue = (np.ones(1000))  
yellow = (np.zeros(800))  

# yellow/blue=0.8  

all = np.hstack((blue, yellow))  
scale = 0.0  
iter = 10000  
for i in range(iter):  
    bootstrapSamples = resample(all, n_samples=100, replace=1)  
    # print(bootstrapSamples)  
    tempscale = scaleyellow(bootstrapSamples)  
    scale += tempscale  
print(scale / iter)  

>>>0.8133598040468601


总结

  • 从上个例子中,我们可以看到,通过自采样的方法,从统计角度,得到的蓝、黄球比例和真实的值非常接近。
  • 有时候我们无法得知真相,只有通过样本来推断。
  • 当今计算机技术的高度发展,使统计研究及其应用跃上了一个新台阶。
  • 这不仅提高了计算的速度,而且可以把统计学家从求解数学难题中释放出来,并逐渐形成一种面向应用的、基于大量计算的统计思维——模拟抽样统计推断, Bootstrap 法就是其中的一种。






reference

https://zhuanlan.zhihu.com/p/107978939

https://baike.baidu.com/item/Bootstrapping%E7%AE%97%E6%B3%95/5017514