【競馬AI 11】予測したレースから購入すべき馬を選定する

競馬AI

レースの予測結果で上位の馬をすべて購入していたら必ず収支はマイナスになってしまいます。

そこで一定の閾値を設けて、その閾値を超えた馬を軸にして購入するなど工夫が必要です。

ではどのように閾値を設定すればよいかを説明します。

以下の記事で回収率が計算できます。

threshold“が閾値を表しているので、その値を変えて回収率が最大になる様に調整してみてください。

私のモデルでは閾値が0.85を超えた馬の回収率が高かったので、0.85あたりを閾値としています。

予測結果にマークを付けて出力する

1レースずつ予測結果を見て判断するのは大変だと思うので、一気に予測結果を確認し閾値を超えた馬にマークをつけて出力するコードを作成してみました。

閾値やマークなどは自由に変更してください。

import os
import pandas as pd
import re

# フォルダのパス
dir_path = "predict_result"
date = "20240106"
# フォルダ内のすべてのファイルとディレクトリを取得
all_items = os.listdir(dir_path)
# フォルダを除外して、ファイルのみのリストを作成
file_list = [item for item in all_items if os.path.isfile(os.path.join(dir_path, item))]

output_list = []
for path in file_list:
    match = re.search(r'race_data_(.*?)_\d+.csv', path)
    if match:
        extracted = match.group(1)
        output_list.append([extracted])
        output_list.append([ "自信度","馬番","馬","予測結果"])

        # 予測を行う新しいデータの読み込み
        data = pd.read_csv('predict_result/' + path)
        # '予測結果'列に基づいて降順でソート
        sorted_data = data.sort_values(by='予測結果', ascending=False)

        # sorted_dataから予測結果、馬番、馬の情報を取り出し、output_dfに追加
        for index, row in sorted_data.iterrows():
            confidence = ""

            # 条件を整理して可読性を向上させる
            # row のキーへのアクセスを変数に保存
            predicted_result = row["予測結果"]

            # 記号のランク順 (◎、〇、△) に条件を配置
            if predicted_result >= 0.85:
                confidence = "◎"
            elif predicted_result >= 0.8:
                confidence = "〇"
            elif predicted_result >= 0.75:
                confidence = "▲"

            output_list.append([confidence,row["馬番"], row["馬"],round(row["予測結果"], 5)])

        output_list.append([])

# 最後にリストからDataFrameを作成し、csvファイルとして出力
output_df = pd.DataFrame(output_list)
output_df.to_csv('output_' + date + '.csv', index=False)

出力結果を見ながら購入する馬を検討してみてください。

まとめ

だんだんと競馬の予想がしやすくなってきたのではないでしょうか?

私のAI競馬予想の結果を見ていただければわかると思いますが、閾値を超えた馬の単複を買うだけでは良くて回収率100%前後になってしまいます。

個人的な意見ですが、AI予想で軸を決め、相手は自身の予想を入れると当てやすくなるのではないかと考えています。

ぜひ試してみてください!

コメント

  1. haibitudog より:

    コメント失礼します。
    予測結果が閾値を超える結果が出ません。どの辺りを改善してらっしゃるのか
    ご教示いただけませんでしょうか?

    • agus agus より:

      記事との違いは、データ数(20年分くらい)とオリジナルの特徴量をいくつか足しているところです。
      なので、単純にデータ数を増やすこと、データを組み合わせて特徴量を作ることですかね。

      • haibitudog より:

        返信ありがとうございます。
        オリジナルの特徴量が難しいところですね。今後公開の予定はありませんか?

        • agus agus より:

          例えば、平均クラス、平均斤量、騎手や馬の勝率・複勝率・平均着順などの特徴量を作成して使っています。
          しかし、これが正解というわけではなく、他にも様々な特徴量が考えられます。
          ここから先は自分で重要だと思う特徴量を作り出していくことが重要なのかなと思います。

          • haibitudog より:

            返信ありがとうございます。
            参考にさせていただきます。
            記事の更新も楽しみにしております。