見出し画像

【備忘録】pythonのKFoldにおけるクロスバリデーションの処理について[例:for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)):)]

★自己紹介
ども、会社員+副業で働きまくるオーバードライバー、通称オドバーでござる。

「オーバードライブ」は限界を超えて動き続ける状態を表すことばで、体力おばけってこと。

今回はデータサイエンス的な内容の備忘録(個人メモ)として1つ記事にする。


★KFoldクラスのインスタンス(略称:kfとする)について

データをK分割して、トレーニング用とバリデーション用に分割するために使用される。

KFoldの役割

  • データを指定した数(ここでは4分割)に分割。

  • 各分割ごとに、バリデーション用データとトレーニング用データに分けるインデックスを生成。

★kfのsplit処理について

kf.split() は ジェネレーター であり、イテレーションごとに次の分割に対応するインデックスのペア (tr_idx, va_idx) を返す。

kf.split(train_x)の場合、train_x(データセット)を入力として受け取り、各分割のトレーニング用インデックス (tr_idx) と バリデーション用インデックス (va_idx) を生成する。

★enumerateについて

enumerate はイテレーションにおいて、自動的に インデックス番号 (i) を生成する。
ここでは、i が分割番号(0, 1, 2, 3)を表す。

★(tr_idx, va_idx)について

  • tr_idx: トレーニングデータに使用するサンプルのインデックス。

  • va_idx: バリデーションデータに使用するサンプルのインデックス。

★分割数4の場合の例

分割が4であれば、kf.split(train_x) によって次のような4つのペアが順に生成される(以下、データのインデックス数を簡略化):

  1. 分割0: tr_idx = [2, 3, 4, 5, 6, 7, 8, 9]、va_idx = [0, 1]

  2. 分割1: tr_idx = [0, 1, 4, 5, 6, 7, 8, 9]、va_idx = [2, 3]

  3. 分割2: tr_idx = [0, 1, 2, 3, 6, 7, 8, 9]、va_idx = [4, 5]

  4. 分割3: tr_idx = [0, 1, 2, 3, 4, 5, 8, 9]、va_idx = [6, 7]

★まとめ

このループは、KFoldクロスバリデーションの各分割について以下を行う準備をしています:

  1. tr_idxva_idx を生成して、データをトレーニングセットとバリデーションセットに分割する。

  2. 各分割番号 (i) を利用して分割ごとの処理を管理(例:結果を保存したり、ログを取ったり)。

★サンプルコードと出力

サンプルコード

from sklearn.model_selection import KFold
import numpy as np

# データセットの例
train_x = np.arange(10)  # 0, 1, 2, ..., 9

# KFoldの設定 (4分割)
kf = KFold(n_splits=4, shuffle=False)

# KFoldを用いたループ
for i, (tr_idx, va_idx) in enumerate(kf.split(train_x)):
    print(f"Fold {i}:")
    print(f"  Train indices: {tr_idx}")
    print(f"  Validation indices: {va_idx}")

出力

Fold 0:
  Train indices: [3 4 5 6 7 8 9]
  Validation indices: [0 1 2]
Fold 1:
  Train indices: [0 1 2 6 7 8 9]
  Validation indices: [3 4 5]
Fold 2:
  Train indices: [0 1 2 3 4 5 9]
  Validation indices: [6 7 8]
Fold 3:
  Train indices: [0 1 2 3 4 5 6 7 8]
  Validation indices: [9]

このように、各分割でデータの一部がバリデーション用に使われ、残りがトレーニング用に使われる。

いいなと思ったら応援しよう!