1. ホーム
  2. パンダ

[解決済み】データを3つのセット(トレーニング、検証、テスト)に分割する方法とは?)

2022-04-13 03:45:57

質問

pandasのdataframeを3つのセットに分けたいのですが、どうすればいいですか?私は 訓練・試験・スプリット から sklearn.cross_validation を使えば、データを2つのセット(trainとtest)に分けることができます。しかし、データを3つの集合に分けるという解決策は見つかりませんでした。できれば、元データのインデックスが欲しいです。

回避策としては train_test_split を2回実行し、何らかの方法でインデックスを調整します。しかし、データを2セットではなく3セットに分割する、より標準的な/ビルトインの方法はありますか?

どのように解決するのですか?

Numpyによる解決。まずデータセット全体をシャッフルします( df.sample(frac=1, random_state=42) )に分割し、その後、データセットを以下の部分に分割します。

  • 60% - 訓練セット。
  • 20% - バリデーションセット
  • 20% - テストセット

In [305]: train, validate, test = \
              np.split(df.sample(frac=1, random_state=42), 
                       [int(.6*len(df)), int(.8*len(df))])

In [306]: train
Out[306]:
          A         B         C         D         E
0  0.046919  0.792216  0.206294  0.440346  0.038960
2  0.301010  0.625697  0.604724  0.936968  0.870064
1  0.642237  0.690403  0.813658  0.525379  0.396053
9  0.488484  0.389640  0.599637  0.122919  0.106505
8  0.842717  0.793315  0.554084  0.100361  0.367465
7  0.185214  0.603661  0.217677  0.281780  0.938540

In [307]: validate
Out[307]:
          A         B         C         D         E
5  0.806176  0.008896  0.362878  0.058903  0.026328
6  0.145777  0.485765  0.589272  0.806329  0.703479

In [308]: test
Out[308]:
          A         B         C         D         E
4  0.521640  0.332210  0.370177  0.859169  0.401087
3  0.333348  0.964011  0.083498  0.670386  0.169619

[int(.6*len(df)), int(.8*len(df))] - は indices_or_sections の配列です。 numpy.split() .

の小さなデモを紹介します。 np.split() 20 要素の配列を 80%, 10%, 10% に分割してみましょう。

In [45]: a = np.arange(1, 21)

In [46]: a
Out[46]: array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20])

In [47]: np.split(a, [int(.8 * len(a)), int(.9 * len(a))])
Out[47]:
[array([ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16]),
 array([17, 18]),
 array([19, 20])]