bootstrap: 用于任意参数的普通非参数自举法

普通非参数自举法的一种实现,用于自举单个统计量(例如,均值、中位数、回归拟合的 R^2 等)。

from mlxtend.evaluate import bootstrap

概述

自举法通过从现有样本中有放回地抽取(或生成)新样本,提供了一种简单有效的方法来通过模拟估计统计量的分布。请注意,自举法不要求对样本统计量或数据集的正态分布做出任何假设。

使用自举法,我们可以估计样本统计量并计算均值的标准误差和置信区间,就好像我们从无限总体中抽取了许多样本一样。总而言之,自举过程可以描述如下:

  1. 有放回地抽取一个样本
  2. 计算样本统计量
  3. 重复步骤 1-2 n 次
  4. 计算标准差(统计量均值的标准误差)
  5. 计算置信区间

或者,简单来说,我们可以将自举法理解为通过对原始数据集进行重采样,从总体中抽取潜在无限数量(新)样本的一种方式。

请注意,“自举重复”(bootstrap replicate)一词在当前的文献中被使用得相当宽松;许多研究人员和实践者用它来定义我们从原始数据集中抽取的自举样本数量。然而,在本文档和代码注释的上下文中,我们使用自举重复的原始定义,并用它来指代从自举样本计算出的统计量。

参考文献

  • [1] Efron, Bradley, and Robert J. Tibshirani. An introduction to the bootstrap. CRC press, 1994. Management of Data (ACM SIGMOD '97), pages 265-276, 1997.

示例 1 -- 自举均值

这个简单的例子说明了如何对样本的均值进行自举。

import numpy as np
from mlxtend.evaluate import bootstrap


rng = np.random.RandomState(123)
x = rng.normal(loc=5., size=100)
original, std_err, ci_bounds = bootstrap(x, num_rounds=1000, func=np.mean, ci=0.95, seed=123)
print('Mean: %.2f, SE: +/- %.2f, CI95: [%.2f, %.2f]' % (original, 
                                                             std_err, 
                                                             ci_bounds[0],
                                                             ci_bounds[1]))
Mean: 5.03, SE: +/- 0.11, CI95: [4.80, 5.26]

示例 2 - 自举回归拟合

此示例说明了如何自举训练数据上的回归拟合的。

from mlxtend.data import autompg_data

from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score

X, y = autompg_data()


lr = LinearRegression()

def r2_fit(X, model=lr):
    x, y = X[:, 0].reshape(-1, 1), X[:, 1]
    pred = lr.fit(x, y).predict(x)
    return r2_score(y, pred)


original, std_err, ci_bounds = bootstrap(X, num_rounds=1000,
                                         func=r2_fit,
                                         ci=0.95,
                                         seed=123)
print('Mean: %.2f, SE: +/- %.2f, CI95: [%.2f, %.2f]' % (original, 
                                                             std_err, 
                                                             ci_bounds[0],
                                                             ci_bounds[1]))
Mean: 0.90, SE: +/- 0.01, CI95: [0.89, 0.92]

API

bootstrap(x, func, num_rounds=1000, ci=0.95, ddof=1, seed=None)

实现普通的非参数自举法

参数

  • x : NumPy 数组, 形状=(n_samples, [n_columns])

    一个一维或多维的数据记录数组

  • func :

    一个用于计算自举重复(从自举样本计算出的统计量)的统计量的函数。此函数必须返回一个标量值。例如,如果 x 是一个一维数组或向量,则 np.meannp.median 将是 func 的可接受参数。

  • num_rounds : 整型 (默认=1000)

    要抽取的自举样本数量,其中每个自举样本具有与原始数据集相同的记录数量。

  • ci : 整型 (默认=0.95)

    一个介于 (0, 1) 范围内的整数,表示计算置信区间的置信水平。例如,ci=0.95 (默认值) 将从自举重复计算 95% 的置信区间。

  • ddof : 整型

    计算标准误差时使用的自由度增量。

  • seed : 整型 或 None (默认=None)

    用于生成自举样本的随机种子。

返回值

  • original, standard_error, (lower_ci, upper_ci) : 元组

    返回原始样本的统计量 (original)、估计的标准误差以及相应的置信区间界限。

示例

>>> from mlxtend.evaluate import bootstrap
>>> rng = np.random.RandomState(123)
>>> x = rng.normal(loc=5., size=100)
>>> original, std_err, ci_bounds = bootstrap(x,
...                                          num_rounds=1000,
...                                          func=np.mean,
...                                          ci=0.95,
...                                          seed=123)
>>> print('Mean: %.2f, SE: +/- %.2f, CI95: [%.2f, %.2f]' % (original,
...                                                         std_err,
...                                                         ci_bounds[0],
...                                                         ci_bounds[1]))
Mean: 5.03, SE: +/- 0.11, CI95: [4.80, 5.26]
>>>

更多用法示例,请参阅 https://mlxtend.cn/mlxtend/user_guide/evaluate/bootstrap/