web-dev-qa-db-ja.com

KFoldとShuffleSplit CVの違いは何ですか?

KFoldはオブジェクトが反復されるたびに同じ値を生成するようですが、Shuffle Splitは毎回異なるインデックスを生成します。これは正しいです?もしそうなら、他の用途の用途は何ですか?

cv = cross_validation.KFold(10, n_folds=2,shuffle=True,random_state=None)
cv2 = cross_validation.ShuffleSplit(10,n_iter=2,test_size=0.5)
print(list(iter(cv)))
print(list(iter(cv)))
print(list(iter(cv2)))
print(list(iter(cv2)))

次の出力を生成します。

[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]                                     
[(array([1, 3, 5, 8, 9]), array([0, 2, 4, 6, 7])), (array([0, 2, 4, 6, 7]), array([1, 3, 5, 8, 9]))]                                     
[(array([4, 6, 3, 2, 7]), array([8, 1, 9, 0, 5])), (array([3, 6, 7, 0, 5]), array([9, 1, 8, 4, 2]))]                                     
[(array([3, 0, 2, 1, 7]), array([5, 6, 9, 4, 8])), (array([0, 7, 1, 3, 8]), array([6, 2, 5, 4, 9]))]    
32
rb612

KFoldとShuffleSplit出力の違い

KFoldは、データセットを事前に指定された数のfoldsに分割します。すべてのサンプルは、1つだけの折りたたみでなければなりません。フォールドはデータセットのサブセットです。

ShuffleSplitは、各iteration中にデータセット全体をランダムにサンプリングして、トレーニングセットとテストセットを生成します。 test_sizeおよびtrain_sizeパラメータは、反復ごとにテストとトレーニングテストセットの大きさを制御します。各反復中にデータセット全体からサンプリングしているため、ある反復中に選択された値は、別の反復中に再び選択される可能性があります。

Summary: ShuffleSplitは反復的に機能し、KFoldはデータセットをk分割に分割するだけです。

検証を行う際の違い

KFoldでは、各ラウンドで1つのフォールドをテストセットとして使用し、残りのフォールドをallトレーニングセットとして使用します。ただし、ShuffleSplitでは、各ラウンドnでは、反復nからのトレーニングとテストセットをのみ使用する必要があります。データセットが大きくなると、相互検証時間が長くなり、シャッフルスプリットがより魅力的な代替手段になります。すべてのk-1分割を使用するのではなく、特定の割合のデータでアルゴリズムをトレーニングできる場合、ShuffleSplitは魅力的なオプションです。

38
ilyas patanam