![見出し画像](https://assets.st-note.com/production/uploads/images/168694504/rectangle_large_type_2_33c303ba47b59c21b7860071f56e38f5.png?width=1200)
【備忘録】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つのペアが順に生成される(以下、データのインデックス数を簡略化):
分割0: tr_idx = [2, 3, 4, 5, 6, 7, 8, 9]、va_idx = [0, 1]
分割1: tr_idx = [0, 1, 4, 5, 6, 7, 8, 9]、va_idx = [2, 3]
分割2: tr_idx = [0, 1, 2, 3, 6, 7, 8, 9]、va_idx = [4, 5]
分割3: tr_idx = [0, 1, 2, 3, 4, 5, 8, 9]、va_idx = [6, 7]
★まとめ
このループは、KFoldクロスバリデーションの各分割について以下を行う準備をしています:
tr_idx と va_idx を生成して、データをトレーニングセットとバリデーションセットに分割する。
各分割番号 (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]
このように、各分割でデータの一部がバリデーション用に使われ、残りがトレーニング用に使われる。