自助法

自助法的原理

引用别人举得一个特别形象的例子来说明一下什么是自助法:

每周学一点统计学——自助法

 

一个池塘里面有很多鱼,到底有多少呢?有2000条,但我们并不知道?只有上帝和一个和池塘一样大的渔网才知道,但是我们不是上帝,也没有这样的渔网。于是,拿个大渔网,捞出100条鱼,做好标记,放回池塘里,让鱼游一晚上(shuffle操作),第二天,拿个小鱼网,每次捞一条鱼,捞出来后记录是否是头一天标记过的鱼,然后将鱼放回池塘,挪个地方继续捞,一共捞200条鱼,其中,标记鱼11条,第三天再捞200条,其中有标记的有9条,如此重复,分别捞出有标记的鱼10,8, 12, 13, 10, 9, 7, 10, 11, 12, 14, 11, 6, ...。各次捞出的有标记鱼的平均数为10, 那么,池塘里的鱼估计有200/(10/100), 为2000条。

每周学一点统计学——自助法

 

个人感觉这是对自助法很形象的解释。从这个例子可以看出,原本池塘里的鱼是总体,但是,我们没有办法知道总体的数量是多大,现在,目标是估计这个量。根据对总体有放回的重复多次抽样(每天捞200条,捞了又放回去),假设抽样100次(假设池塘里全部是鱼小姐,不会有新的鱼出身),那一共抽出过20000条鱼,这2万条鱼是新的总体,这个新的总体是可观察的。根据这个可观察量和感兴趣参数(标记鱼的数量)便可预计目标统计量(池塘中鱼的总数量)。

这里面有两个核心点:1. 原数据的总体并不大,每次抽样能反应总体的特性,并且多次抽样后能覆盖原总体,且抽样组成的新总体比原总体大。池塘里的鱼数据本身就少,如果换成大江大河,无论怎样重复抽样怕是都统计不了鱼的总数。2. 抽样方式采用有放回重抽样。自助法的核心点也是有放回的重复抽样。

自助法的过程:

  1. 抽取一个样本值,记录后放回到原总体中。
  2. 重复n次这样的抽样;
  3. 根据这n次抽样记录的值,计算此批抽样的感兴趣统计参数。
  4. 重复步骤1-3 r次。
  5. 计算r次感兴趣统计参数的标准误差,生成直方图,找到置信区间。

自助法的应用

这是统计学中抽样分布的概念。在周志华老师的《机器学习》中,模型评估介绍了三种方法:留出法、交叉验证以及自助法。

模型评估中的自助法依然使用于数据量较小的数据集。经常训练模型的同学们都知道,为了验证模型的性能,必须从标注数据集中划分一部分作为验证集,一旦拿到的标注数据集不够大,划分验证集后,训练模型用到的数据更少,训练效果可能受影响。前面提到,自助法抽样可上成比原数据集更大的数据集,这种扩大并没有对数据本身做增强,只是无形中根据数据的特性,让部分数据多次出现,部分数据可能不出现而已。

模型评估中,自助法的思路是这样的:原数据集D是一个包含m个样本的数据集,通过自助法有放回的重复抽样m次,每次抽取1个数据,放到D'中,D'中也有m个样本,同时,原来的数据集D中不被D'包含的数据作为验证集。到底会有多少数据作为验证集呢?周老师给出了原数据集D一次也未被抽中的数据的概率为:

每周学一点统计学——自助法

 

理论状态下,验证集为0.368*m条数据,这比5折交叉验证的比例还大一些。

从数据量来看,训练集的数据量和原数据集的数据量等大小,但是,在多次抽样过程中吗,数据的分布发生了改变,这使得训练数据和原数据不再是同分布了,也就意味着引入了偏差,所以,自助法做模型估计是有偏的了。

通过多次自助采样可生成不同的训练集,用不同的训练集训练多个模型,当需要预测的数据来了,分别输入多个模型进行预测,将每个预测结果作为候选结果,进行投票,选取票数最多的结果作为输出结果。这就是bagging, bootstrap aggregating的缩写,自助汇聚法。bagging和另一种方法boosting是常用的集成学习方法。


实践

实践1:数鱼:

程序如下:

