ブートストラップの.632+ルールとは何ですか?


107

ここで、 @ gungは.632+ルールを参照します。Googleで簡単に検索しても、このルールの意味と使用目的について理解しやすい答えは得られません。誰かが.632+ルールを解明していただけますか?

回答:


115

0.632エスティメータに到達しますが、やや長い開発になります。

我々が予測したいとしとX機能の使用F、fはデータを用いて推定されているいくつかのパラメータに依存してもよい(Y、Xを)、例えば、F (X)= X βYXff(Y,X)f(X)=Xβ

予測誤差のナイーブ推定値であるここで、Lは何らかの損失関数、たとえば二乗誤差損失です。これはよくトレーニングエラーと呼ばれます。エフロン等。見かけのエラー率または再置換率と呼びます。データ(xi、yi)を使用してfを近似するため、あまり良くありません。これがもたらす¯のERのRが下方に付勢されています。モデルfが新しい値を予測する上でどれだけうまく機能しているかを知りたい。

err¯=1N∑i=1NL(yi,f(xi))
L(xi,yi)ferr¯f

多くの場合、予想されるサンプル外予測誤差を推定する簡単な方法として相互検証を使用します(トレーニングセットにないデータに対してモデルはどの程度うまく機能しますか?)。

Err=E[L(Y,f(X))]

これを行う一般的な方法は、分割交差検定を行うことです。データをK個のグループ(10個など)に分割します。各グループkについて、モデルを残りのK − 1グループに適合させ、k番目のグループでテストします。クロス検証された追加サンプル予測誤差は、平均E r r C V = 1です。KKkK−1kκはその観察にパーティションを示し、いくつかの指標関数であり、Iが割り当てられ、fは-κ(I)(Xiは)でありますκ(i)番目のセットにないデータを使用したxiの予測値。

ErrCV=1N∑i=1NL(yi,f−κ(i)(xi))
κif−κ(i)(xi)xiκ(i)

K=NK

交差検証の代わりに、ブートストラップを使用して、サンプル外の予測誤差を推定できます。ブートストラップのリサンプリングを使用して、統計のサンプリング分布を推定できます。トレーニングデータがである場合、このセットZ 1、… 、Z BからBブートストラップサンプル(置換)を取得することを考えることができます。各Z iはNサンプルのセットです。これで、ブートストラップサンプルを使用して、サンプル外の予測誤差を推定できます。E r r bX=(x1,…,xN)BZ1,…,ZBZiNここで、fb(xi)は、モデルからb番目のブートストラップデータセットに適合するxiでの予測値です。残念なことに、fb(xi)の生成に使用されるブートストラップサンプルにはxiが含まれている可能性があるため、これは特に良い推定量ではありません。

