相互検証のどの方法が最適であるかをどのように知ることができますか?


36

私は自分の状況に最適な相互検証方法を見つけようとしています。

次のデータは、問題を処理するための単なる例です(Rで)が、実際のXデータ(xmat)は相互に関連付けられ、y変数(ymat)でさまざまな程度に関連付けられています。Rコードを提供しましたが、私の質問はRについてではなく、メソッドについてです。XmatX変数V1〜V100がymat含まれ、単一のy変数が含まれます。

set.seed(1233)
xmat           <- matrix(sample(-1:1, 20000, replace = TRUE), ncol = 100)
colnames(xmat) <- paste("V", 1:100, sep ="")
rownames(xmat) <- paste("S", 1:200, sep ="")
  # the real y data are correlated with xmat
ymat           <- matrix(rnorm(200, 70,20), ncol = 1)
rownames(ymat) <- paste("S", 1:200, sep="")

yすべての変数に基づいて予測するためのモデルを構築したいと思いますxmat。したがって、線形回帰モデルになりy ~ V1 + V2 + V3+ ... + V100ます。レビューから、次の3つの相互検証方法を見ることができます。

  1. データを約半分に分割し、一方をトレーニングに使用し、もう半分をテストに使用します(相互検証):

    prop       <- 0.5 # proportion of subset data
    set.seed(1234)
      # training data set 
    training.s <- sample (1:nrow(xmat), round(prop*nrow(xmat),0))
    xmat.train <- xmat[training.s,]
    ymat.train <- ymat[training.s,]
    
      # testing data set 
    testing.s <- setdiff(1:nrow(xmat), training)
    xmat.test <- xmat[testing.s,]
    ymat.test <- ymat[testing.s,]
  2. K倍交差検証 -10倍交差検証を使用:

    mydata <- data.frame(ymat, xmat)
    fit    <- lm(ymat ~ ., data=mydata)
    library(DAAG)
    cv.lm(df=mydata, fit, m=10) # ten-fold cross validation 
  3. 一度に1つの値またはいくつかの値をマスクする:この方法では、データセット(y)の値をNAに置き換えてランダムにマスクし、予測します。このプロセスはn回繰り返されます。

    n = 500 
    predicted.v <- rep(NA, n)
    real.v      <- rep(NA, n)
    
    for (i in 1:n){
      masked.id <- sample (1:nrow(xmat), 1)
      ymat1     <- ymat 
      real.v[i] <- ymat[masked.id,]
      ymat1[masked.id,] <- NA
      mydata            <- data.frame(ymat1, xmat)
      fit               <- lm(ymat1 ~ ., data=mydata)
      predicted.v[i]    <- fit$fitted.values[masked.id]
    }

どの状況に最適かをどのように知ることができますか?他の方法はありますか?Bootstrap validationCV?実用的な例は高く評価されます。


データの妥当性をチェックしたり、b係数の予測推定値または値を検証したりすることに興味がありますか。
サブハッシュC.ダバール14年

私は、B-係数の予測の推定値または値を検証することに興味を持っています
rdorlearn

方法#1での問題は、サンプルサイズが実際に持っているサイズよりもはるかに小さいことです。したがって、推定された信頼帯/変動ははるかに大きくなる可能性があります。また、方法2と方法3はパフォーマンスが似ていると推測しています。私があなただったら、K = 5,6、...、14,15のK分割交差検証から始めて、結果がかなり似ているかどうかを確認してください。
キアン14年

また、共変量の数を減らすためにモデル選択を行うつもりですか?100はかなり多いようです。
キアン14年

@ user2432701ありません私はすべて100使いたい
rdorlearn

回答:


34

OPはこの質問に恩恵を与えているため、ある程度の注意を引く必要があり、OPに直接回答しない場合でも、いくつかの一般的なアイデアを議論するのに適した場所です。

まず、名前:

a)交差検定は、トレインセットとは異なるテストセットを使用するすべての推定/測定手法の一般名です。同義語:サンプル外またはサンプル外の推定。反意語:サンプル内推定。

