乐趣区

关于机器学习:带加权的贝叶斯自举法-Weighted-Bayesian-Bootstrap

在去年的文章中咱们介绍过 Bayesian Bootstrap,明天咱们来说说 Weighted Bayesian Bootstrap

Bayesian bootstrap

贝叶斯自举法(Bayesian bootstrap)是一种统计学办法,用于在不足先验常识的状况下对一个参数的散布进行预计。这种办法是基于贝叶斯统计学的思维,它应用贝叶斯公式来计算参数的后验散布。

在传统的非参数自举办法中,样本是从一个已知散布中抽取的,而后应用这些样本来预计这个散布的性质。然而,在理论问题中,咱们通常无奈取得这样的先验常识,因而须要应用其余办法来预计散布。

贝叶斯自举法是一种代替办法,它不须要先验常识,而是从样本中抽取子样本,而后应用这些子样本来构建一个后验散布。这个后验散布示意了给定这个样本,参数的可能取值。通过在这个散布上采样,能够产生相似于非参数自举的样本,而后能够应用这些样本来预计参数的性质。

与传统的自举办法相比,贝叶斯自举法能够提供更好的参数估计,特地是在样本较小或参数散布简单的状况下。

Python 实现

应用 numpy 和 scipy,咱们能够很容易实现 Bayesian bootstrap

 importnumpyasnp
 importscipy.statsasss
 
 
 classBayesianBootstrap:
 
     def__init__(self, concentration: float=1.):
         self.n_draws=100000
         self.bins=100
         self.concentration=concentration
 
     defsample(self, obs: np.ndarray, weights: np.ndarray=None):
 
         # If no weights passed, use uniform Dirichlet
         ifweightsisNone:
             weights=np.ones(len(obs))
 
         # Normalize weights to mean concentration
         weights=weights/weights.mean() *self.concentration
 
         # Sample posteriors
         draws=ss.dirichlet(weights).rvs(self.n_draws)
         means= (draws*obs).sum(axis=1)
         vars=draws* (obs-means.reshape(self.n_draws, 1)) **2
 
         returnmeans, np.sqrt(vars.sum(axis=1))
 
     defdistribution(self, obs: np.ndarray, weights: np.ndarray=None):
 
         # Sample and create distribution objects
         means, stds=self.sample(obs, weights)
         hist_mean=np.histogram(means, bins=self.bins)
         hist_std=np.histogram(stds, bins=self.bins)
 
         returnss.rv_histogram(hist_mean), ss.rv_histogram(hist_std)

.sample() 办法是这里的外围,该办法计算来自察看的后验样本的平均值和标准偏差。与经典的自举法相比即便对于十分大量的样本,因为应用了向量化的计算,所以不用放心速度问题。distribution() 函数是从样本直方图中返回 scipy 散布对象,这样咱们能够应用规范的 API 来计算任何后验统计信息。

咱们从正态分布中抽取一些样本 obs = ss.norm(0.1, 0.02).rvs(8),查看贝叶斯自举法是如何执行的。如下图所示,即便对于这个微型样本,后验也是平滑的,并且蕴含了均值和标准差的实在值。

左: 平均值和标准差的贝叶斯自举后验。右: 不同集中度的平均值标准偏差的收敛。

集中度(Concentration)

咱们始终说贝叶斯自举是非参数的,然而这里又呈现了一个集中度参数,这是什么呢?事实上,这一点常常被疏忽,当咱们的散布超过平均狄利克雷散布时,它对加权很重要,也就是说咱们的散布不是由一组平均的值参数化的。

并非所有的平均数组都是相等的,而是他们的规模很重要。这就是集中度所管制的。即便狄利克雷样本总是加起来等于 1,但标准差随着集中度的减少而减少。也就是说低集中度意味着样本值十分平均,而更高的集中度则将更多的权重调配给多数样本值,从而升高后验散布的方差。那么问题就来了,应该应用什么值来进行无偏参数不确定性预计呢?

个别状况下咱们都是默认应用 1,但在以前论文中也没有明确的共识。然而对咱们手头的问题,能够找到一个显著的基准。假如咱们想要预计样本的平均值。那么已知平均数的标准差大概为 σ / N^(1/2),其中 σ 是无偏样本标准差,N 是样本数。

上图(右)显示了不同集中度的标准差作为样本数量的函数的平均值。无偏样本预计在集中度 =0.5 和 1 之间平滑插值,随着 N 的减少收敛于后者。尽管这并不一定正确,然而因为咱们没有先验理由来更加自信或不自信地预计,所以应用此默认值仿佛是正当的。然而在多数样本状况下,贝叶斯自举法可能对均值适度自信。

散布预计

