776 views
この記事は最終更新から 417日 が経過しています。
【1】やりたいこと
機械学習に使えるデータが 5,000件ある。
K-fold cross-validation(=K分割交差検証)
を行うため、このデータを 5セットに分けたい。
条件は以下の通り。
・各回の訓練の中で、訓練用データとテスト用データが重複してはならない。
・各回の訓練の間で、テスト用データが重複してはならない。
この条件を満たすデータを、Pythonを使ってサクッと作りたい。
【2】やってみる
1) Python shellで一行ずつ実行してみる。
まずは、5,000件のデータが格納されているファイルをロードする。
import pandas as pd
import random
dataAll = pd.read_csv('dataAll.csv', header=None)
次に、1回の訓練で使用する訓練用+検証用データセットを作る。
numTest = 2
i = 1
dataNotUsed = dataAll # 未使用データ群 (テスト用に未使用)
dataUsed = pd.DataFrame() # 使用済データ群 (テスト用に使用済)
# テスト用データを、未使用データ群から取得
numNotUsed = len(dataNotUsed)
iTest = random.sample(range(numNotUsed), numTest)
dataTest = dataNotUsed.iloc[iTest]
# iTestで取得した行のインデックスを取得
index_to_drop = dataNotUsed.iloc[iTest].index
# これらのインデックスを使って、未使用データ群から今回使用するテスト用データを削除
dataNotUsed = dataNotUsed.drop(index_to_drop)
# 訓練用データを作成(未使用データ+使用済データ)
# ※初回なので dataUsed は空っぽ
dataTrain = pd.concat([dataNotUsed, dataUsed], axis=0)
# 使用済データ群を更新(使用済みデータ+今回のテスト用データ)
dataUsed = pd.concat([dataUsed, dataTest], axis=0)
# ファイル出力 ※目視で確認しやすいように 1列目の値で昇順にソート
dataTrain = dataTrain.sort_values(by=0, ascending=True)
dataTest = dataTest. sort_values(by=0, ascending=True)
dataTrain.to_csv(f"dataTrain_{i}.csv", header=None)
dataTest. to_csv(f"dataTest_{i}.csv", header=None)
i += 1
詳細は、こちらの ChatGPT大先生の解説をご参照ください。
2) 関数化し、一気に 5セットを生成する。
import pandas as pd
import random
def makeDataSet( dataAll_csv, numKFold, numTest ):
# 指定 CSVファイルを読み込み
dataAll = pd.read_csv(dataAll_csv, header=None)
# 変数初期化
dataNotUsed = dataAll # 未使用データ群 (テスト用に未使用)
dataUsed = pd.DataFrame() # 使用済データ群 (テスト用に使用済)
for i in range(numKFold):
# テスト用データを、未使用データ群から取得
numNotUsed = len(dataNotUsed)
iTest = random.sample(range(numNotUsed), numTest)
dataTest = dataNotUsed.iloc[iTest]
# iTestで取得した行のインデックスを取得
index_to_drop = dataNotUsed.iloc[iTest].index
# これらのインデックスを使って、未使用データ群から今回使用するテスト用データを削除
dataNotUsed = dataNotUsed.drop(index_to_drop)
# 訓練用データを作成(未使用データ+使用済データ)
dataTrain = pd.concat([dataNotUsed, dataUsed], axis=0)
# 使用済データ群を更新(使用済みデータ+今回のテスト用データ)
dataUsed = pd.concat([dataUsed, dataTest], axis=0)
# ファイル出力 ※目視で確認しやすいように 1列目の値で昇順にソート
dataTrain = dataTrain.sort_values(by=0, ascending=True)
dataTest = dataTest. sort_values(by=0, ascending=True)
dataTrain.to_csv(f"dataTrain_{i}.csv", header=None)
dataTest. to_csv(f"dataTest_{i}.csv", header=None)
# データファイル名を指定して機能を実行
makeDataSet('dataAll.csv', 5, 500)
アクセス数(直近7日): ※試験運用中、BOT除外簡易実装済2026-05-04: 0回 2026-05-03: 0回 2026-05-02: 0回 2026-05-01: 0回 2026-04-30: 0回 2026-04-29: 0回 2026-04-28: 0回