見出し画像

(競馬予想AI)学習に使うレース数を変えてどのモデルが一番回収率が高いかを記録する

レース場毎に過去○レースを基に、LightGBMで予想し、50レースでの回収率の高いものを使うためにcsvファイルに記録する

出来上がりのもの

ソースコード(ファイル名:model_selection.py)

事前に準備しているrace_listから、実施されるレースのリストをとってくる

import pandas as pd
import pickle
import numpy as np
from datetime import datetime
import lightgbm as lgb
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn import preprocessing
from keiba_prediction import race_prediction_set
import warnings
from tqdm import tqdm
import csv
from report_line import send_line_return # type: ignore
import os

# 現在の日付を取得
today = datetime.now()
today_str = today.strftime('%Y%m%d')

# CSVファイルを読み込む
dataset = pd.read_pickle(f'D:/Python/Keiba/list/dataset.pkl')
race_list_csv = f'D:/Python/Keiba/prediction/race_list_{today_str}.csv'
race_list_df = pd.read_csv(race_list_csv)

# データフレームに変換
df = pd.DataFrame(race_list_df)
df['Race Time'] = pd.to_datetime(df['Race Time'])
df['予想済み'] = False  # フラグを追加

# ユニークなRace IDのリストを取得
unique_race_ids = df['Race ID'].unique()

# "2024"の次の2桁を抽出
extracted_next_two_digits = (np.array(unique_race_ids) // 10**6) % 100

# 重複を排除し、小さい順にソート
unique_sorted_next_two_digits = np.unique(extracted_next_two_digits)

# 現在の日付を取得
today = datetime.now()
today_str = today.strftime('%Y%m%d')

# データセットとレースリストを読み込む
dataset = pd.read_pickle(f'D:/Python/Keiba/list/dataset.pkl')
race_list_csv = f'D:/Python/Keiba/prediction/race_list_{today_str}.csv'
race_list_df = pd.read_csv(race_list_csv)

競馬場の2桁のコードを抽出して、もともとデータベースとして持っているdataset.pklからそれぞれの競馬場毎のdataset_{location_code}.pklを作成する

# 開催場所辞書
placeDict = {            
    '01':'札幌', '02':'函館', '03':'福島', '04':'新潟','05':'東京',
    '06':'中山', '07':'中京', '08':'京都', '09':'阪神', '10':'小倉',
    '65':'ばんえい帯広', '30':'門別', '35':'盛岡', '36':'水沢', '42':'浦和',
    '43':'船橋', '44':'大井', '45':'川崎', '46':'金沢', '47':'笠松',
    '48':'名古屋', '50':'園田', '51':'姫路', '54':'高知', '55':'佐賀'
}

# レースの開催場所でフィルタリングする関数
def filter_by_race_location(df, location):
    return df[df['開催場所'] == location]

# 各unique_sorted_next_two_digitsに対して対応する場所のデータを抽出し、.pklファイルに保存
for digits in unique_sorted_next_two_digits:
    location_code = str(int(digits)).zfill(2)  # 数字を2桁にする
    
    if location_code in placeDict:
        location = placeDict[location_code]
        filtered_df = filter_by_race_location(dataset, location)
        
        # 保存先のファイルパスを指定
        file_name = f'D:/Python/Keiba/list/dataset_{location_code}.pkl'
        with open(file_name, 'wb') as f:
            pickle.dump(filtered_df, f)
        
        print(f"{file_name} has been saved with data for {location}.")
    else:
        print(f"Location code {location_code} not found in placeDict.")
        

評価と学習期間を任意に抽出できるようにする関数
num_test_races=評価に使うtestレース数(最も新しい)
num_train_races=学習に使うtrainレース数(test期間よりも前のもの)

# RaceIdに基づいてトレーニングデータとテストデータを分割する関数
def split_train_test_by_raceId(df, num_test_races, num_train_races):
    df_sorted = df.sort_values(by=['raceId'], ascending=True)
    unique_race_ids = df_sorted['raceId'].unique()
    test_race_ids = unique_race_ids[-num_test_races:]
    train_race_ids = unique_race_ids[-(num_test_races + num_train_races):-num_test_races]
    test_df = df_sorted[df_sorted['raceId'].isin(test_race_ids)]
    train_df = df_sorted[df_sorted['raceId'].isin(train_race_ids)]
    return train_df, test_df

モデルで期待値1.1倍以上になるときに馬券を購入した場合の購入数と回収率を返す関数

ここから先は

11,055字
この記事のみ ¥ 300

この記事が気に入ったらサポートをしてみませんか?