サンプル内推定は、トレーニングセットに関する情報を使用してモデルの品質を推定する手法です(必ずしもエラーではありません)。これは、モデルに高いバイアスがある場合、つまりデータについて強い仮定を立てている場合に非常に一般的です。質問の例のように、線形モデル(高バイアスモデル)では、モデルの品質の尺度としてR乗、AIC、BIC、逸脱を使用します。これらはすべてサンプル内推定量です。たとえば、SVMでは、データ数に対するサポートベクトルの比率データは、モデルの誤差のサンプル内推定です。

多くの相互検証手法があります。

b)ホールドアウトは、上記の方法1です。セットをトレーニングと1つのテストに分割します。トレーニングとテストセットの相対的なサイズに関する議論と実践の長い歴史があります。

c)k -fold –上記の方法#2。かなり標準。

d)Leave-one-out –上記の方法3。

e)ブートストラップ:セットにN個のデータがある場合、セットからN個のサンプルを交換してランダムに選択し、トレーニングとして使用します。常にサンプリングされていない元のセットのデータがテストセットとして使用されます。モデルの誤差の最終推定値を計算するさまざまな方法があり、テストセットの誤差(サンプル外)とトレインセットの誤差(サンプル内)の両方を使用します。たとえば、.632ブートストラップを参照してください。.632+の式もあると思います。これは、サンプル外エラーとサンプル内エラーの両方を使用してモデルの真のエラーを推定する式です。

f)上記の方法の選択に直交するのは、繰り返しの問題です。leave-one-outを除き、上記のすべての方法は何度でも繰り返すことができます。実際、繰り返しのホールドアウト、または繰り返しkフォールドについて話すことができます。公平を期すために、ほとんどの場合、ブートストラップ方式が繰り返し使用されます。


次の質問は、どの方法が「より良い」かです。問題は、「より良い」という意味です。

1)最初の答えは、これらの各方法がモデル誤差の推定に偏っているかどうかです(将来のデータが無限にある場合)。

2)2番目の選択肢は、これらの方法のそれぞれが真のモデル誤差に収束する速度またはバイアスです(バイアスがかけられていない場合)。これはまだ研究のテーマだと思います。これら2つの論文(ペイウォールの背後)を指摘しますが、要約により、彼らが何を達成しようとしているのかをある程度理解できます。また、k -foldを単独で「相互検証」として呼び出すことは非常に一般的であることに注意してください。

これらのトピックについては、おそらく他にも多くの論文があります。これらはほんの一例です。

3) "より良い"のもう1つの側面は、上記の手法のいずれかを使用してモデルエラーの特定の尺度が与えられた場合、正しいモデルエラーが近いことをどの程度確信できるかです。

一般に、この場合、エラーの多くの測定を行い、信頼区間(または、ベイジアンアプローチに従う場合は信頼できる区間)を計算します。この場合、問題はエラー測定値のセットの分散をどれだけ信頼できるかです。リーブワンアウトを除き、上記のすべての技術はあなたに多くの異なった措置を与える(というお知らせのkのための対策のk倍、nは対策nはホールドアウト-repeated)ので、あなたは、分散(または標準偏差を測定することができます)このセットの誤差の測定値の信頼区間を計算します。

ここで事態はやや複雑になります。私は紙から理解して何からいいえの分散の不偏推定量kはクロスバリデーション倍(ないペイウォールの背後にある)を、1はあなたから取得分散信頼することはできませんのk倍を- 1は、から良い信頼区間構築することはできませんので、kは -ひだ。また、教師付き分類学習アルゴリズムを比較するための近似統計テスト(ペイウォールの背後ではない)、繰り返し測定を使用する手法(繰り返しkフォールド、繰り返されるホールドアウト–ブートストラップについてはわかりません)は、エラー測定値の真の分散を過小評価します(それを確認するのはやや簡単です)。測定値を非常に多く繰り返すと、有限セットからサンプリングするためです何度も同じ値が繰り返され、平均値は同じに保たれますが、分散は減少します)。したがって、反復測定手法は、信頼区間に対して楽観的すぎます。

この最後の論文は、多くの測定(10)の適切なバランスとして、繰り返し5回の2回(彼は5x2 CVと呼びます)を行うことをお勧めします。

