利⽤Python实现Bootstrap采样
"""
1、Bootstrap采样为什么使用bootstrap?
利⽤有限的样本经由有放回的多次重复抽样,建⽴起充⾜的样本,解决了样本不⾜的问题。
Bootstrap是⾮参数统计⽅法,其实质是对观测信息进⾏再抽样,进⽽对总体的分布特性进⾏统计推断。
2、步骤
它是⼀种有放回的抽样⽅法,它是⾮参数统计中⼀种重要的估计统计量⽅差进⽽进⾏区间估计的统计⽅法。其核⼼思想和基本步骤如下:
1.采⽤重抽样技术从原始样本中抽取⼀定数量(⾃⼰给定)的样本,此过程允许重复抽样
2.根据抽出的样本计算给定的统计量T。
3.重复上述N次(⼀般⼤于1000),得到N个统计量T。
4.计算上述N个统计量T的样本⽅差,得到统计量的⽅差。
同理,可以估计总体的均值等其余统计量
3、为什么要进⾏Bootstrap采样
数据集较⼩时是不错的选择。⾃助法在数据集较⼩、难以有效划分训练集和测试集时很有⽤;将多次随机抽样得到的样本作为训练集,将初始数据作为测试集。对集成学习⽅法有帮助。此外,⾃助法能从初始数据集中产⽣多个不同的训练集,这对集成学习等⽅法有很⼤的好处。
稳健性和效率⾼。该⽅法充分利⽤了给定的观测信息,不需要模型其他的假设和增加新的观测,并且具有稳健性和效率⾼的特点
但会引⼊估计偏差。然⽽,⾃助法产⽣的数据集改变了初始数据集的分布,这会引⼊估计偏差。因此,在初始数据量⾜够时,留出法和交叉验证法更常⽤⼀些。"""
import numpy as np
from sklearn.utils import resample
"""
假设我们总体中有⼀部分⼥⽣,⼀部分男⽣,我们想知道他们的⽐例是否⼤体相当。那么我们采⽤bootstrap的步骤则是:
每次采样10个⼈,看男⼥⽐例。
重复上述过程10000次,把每次的男⼥⽐例求平均,代表最终的男⼥⽐例。
"""
def scalegirl(samples):
'''
:param samples:代表每次采样的数组
:return:统计抽样结果中:⼥性/男性⽐例值
'''
count = 0.0 # 0代表⼥性
total = samples.size
for sex in samples:
if (sex == 0):
count += 1.0
return count / (total - count)
# 构建boy样本与girl样本
boy = (np.ones(1000)) # 长度为1000的数组
girl = (np.zeros(800))
# 合并为总样本
all = np.hstack((boy, girl)) # ⽔平按列堆叠数组,将代表boy和girl的数组合并到⼀起
print("总样本个数为{}".format(len(all)))
print("样本男⼥⽐例为{}".format(len(girl)/len(boy)))
scale = 0.0
iter = 10000 # 重复采样10000次
for i in range(iter):
bootstrapSamples = resample(all, n_samples=100, replace=1) # n_samples要⽣成的样本数,每次采样100⼈,返回长度为100的数组 tempscale = scalegirl(bootstrapSamples) # 调⽤函数,返回每次采样的⼥性/男性⽐例值
scale += tempscale
print("使⽤bootstrap采样估计的男⼥⽐列为{}".format(scale / iter)) # 计算10000次的平均⼥/男
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论