引导中的 .632+ 规则是什么?

机器算法验证 引导程序
2022-01-22 21:38:11

这里@gung 引用了 .632+ 规则。快速的 Google 搜索并不能得到一个易于理解的答案,即该规则的含义以及使用它的目的。有人能解释一下 .632+ 规则吗?

4个回答

我将得到 0.632 估计器,但这将是一个有点长的发展:

假设我们想使用函数 $f$ 预测 $Y$ 和 $X$,其中 $f$ 可能取决于使用数据 $(\mathbf{Y}, \mathbf{X})$ 估计的一些参数,例如 $f(\mathbf{X}) = \mathbf{X}\mathbf{\beta}$

一个简单的预测误差估计是 $$\overline{err} = \dfrac{1}{N}\sum_{i=1}^NL(y_i,f(x_i))$$ 其中 $L$ 是一些损失函数,例如平方误差损失。这通常被称为训练错误。埃夫隆等人。称之为明显错误率或重新替换率。这不是很好,因为我们使用我们的数据 $(x_i,y_i)$ 来拟合 $f$。这导致 $\overline{err}$ 向下偏差。您想知道您的模型 $f$ 在预测新值方面的效果如何。

我们经常使用交叉验证作为一种简单的方法来估计预期的额外样本预测误差(我们的模型对不在我们训练集中的数据的表现如何?)。$$Err = \text{E}\left[ L(Y, f(X))\right]$$

一种流行的方法是进行$K$-fold 交叉验证。将您的数据分成$K$ 组(例如10 个)。对于每组 $k$,将您的模型拟合到剩余的 $K-1$ 组并在第 $k$ 组上对其进行测试。我们交叉验证的额外样本预测误差只是平均 $$Err_{CV} = \dfrac{1}{N}\sum_{i=1}^NL(y_i, f_{-\kappa(i)}( x_i))$$ 其中 $\kappa$ 是一些索引函数,指示分配观察 $i$ 的分区,$f_{-\kappa(i)}(x_i)$ 是 $x_i$ 的预测值,使用数据不在 $\kappa(i)$th 集合中。

当$K=N$ 时,该估计器对真实预测误差近似无偏,并且具有较大的方差,并且对于较大的$K$,计算成本更高。因此,我们再次看到了偏差-方差权衡在起作用。

我们可以使用引导程序来估计额外样本预测误差,而不是交叉验证。自举重采样可用于估计任何统计量的采样分布。如果我们的训练数据是 $\mathbf{X} = (x_1,\ldots,x_N)$,那么我们可以考虑从这个集合 $\mathbf{Z}_1,\ldots 中获取 $B$ 引导样本(有替换) ,\mathbf{Z}_B$ 其中每个 $\mathbf{Z}_i$ 是一组 $N$ 个样本。现在我们可以使用我们的引导样本来估计额外样本预测误差: $$Err_{boot} = \dfrac{1}{B}\sum_{b=1}^B\dfrac{1}{N}\sum_{ i=1}^NL(y_i, f_b(x_i))$$ 其中 $f_b(x_i)$ 是模型拟合到第 $b$ 个引导数据集的 $x_i$ 处的预测值。不幸的是,这不是一个特别好的估计器,因为用于生成 $f_b(x_i)$ 的引导样本可能包含 $x_i$。leave-one-out bootstrap estimator 通过模仿交叉验证来提供改进,定义为: $$Err_{boot(1)} = \dfrac{1}{N}\sum_{i=1}^N\dfrac {1}{|C^{-i}|}\sum_{b\in C^{-i}}L(y_i,f_b(x_i))$$ 其中 $C^{-i}$ 是不包含观察 $i$ 的引导样本的索引,$|C^{-i}|$ 是此类样本的数量。$Err_{boot(1)}$ 解决了过拟合的问题,但是还是有偏差的(这个是上偏的)。偏差是由于带放回抽样导致的 bootstrap 样本中的非明显观察结果。每个样本中不同观察值的平均数量约为 0.632N$(请参阅此答案以了解原因 f_b(x_i))$$ 其中 $C^{-i}$ 是不包含观察 $i$ 的引导样本的索引集,$|C^{-i}|$ 是这样的数量样品。$Err_{boot(1)}$ 解决了过拟合的问题,但是还是有偏差的(这个是上偏的)。偏差是由于带放回抽样导致的 bootstrap 样本中的非明显观察结果。每个样本中不同观察值的平均数量约为 0.632N$(请参阅此答案以了解原因 f_b(x_i))$$ 其中 $C^{-i}$ 是不包含观察 $i$ 的引导样本的索引集,$|C^{-i}|$ 是这样的数量样品。$Err_{boot(1)}$ 解决了过拟合的问题,但是还是有偏差的(这个是上偏的)。偏差是由于带放回抽样导致的 bootstrap 样本中的非明显观察结果。每个样本中不同观察值的平均数量约为 0.632N$(请参阅此答案以了解原因为什么每个 bootstrap 样本平均包含大约三分之二的观察值?)。为了解决偏差问题,Efron 和 Tibshirani 提出了 0.632 估计量:$$ Err_{.632} = 0.368\overline{err} + 0.632Err_{boot(1)}$$ 其中 $$\overline{err} = \dfrac {1}{N}\sum_{i=1}^NL(y_i,f(x_i))$$ 是对预测误差的天真估计,通常称为训练误差。这个想法是平均一个向下偏向的估计和一个向上偏向的估计。

