1

非常に小さなデータに対してクロス有効関数を使用しています...しかし、同じ結果が正しくないことがわかりました。これは起こるはずですか?

私はMatlab R2012aを持っています。これが私の出力です

crossvalind('KFold',1:1:11,5)

ans =

 2
 5
 1
 3
 2
 1
 5
 3
 5
 1
 5

.がないことに注意してくださいset 4。これはバグですか? セットごとに少なくとも 2 つの要素が必要だと思っていましたが、1 つの要素が 0 になりました...そして、値がセット内で均一に分散されていないことがよくあります。

4

1 に答える 1

2

crossvalindのヘルプによると、使用しているフォームは次のとおりcrossvalind(METHOD, GROUP, ...)です。この場合、GROUP はデータのクラス ラベルなどです。したがって、2 番目の引数としての 1:11 は、2 つの例が同じラベルを持っていないことを示唆しているため、ここでは混乱を招きます。関数が何かおかしなことをしても驚くべきではないので、これは十分に珍しいことだと思います。

私はやってみました:

numel(unique(crossvalind('KFold', rand(11, 1) > 0.5, 5)))

そして、それは結果として確実に得5られました。これは私が期待することです。私の例は、2 つのクラスの問題に対応します (一般的な規則として、次のようなものが必要になると思いますnumel(unique(group)) <= numel(group) / folds)。折り畳みサイズの差が 1 以下で、少なくとも 2 つの例が 1 つおきに表示されますが、これを確認するためにコードを調べていません。

次のことを意図している可能性があります。

crossvalind('KFold', 11, 5);

これは、11 個のデータ ポイントに対して 5 つのフォールドを計算します。これは、ラベルを巧妙に処理しようとはしていないため、K 個のフォールドが存在することは確実です。

ただし、あなたの問題では、実際にデータポイントが非常に少ない場合は、次の方法で行うことができる、leave-one-out 交差検証を行う方がよいでしょう。

crossvalind('LeaveMOut', 11, 1);

ただし、より良い方法は次のとおりです。

for leave_out=1:11
  fold_number = (1:11) ~= leave_out;
  <code here; where fold_number is 0, this is the leave-one-out example. fold_number = 1 means that the example is in the main fold.>
end
于 2012-04-15T12:30:45.530 に答える