編集:

もちろん、これらの質問のいくつかに対するクロスバリデーションには素晴らしい答えがあります(ただし、時々彼らは同意しません)。ここに幾つかあります:

分類性能を評価するための相互検証またはブートストラップ?

予測誤差を推定するためのクロス検証とブートストラップの違い

分類性能を評価するための相互検証またはブートストラップ?

検証とモデル選択のブートストラップについて

一般的に、タグのはここでのあなたの友達です。


それでは、最善の解決策は何ですか?知りません。特に出版物において、ある技術が別の技術よりも優れていることを確認する必要がある場合、非常に厳密である必要がある場合、5×2 CVを使用しています。分散や標準偏差の測定を計画していない場合、または時間の制約がある場合は、ホールドアウトを使用します。ホールドアウトで学習するモデルは1つだけです。


相互検証の複雑な分散特性については、どの分散を測定するかについて注意する必要があると思います。IIRC、ベンジオ等。以下のための分散に焦点サイズのデータセットN当面の問題のために。これは、手元にあるデータセットでトレーニングされたモデルの予測のランダムな不確実性とは異なります(より大きくなります)。上記リンクのDietterich論文の問題分類も参照してください。
cbeleitesは、モニカをサポートします

7

メソッドの定義については、ウィキペディアのページを参照してください(ここでできるよりもはるかに良い仕事をしています)。

そのページをご覧になった後、次のことが役立つ場合があります。モデリングプロセスにこれらの方法の1つを選択したいという質問の部分に焦点を当てましょう。これは非常に頻繁に行われる選択であり、追加の知識から利益を得ることができるため、2つの状況に対する私の答えを以下に示します。

  1. どんな状況でもk-fold cross validation適切な数の繰り返し(たとえば5または10)で使用します。

    • データを半分に分割し、前半でトレーニングし、他方で検証することは、いずれにしても2倍交差検証の1つのステップです(他のステップは、2つの半分を交換して同じ演習を繰り返します)。したがって、「データを半分に分割する」戦略を除外します。

    • 多くの機械学習およびデータマイニングの論文では、k倍交差検証(引用はありません)を使用しているため、このステップで特に注意する必要がない限り、それを使用してください。

    • さて、one outメソッドを残し、 ' leave p out 'や ' random split and repeat '(上記のプロセスのようなブートストラップ)のような他のメソッドは間違いなく良い候補です。

    • データサイズがNの場合、N分割交差検証は基本的に1つを省くのと同じです。

    • 「pを省く」と「ブートストラップ」はk倍クロス検証よりも少し異なりますが、本質的には、折りの定義方法と発生する繰り返し「k」の数に違いがあります。

    • ウィキのページにあるように、k-foldと ' leave p out 'はどちらも、「期待されるパフォーマンス/フィット」の適切な推定値です(ただし、これらの推定値の分散に関してはベットはオフになっています)。

  2. あなたの状況:フィーチャーの数(100)と比較して、サンプルサイズは200のみです。同じパフォーマンスを提供する複数の線形モデルがある可能性が非常に高いと思います。10回以上の繰り返しでk分割交差検証を使用することをお勧めします。3または5のak値を選択します。

    • k値の理由:一般的な選択。

    • 繰り返し値の理由:単一のk-fold交差検証計算の出力は、導入する分割のばらつき/ランダム性の影響を受けやすい可能性があるため、ここでは繰り返しの値をかなり高くすることがおそらく重要です。

追加の考え:

  • 私はまた、同じパフォーマンス/フィット尺度に「k pクロス検証に加え」「pを省く」および「ランダム分割リピートようなブートストラップ」メソッドを使用して、k分割クロス検証メソッドの出力が正常に見えるかどうかをチェックします。

  • 誰かが提案したように、100個すべての機能を使用したいが、多重共線性/相関に注意を払い、おそらく機能の数を減らしてください。



私はこれの多くを切り抜けて、R rmsパッケージvalidatecalibrate関数に実装されているEfron-Gong楽観的ブートストラップに直接行きます。
フランクハレル
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.