但是,如果我们有一个高度过拟合的预测函数(即 $\overline{err}=0$),那么即使是 0.632 估计量也会向下偏。.632+ 估计器被设计为在 $\overline{err}$ 和 $Err_{boot(1)}$ 之间进行较小偏向的折衷。$$ Err_{.632+} = (1 - w) \overline{err} + w Err_{boot(1)} $$ with $$w = \dfrac{0.632}{1 - 0.368R} \quad\text {and}\quad R = \dfrac{Err_{boot(1)} - \overline{err}}{\gamma - \overline{err}} $$ 其中 $\gamma$ 是估计的无信息错误率通过评估目标 $y_i$ 和预测变量 $x_i$ 的所有可能组合的预测模型。

$$\gamma = \dfrac{1}{N^2}\sum_{i=1}^N\sum_{j=1}^NL(y_i, f(x_j))$$。

这里 $R$ 衡量相对过拟合率。如果没有过拟合(R=0,当 $Err_{boot(1)} = \overline{err}$)这等于 .632 估计量。

您将在本文第1部分的第 3 部分中找到更多信息但总而言之,如果您将 $S$ 称为来自 $\{1:n\}$ 的 $n$ 个数字的样本,随机抽取并替换,$S$ 平均包含大约 $(1-e^{-1} )\,n \约 0.63212056\, n$ 个唯一元素。

推理如下。我们通过从 $\{1:n\}$ 中抽样 $i=1,\ldots,n$ 次(随机和替换)来填充 $S=\{s_1,\ldots,s_n\}$。考虑一个特定的索引 $m\in\{1:n\}$。

然后:

$$P(s_i=m)=1/n$$

$$P(s_i\neq m)=1-1/n$$

这是真的 $\forall 1\leq i \leq n$ (直观地说,因为我们用放回抽样,概率不依赖于 $i$)

因此

$$P(m\in S)=1-P(m\notin S)=1-P(\cap_{i=1}^n s_i\neq m)\\ \;\;\;\;\; \;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\;\; \;\;\;\;=1-\prod_{i=1}^n P(s_i\neq m)=1-(1-1/n)^n\约1-e^{-1}$ $

您还可以进行这个小模拟来凭经验检查近似值的质量(取决于 $n$):

n <- 100
fx01 <- function(ll,n){
    a1 <- sample(1:n, n, replace=TRUE)
    length(unique(a1))/n
}
b1 <- c(lapply(1:1000,fx01,n=100), recursive=TRUE)
mean(b1)

1. Bradley Efron 和 Robert Tibshirani (1997)。交叉验证的改进:.632+ Bootstrap 方法美国统计协会杂志,卷。92,第 438 期,第 548--560 页。

根据我的经验,主要基于模拟,仅由于使用不正确的准确性评分规则(即正确“分类”的比例)导致的严重问题,才需要 0.632 和 0.632+ 引导变量。当您使用正确(例如,基于偏差或 Brier 分数)或半正确(例如,$c$-index = AUROC)评分规则时,标准的 Efron-Gong 乐观引导程序工作得很好。

这些答案非常有用。我找不到用数学证明它的方法,所以我写了一些 Python 代码,虽然效果很好:

    from numpy import mean
    from numpy.random import choice

    N = 3000

    variables = range(N)

    num_loop = 1000
    # Proportion of remaining variables
    p_var = []

    for i in range(num_loop):
        set_var = set(choice(variables, N))
        p=len(set_var)/float(N)
        if i%50==0:
            print "value for ", i, " iteration ", "p = ",p
        p_var.append(p)

    print "Estimator of the proportion of remaining variables, ", mean(p_var)