2017-04-16 13 views
-1

私自身の相互検証機能を実装しようとしています。私はこのlinkのクロスバリデーションについて読んで、私のデータセットをトレーニングとテストに分けることができました。しかし、私はどのように折り目を定義することができますか? たとえば、私のデータフレームは次のようになります。パンダ:scikitを使用せずにクロスバリデーションを行うにはどうすればよいですか?

Dataframe: 
     MMC   MET_lep  MASS_Vis Pt_H  Y 
    0 138.70  51.65  97.82  0.91  0 
    1 160.93  68.78  103.23  -999.00  0 
    2 -999.00  162.17  125.95  -999.00  0 
    3 143.90  81.41  80.94  -999.00  1 
    4 175.86  16.91  134.80  -999.00  0 
    5 -999.00  162.17  125.95  -999.00  0 
    6 143.90  81.41  80.94  -999.00  1 
    7 175.86  16.91  134.80  -999.00  0 
    8 -999.00  162.17  125.95  -999.00  0 
    9 143.90  81.41  80.94  -999.00  1 

そして、このように出力したい:以下

For K=3 (Folds) 

When K=1 
Training: 
      MMC   MET_lep  MASS_Vis Pt_H  Y 
     0 138.70  51.65  97.82  0.91  0 
     1 160.93  68.78  103.23  -999.00  0 
     2 -999.00  162.17  125.95  -999.00  0 
     3 143.90  81.41  80.94  -999.00  1 
     4 175.86  16.91  134.80  -999.00  0 
     5 -999.00  162.17  125.95  -999.00  0 
     6 143.90  81.41  80.94  -999.00  1 
Test: 
     7 175.86  16.91  134.80  -999.00  0 
     8 -999.00  162.17  125.95  -999.00  0 
     9 143.90  81.41  80.94  -999.00  1 

When K=2 
Training: 
      MMC   MET_lep  MASS_Vis Pt_H  Y 
     0 138.70  51.65  97.82  0.91  0 
     1 160.93  68.78  103.23  -999.00  0 
     2 -999.00  162.17  125.95  -999.00  0 
     6 143.90  81.41  80.94  -999.00  1 
     7 175.86  16.91  134.80  -999.00  0 
     8 -999.00  162.17  125.95  -999.00  0 
     9 143.90  81.41  80.94  -999.00  1 

Test: 
     3 143.90  81.41  80.94  -999.00  1 
     4 175.86  16.91  134.80  -999.00  0 
     5 -999.00  162.17  125.95  -999.00  0 

When K=3 
Training: 
      MMC   MET_lep  MASS_Vis Pt_H  Y 
     0 138.70  51.65  97.82  0.91  0 
     1 160.93  68.78  103.23  -999.00  0 
     2 -999.00  162.17  125.95  -999.00  0 
     3 143.90  81.41  80.94  -999.00  1 
     7 175.86  16.91  134.80  -999.00  0 
     8 -999.00  162.17  125.95  -999.00  0 
     9 143.90  81.41  80.94  -999.00  1 
Test: 
     4 175.86  16.91  134.80  -999.00  0 
     5 -999.00  162.17  125.95  -999.00  0 
     6 143.90  81.41  80.94  -999.00  1 

が、それは分割の仕事をしていませんが、折り目をしない、私のコードです:

split = math.floor(dataset.shape[0]*0.8) 
    data_train = dataset[:split] 
    data_test = dataset[split:] 

は、事前にありがとうこれを助ける。

答えて

1

K = 2倍がK = 3のテスト倍(3,4,5)vs(4,5,6)と重なることはあなたの意図ですか?また、あなたの例では、折り畳みの数と現在の折り畳みのインデックスの両方を意味するようにKがオーバーロードされているようです。私の答えでは、私はk番目の総フォールドのうちi番目のフォールドにiを使用します。

重複していないフォールドを作成することを目標とすると、0〜len(データセット)-1の範囲からほぼ偶数の範囲を生成する関数があれば十分です。あなたのリストは、床((n * i)/ k)でのk分割によって完全に割り切れるわけではありません。 Pythonでは、あなたは、このような関数を使用できます。

ここ
def fold_i_of_k(dataset, i, k): 
    n = len(dataset) 
    return dataset[n*(i-1))//k:n*i//k] 

は、1次元データ・セットの例である(データフレームのために全く同じように動作するはずです):

>>> fold_i_of_k(list(range(0,11)),1,3) 
[0, 1, 2] 
>>> fold_i_of_k(list(range(0,11)),2,3) 
[3, 4, 5, 6] 
>>> fold_i_of_k(list(range(0,11)),3,3) 
[7, 8, 9, 10] 
関連する問題