0

Linux マシン (サーバー) で R 2.15.3 でサブサンプリング タスクを実行しています。サブサンプリングの繰り返しでエラーが発生します (不適切なサブサンプリング データ セットが原因です)。

ループを停止せずに多くのサブサンプリング反復を実行できるようにするには、各反復でtry()次の方法を使用します。

set.seed(1234)

interestingobject <- list()

for(i in 1:300) {

  anyproblems <- try(0 + "0")

  while(class(anyproblems) == "try-error") {

    anyproblems <- try({

      <code line 1>
      <code line 2>
      <code line 3>
        .
        .
        .

    })

  }

  interestingobject[[i]] <- <object from iteration i>

}

今、私は次の「奇妙な」問題を抱えています:

数回繰り返した後、最初のエラーが で発生し try({ ... })ます。「while」ループはエラーが発生しなくなるまで続行する必要があるため、これは問題ではないと思いますtry({ ... })。しかし問題は、最初のエラーが発生した後、同じサンプルが描画され、その理由がわからないため、同じエラーが何度も発生することです。

更新:「コード行 1」の行の前に、コード内で乱数 ( cat(runif(1), "\n")) を描画するだけでtry({ ... }) 最後まで進みますが、1 つがループに入ります。これは、「interestingobject」の要素が反復ごとに繰り返されることを意味します。これがどのように起こるのか本当にわかりません。この問題は、R が乱数を生成/処理する方法 (またはこのようなもの) に関連する何かによって何らかの形で説明できると思います。

正確なコードがないとおそらく少し難しいように思えますが、後者はかなり長くて紛らわしいので、おそらくあまり役​​に立ちません。

このようなことが起こることは、どのように説明できますか?

描画された乱数もループ内で繰り返されるため、実際には同じことが数回の反復ごとに繰り返されます。

編集(おそらく問題には重要ではありません):コードのいくつかの仕様:各反復でクロス検証が行われ、ネストされたクロス検証もあり、クロス検証を使用して、チューニングパラメーターが各外側クロスで最適化されます検証の繰り返し。

チューニング パラメーターのチューニング (したがって、対応する相互検証での折り畳みへのランダムな分割も) は、コードの外部で定義された自己記述関数によって行われることを知っておく価値があるかもしれません。

更新 2: コメンターのおかげで、デバッグを使用したところ、最初のエラーが発生した場所 (1 つのクラスからの観測のみ) と、ループが開始された場所でも警告が表示されることがわかりました:

get(.obj, environment = dump[[.selection]]) : 中断された promise 評価の再開

たぶんこれが役立ちます。この警告メッセージは何を意味するのでしょうか? 乱数発生器のシードがリセットされたのでしょうか?

4

1 に答える 1

-2

より良い解決策がないため、エラーが発生したかどうかに関係なく、try({...}) の手順が繰り返されるたびにランダム シードが新たに設定されるという醜い回避策を実行しました。ランダムに選択されたシード自体が乱数がループしているという問題の影響を受けるため、サブサンプリング全体が開始される前にシードが描画されます。

set.seed(1234)

interestingobject <- list()

########
# New: #
########
ranseed <- sample(1000000:10000000, size=100000)
count <- 1
#######

for(i in 1:300) {

  anyproblems <- try(0 + "0")

  while(class(anyproblems) == "try-error") {

    ########
    # New: #
    ########
    set.seed(ranseed[count])
    count <- count+1
    ########

    anyproblems <- try({

      <code line 1>
      <code line 2>
      <code line 3>
        .
        .
        .

    })

  }

  interestingobject[[i]] <- <object from iteration i>

}

これは明らかに大まかな解決策にすぎないので、誰かがそこで何が起こるかについてヒントを与えることができれば、私はまだとても幸せです!

try({ ... }) 内のコードでは、シードを設定しません。ただし、私が使用するパッケージ化されたコードの関数で何かが起こっている可能性があります。パッケージ「CMA」の「rfCMA」は、同じ名前のパッケージ「rfCMA」の「randomForest」を使用します。ランダムフォレストの「mtry」は、「CMA」パッケージの「tune」機能で最適化されています。

編集: try({...}) 内のコードを再度確認しましたが、バグは見つかりませんでした。上記の解決策が間違っているかもしれないと誰かが考えている場合は、教えてください! try({...}) 内でエラーが発生するたびに、対応する反復が破棄され、 set.seed(ranseed[count]) を介して完全に独立した反復が確認されるため、なぜ間違っているのかわかりません描かれています。

于 2013-08-06T18:39:33.240 に答える