Errboot=1B∑b=1B1N∑i=1NL(yi,fb(xi))
fb(xi)xibfb(xi)xi。leave-one-outブートストラップ推定器は、交差検証を模倣することにより改善を提供し、次のように定義されます:C-iは観測を含まないブートストラップサンプルのインデックスの集合であるIを、そして| C−i| そのようなサンプルの数です。Eのr個のRBOOT(1)
Errboot(1)=1N∑i=1N1|C−i|∑b∈C−iL(yi,fb(xi))
C−ii|C−i|Errboot(1)はオーバーフィットの問題を解決しますが、まだバイアスがかかっています(これは上にバイアスがかかっています)。バイアスは、置換を伴うサンプリングから生じるブートストラップサンプルの不明瞭な観察によるものです。各サンプルの個別の観測値の平均数は約(なぜ、各ブートストラップサンプルに観測値の約3分の2が含まれているのかについての説明は、この回答を参照してください)。:バイアスの問題を解決するために、エフロンとTibshiraniは0.632推定提案 E R R 0.632 = 0.368 ¯ のE RをR + 0.632 のE RをR B O O Tを(0.632Nここで、 ¯ E 、R 、R = 1
Err.632=0.368err¯+0.632Errboot(1)
は、トレーニングエラーと呼ばれる予測エラーの単純な推定値です。考え方は、下方に偏った推定値と上方に偏った推定値を平均することです。
err¯=1N∑i=1NL(yi,f(xi))

err¯=0err¯Errboot(1)

Err.632+=(1−w)err¯+wErrboot(1)
w=0.6321−0.368RandR=Errboot(1)−err¯γ−err¯
γyixi

γ=1N2∑i=1N∑j=1NL(yi,f(xj))

RErrboot(1)=err¯


2
@rpierceは良い質問ですが、このスレッドの中心的なトピックからやや離れています。CVの組織的には、新しいスレッドに入れておくとよいでしょう。そうすれば、その情報を後で見つけて利用するのが簡単になります。
— GUNG



1
err¯=1N∑i=1NL(yi,f(xi))1n∑i=1n(yi−y^i)2

1
@rpierce、はい!私はいくつかのクラスノートからこの資料の多くをリサイクルしていたため、少し一般的でした。
— bdeonovic

53

Sn{1:n}S(1−e−1)n≈0.63212056n

S={s1,…,sn}i=1,…,n{1:n}m∈{1:n}

次に:

P(si=m)=1/n

そして

P(si≠m)=1−1/n

∀1≤i≤ni

副<文>この[前述の事実の]結果として、それ故に、従って、だから◆【同】consequently; therefore <文>このような方法で、このようにして、こんなふうに、上に述べたように◆【同】in this manner <文>そのような程度まで<文> AひいてはB◆【用法】A and thus B <文>例えば◆【同】for example; as an example

P(m∈S)=1−P(m∉S)=1−P(∩i=1nsi≠m)=1−∏i=1nP(si≠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+ブートストラップメソッド。Journal of the American Statistical Association、Vol。92、No. 438、pp。548--560。


3
ここで参照であなたのためのドキュメントがある- stat.washington.edu/courses/stat527/s14/readings/...

1
(x1,…,xn)S1,…,SnP(Si=k)=1nI{1,…,n}(k)P(∪i=1n{Si=k})=1−P(∩i=1n{Si≠k})=1−∏i=1nP{Si≠k}=1−(1−1/n)n→1−1/e≈63.21%

4
1−e−1≈0.63212056

1
この答えも素晴らしいです。実際、受け入れられた答えとこの答えは、実際に私の質問に対する完全な答えを提供します。それは言われている-私は本当に両方を受け入れることが可能であったことを望みます。
— ラッセルピアス

1
@rpierce:セリーヌ・ディオンの言葉を引用すると、「昔の物語 /韻のような歌/美女と野獣」。:P
— ニックストーナー

8

c


3
ここでフランクが言ったことのほとんどは理解できないと思います。はっきりさせていただけますか?何かユニークで重要な貢献をしているようです。
— ラッセルピアス

特定の質問を述べることができれば、喜んで拡大します。
— フランクハレル

1
これらのスコアリングルールは...ブートストラップ結果の品質を判断するためのものですか?「分類された」正確なスコア規則を説明するリンクを提供してもらえますか、私はどんな種類の獣なのか想像するのに苦労しています。Googleでの「エフロンゴング楽観」の上位結果のうち、圧倒的多数はあなたによる投稿のようです...修飾子なしで「ブートストラップ」と言う場合とはどう違いますか どのEffron and Gongの記事に注目すべきですか?いくつかあるようです。
— ラッセルピアス

3
正確に分類された割合を使用および定義する0.632に関する元の論文を参照してください(Efron&Tibshirani JASA 92:548; 1997)。楽観的ブートストラップは、バイアスを推定するためのブートストラップの変形です。Gong:JASA 85:20;に記述されています。1990年
— フランクハレル

2

これらの答えは非常に便利です。私は数学でそれを実証する方法を見つけることができなかったので、非常にうまく機能する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)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.