import random
import numpy as np
pool = np.ones(2000) # 池塘里的2000条鱼
label_idxs = np.array(random.sample(list(range(0,2000)), 100)) # 随机抽取100条做标记
pool[label_idxs] = 2
pool = list(pool)
avg_err = 0
for k in range(10): #重复10次鱼总数计算
 # 抽样100次,每次有放回抽200条鱼
 labeled_fish_num = []
 sub_pool = []
 for i in range(100): #每次的总数计算的抽样次数为100
 for i in range(200):
 sub_pool.append(random.sample(pool, 1)[0])
 sub_pool = np.array(sub_pool)
 l = len(sub_pool[sub_pool==2])
 labeled_fish_num.append(l)
 sub_pool = []
 labeled_fish_num = np.array(labeled_fish_num)
 total_fish = 200*100/(labeled_fish_num.mean())
 print('鱼的总数:', total_fish, '误差为:', float(abs(total_fish-2000))/2000)
 avg_err += float(abs(total_fish-2000))/2000
avg_err = avg_err / 10
print('平均误差:', avg_err)yu

10次鱼总数计算的结果:

鱼的总数: 1949.3177387914232 误差为: 0.025341130604288425
鱼的总数: 1945.5252918287938 误差为: 0.027237354085603103
鱼的总数: 1996.0079840319363 误差为: 0.0019960079840318484
鱼的总数: 1984.126984126984 误差为: 0.007936507936507952
鱼的总数: 2008.032128514056 误差为: 0.004016064257028006
鱼的总数: 1921.2295869356387 误差为: 0.03938520653218063
鱼的总数: 2066.115702479339 误差为: 0.03305785123966939
鱼的总数: 1968.503937007874 误差为: 0.01574803149606305
鱼的总数: 1960.7843137254904 误差为: 0.019607843137254805
鱼的总数: 1986.0973187686195 误差为: 0.006951340615690242
平均误差: 0.018127733788831746

10次的平均误差为0.018128,最大误差为0.03938。将每次计算的抽样次数从100次扩大到1000次后平均误差为0.0084757,最大误差为0.0178117。

实践2:自助法抽取训练样本和验证样本

程序:

dev_avg = 0
for i in range(10): #重复10次试验
 data_idxs = list(range(20000)) #假设全数据有20000条
 train_idxs = []
 for i in range(20000):
 train_idxs.append(random.sample(data_idxs, 1)[0]) #抽取训练样本
 dev_idxs = set(data_idxs) - set(train_idxs) #生成验证样本
 print('训练样本的覆盖量:', len(set(train_idxs)), '验证样本的覆盖量', len(dev_idxs))
 dev_avg += len(dev_idxs)
dev_avg = dev_avg / float(10)
print('验证样本平均覆盖度:', dev_avg/20000)

运行后结果为:

训练样本的覆盖量: 12582 验证样本的覆盖量 7418
训练样本的覆盖量: 12591 验证样本的覆盖量 7409
训练样本的覆盖量: 12671 验证样本的覆盖量 7329
训练样本的覆盖量: 12664 验证样本的覆盖量 7336
训练样本的覆盖量: 12739 验证样本的覆盖量 7261
训练样本的覆盖量: 12651 验证样本的覆盖量 7349
训练样本的覆盖量: 12657 验证样本的覆盖量 7343
训练样本的覆盖量: 12622 验证样本的覆盖量 7378
训练样本的覆盖量: 12516 验证样本的覆盖量 7484
训练样本的覆盖量: 12552 验证样本的覆盖量 7448
验证样本平均覆盖度: 0.368775

总数据从20000换成200000条后,验证样本对总体的覆盖率更接近0.368。

好了,自助法就唠叨到这儿了。

  • 13
    点赞
  • 80
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sklearn自助法是一种在机器学习中常用的非参数统计方法,用于解决样本不平衡和过拟合问题。它的全称是Bootstrap,是基于自助采样(bootstrap sampling)的一种技术。 在使用Sklearn自助法时,我们首先从原始数据集中进行有放回地随机抽样,形成一个与原始数据集大小相同的新数据集,该数据集称为自助样本(bootstrap sample)。由于是有放回地抽样,因此原始数据集中的一些样本可能被多次抽到,而一些样本可能没有被抽到。 通过重复这个自助采样的过程,我们可以得到多个不同的自助样本。然后,我们可以针对每个自助样本训练一个模型,并得到对应的预测结果。最后,我们可以通过对这些预测结果进行聚合,例如取平均值或投票等方式,来得到最终的预测结果。 Sklearn中的BaggingRegressor和BaggingClassifier就是使用了自助法的集成学习方法。它们通过并行地训练多个基模型,并使用自助法来生成不同的训练数据集,以提高模型的稳定性和泛化能力。 使用Sklearn自助法可以有效地减小模型的方差,并且能够应对样本不平衡和过拟合等问题。然而,自助法也会引入一定的偏差,因为一些样本可能在自助样本中被多次抽到,而另一些样本则没有被抽到。 总的来说,Sklearn自助法是一种强大的工具,可以用于改善模型的性能,特别是在处理样本不平衡和过拟合问题时。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值