持续回到非参数估计,后验散布通知咱们,数据来自这种散布(其均值和标准差以这种形式散布的)。要理论建模根底散布自身,须要进行建模抉择,比方须要假如数据来自正态分布。scipy 提供了一种基于最大似然预计将散布拟合到样本中的疾速办法 ss.norm.fit(obs)。对于正态分布,只须要样本均值和标准差作为参数。

然而因为咱们的贝叶斯自举法参数估计也是散布,所以预计的不仅仅是一个独自的散布,而是一个散布族,如下图所示,每个可能的散布都是通过对均值和标准差后验进行采样失去的。随着样本数量的减少,散布族越来越靠近实在散布。

根本散布预计与样本数 N 的收敛性

加权

贝叶斯自举法通过将非均匀值的向量传递给狄利克雷散布来实现加权,每个值示意每个观测值的绝对权重。为了避免主导值偏差抽样,须要将它们归一化到所需的均匀集中度。

为了阐明这一点,咱们使加权的重要性更加通明,应用了具备显著刻度差别的固定数量的试验:

 rate_true=0.05
 trials=np.array([50, 100, 200, 500, 800, 1000, 1500])
 success=ss.binom.rvs(trials, rate_true)
 obs=success/trials

能够看到因为试验次数少而方差大,察看到的比率的平均值通常偏离实在比率,咱们能够通过将每个观测值的试验次数作为权重来思考方差的异质性。如下图所示,观测标记的大小反映了权重,加权预计比无权重预计更靠近实在率,并且具备更高的置信度。

左: 未加权预计。右: 试验加权预计。

咱们将试验胜利配对样本视为 beta 随机变量,咱们还能够在左图中绘制总 beta 散布,计算形式为将观测值相加:

 x=np.linspace(0, 0.1, 100)
 a=success.sum()
 b=trials.sum() -a
 beta_pdf=ss.beta(a, b).pdf(x)

这也提供了同样好的平均值预计。这种办法中的权重是隐式的,因为求和会主动地给较少数量的试验较少的权重。

下面咱们能够看到:权重的确是有用的。然而如果成功率随工夫变动呢?咱们可能无奈晓得以后的实在值,但能够对最近的观测值赋予更大的权重。

为了让状况变得更加简单,咱们假如成功率随工夫变动,试验次数也随之变动。例如,产品的季节性效应即需要忽然减少并导致更高的转化率:

 rates_true=np.linspace(0.05, 0.1, size)
 trials_mean=np.linspace(1000, 1200, size)
 trials=ss.norm(trials_mean, 200).rvs(10).astype(int)
 success=ss.binom.rvs(trials, rates_true)
 
 obs=success/trials
 time_weights=np.log2(np.linspace(1.1, 2, size))
 weights=trials*time_weights

如何调配工夫加权依赖于畛域常识和建模抉择。为了阐明加权,咱们抉择对数加权,因为它赋予最近的察看更多的权重,而后迅速衰减。咱们还像下面一样包含了试验加权。将它们传递给贝叶斯自举法显然会给出更好的(只管不完满)的预计,以后实在的转化率曾经从 0.05 回升到了 0.10,如下图所示。

总结

加权贝叶斯自举法是贝叶斯自举法的一种变体,其中观测值被赋予权重,反映它们在样本中的绝对重要性。权重用于从后验散布中进行抽样,具备较高权重的观测值被抽样更频繁。当数据存在异质性,可能会影响感兴趣的估计量时,例如某些观测值具备较大的方差或比其余观测值更近期时,这种办法尤其有用。

加权贝叶斯自举法能够以相似于规范贝叶斯自举法的形式实现,但权重应纳入到狄利克雷散布中。狄利克雷散布的集中度参数能够设置为归一化为一的权重。而后从贝叶斯自举法中取得的加权后验散布能够用于预计感兴趣的数量,例如平均值、中位数或方差。

在加权贝叶斯自举法中,权重能够依据具体问题的不同规范进行调配。例如,如果数据来自不同可靠性的起源,则能够调配反映每个起源可靠性的权重。如果数据是随工夫收集的,且存在工夫趋势,则能够将更高的权重调配给更近期的观测值(咱们例子中的 log)。

加权贝叶斯自举法是解决数据异质性和工夫趋势的弱小工具,并且能够提供比规范贝叶斯自举法更精确和准确的预计。贝叶斯自举法的灵活性来自于其应用狄利克雷先验,这使得它能够适应数据中不同的不确定性程度,并通过加权思考工夫变动。在不要求任何定量严谨性的状况下,如果:

  • 只有很少的数据
  • 关怀的是预计的不确定性
  • 要尽可能地放弃公正

贝叶斯自举法是一种有用的工具。然而如果有大量数据,则应用样本统计量就足够了,那就不必麻烦了。

https://avoid.overfit.cn/post/8bffb6de8f6b470d9399fd54be44bb97

退出移动版