146 views
【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) # 訓練用データを作成(未使用データ+使用済データ) 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
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)