bootstrap: 普通非参数自助法用于任意参数
普通非参数自助法的实现,用于对单个统计量进行自助抽样(例如,均值、中位数、回归拟合的R^2等)。
> `from mlxtend.evaluate import bootstrap`
概述
自助法提供了一种简单有效的方式,通过模拟来估计统计量的分布,通过从现有样本中重复抽样(或生成)新样本。请注意,自助法并不需要对样本统计量或数据集的正态分布做出任何假设。
使用自助法,我们可以估计样本统计量并计算均值的标准误差和置信区间,仿佛我们是从一个无限总体中提取了多个样本。简单来说,自助法过程可以描述如下:
- 进行有放回的抽样
- 计算样本统计量
- 重复步骤1-2 n 次
- 计算标准差(统计量的均值标准误差)
- 计算置信区间
或者,简单地说,我们可以将自助法视为通过对原始数据集进行重抽样,从一个总体中提取潜在的无尽数量的新样本。
请注意,当前文献中“自助法重抽样”的术语使用得相当宽松;许多研究人员和从业者用它来定义我们从原始数据集中提取的自助法样本的数量。然而,在本文件和代码注释的上下文中,我们使用自助法重抽样的原始定义,并用其指代从自助法样本计算出的统计量。
参考文献
- [1] Efron, Bradley, 和 Robert J. Tibshirani. 引导法导论. CRC 出版社, 1994. 数据管理 (ACM SIGMOD '97), 页码 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 - 引导回归拟合
这个例子展示了如何在训练数据上引导回归拟合的 $R^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)
Implements the ordinary nonparametric bootstrap
Parameters
-
x
: NumPy array, shape=(n_samples, [n_columns])An one or multidimensional array of data records
-
func
:A function which computes a statistic that is used to compute the bootstrap replicates (the statistic computed from the bootstrap samples). This function must return a scalar value. For example,
np.mean
ornp.median
would be an acceptable argument forfunc
ifx
is a 1-dimensional array or vector. -
num_rounds
: int (default=1000)The number of bootstrap samnples to draw where each bootstrap sample has the same number of records as the original dataset.
-
ci
: int (default=0.95)An integer in the range (0, 1) that represents the confidence level for computing the confidence interval. For example,
ci=0.95
(default) will compute the 95% confidence interval from the bootstrap replicates. -
ddof
: intThe delta degrees of freedom used when computing the standard error.
-
seed
: int or None (default=None)Random seed for generating bootstrap samples.
Returns
-
original, standard_error, (lower_ci, upper_ci)
: tupleReturns the statistic of the original sample (
original
), the standard error of the estimate, and the respective confidence interval bounds.
Examples
>>> 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]
>>>
For more usage examples, please see https://rasbt.github.io/mlxtend/user_guide/evaluate/bootstrap/