(29) K-fold cross-validation用のデータセットを作る。

投稿者: | 2024年2月15日

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)

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です