見出し画像

ディープラーニングで作る世界一シンプルでわかりやすい競馬予想AI(まとめ編)

全3回にわたって解説してきた競馬予想AIのディープラーニング実装を、このまとめ編で凝縮してお伝えします。実際に使用したデータやGoogle Colaboratoryを使った実装環境についても解説しているので、この記事を参考にすれば、すぐに実装が可能です。

詳しいコードの内容について知りたい場合は、それぞれの回を確認していただければと思います。今回は全体の流れとコードを簡単に振り返ります。

全体の流れ:

  • モデル作成(第1回)

  • データ作成とトレーニング(第2回)

  • 予測(第3回)

〇コード一覧

モデル作成(第1回分)

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Input, Dense, Activation
from tensorflow.keras.utils import to_categorical
from tensorflow.keras.callbacks import ModelCheckpoint
from sklearn.metrics import accuracy_score

# ディープラーニングモデルの作成とトレーニングを行う目的関数
def objective(X, Y):

    model = Sequential([
        
        Input(shape=(X.shape[1],)),

        Dense(128),
        Activation('relu'),

        Dense(64),
        Activation('relu'),

        Dense(18),  # 18個のクラスラベル
        Activation('softmax')
    ])

    # 整数値のクラスラベルをOne-hotエンコーディング
    Y = to_categorical(Y - 1, num_classes=18)  # -1 しているのは、クラスラベルが1から18であるため

    # モデルのコンパイルとトレーニング
    model.compile(optimizer='adam', loss='categorical_crossentropy', metrics=['accuracy'])

    # ベストモデルの保存
    checkpoint = ModelCheckpoint('/content/drive/MyDrive/sample/best_model.keras', monitor='val_loss', save_best_only=True)

    # モデルの訓練
    history = model.fit(X, Y, epochs=10, batch_size=64, validation_split=0.2,callbacks=[checkpoint])

    # テストデータでの予測値の取得
    y_pred = model.predict(X)

    # 正解率の計算
    accuracy = accuracy_score(Y.argmax(axis=1), y_pred.argmax(axis=1))

    # ベストモデルの評価を返す(最大化のため、そのまま返す)
    return accuracy

データ作成、トレーニング(第2回分)

from google.colab import drive
import pandas as pd
from sklearn.model_selection import train_test_split

#google driveと連携する
drive.mount('/content/drive')

# データの読み込みとクリーニング
df = pd.read_csv("/content/drive/MyDrive/sample/sample.csv",  encoding="utf-8")

# 特徴量とターゲットの分割
train_x, test_x, train_y, test_y = train_test_split(df.iloc[:, 1:], df.iloc[:, 0], test_size=0.3)

# ディープラーニングの実行
best = objective(X=train_x, Y=train_y)

予測(第3回分)

from tensorflow.keras.models import load_model

# 新しいテストデータを用意
new_df = pd.read_csv("/content/drive/MyDrive/sample/race.csv", encoding="utf-8")
new_test_x = new_df.iloc[:, 1:]

# モデルを読み込む
best_model = load_model('/content/drive/MyDrive/sample/best_model.keras')

# モデルの予測結果を取得
new_y_pred = best_model.predict(new_test_x)

#結果を表示
print(new_y_pred)

〇トレーニングデータと予測データ

データ作成、トレーニング(第2回分)

sample.csv (約1万行のデータの一部抜粋)

予測(第3回分)

秋華賞(確定前の前日オッズ)

出力結果

各馬の順位予測

出力された順位予測は、縦軸が馬番、横軸が順位です。例えば、1番馬の1着確率は1.2e-2、2着確率は3.0e-6といった形で表示されます。

なお、今回は15頭立てのレースで、出走馬が16位以降になることはありえません。また、このモデルは1頭の予測順位を当てるだけのため、他馬との直接比較はできません。したがって、15頭が戦った場合の確率を1に整形してから出力しています。

秋華賞順位予想確率

実際の結果が1位:5番(チェルヴィニア)、2位:10番(ボンドガール)、3位:14番(ステレンボッシュ)でした。

この表と見比べてどう思うかは人それぞれですが、この程度のシンプルなモデルでも傾向はとらえられてそうです。おそらくオッズを予測の中心に使っていそうなので期待値を考える上でどう使うかモデルの改善とともに考えるべきポイントになりそうです。

実装環境

今回の実装には、無料で使えるGoogle Colaboratoryを採用しました。理由は、PCのスペックが低いことと、環境構築の手間を省きたかったからです。Colaboratoryでは、簡単に実行環境が整います。

Colab の定期購入を最大限に活用する - Colab (google.com)

実装画面

・参照

【Colab 入門】Google Colaboratory とは?使い方・メリットを徹底解説! | キカガクブログ (kikagaku.co.jp)

〇 まとめ(必要なもの)

  • 環境: Google Colaboratory

  • コード: sample.ipynb

  • トレーニングファイル: sample.csv

  • 予測ファイル: race.csv

  • データ保存場所: /content/drive/MyDrive/sample

注意点:

  1. Google Driveにsampleフォルダを作成し、その中にsample.csvとrace.csvを保存してください。

マイドライブにsampleフォルダ作成
sampleフォルダの中ファイル保存

2. race.csvの文字コードはutf-8で保存する必要があります。もし違う文字コードで保存する場合は、コードのencoding="utf-8"を変更してください。
(もしエラー出た場合は『encoding="shift_jis"』に変えるとうまくいくかも?)

最後に

実は、このコードの大部分はChatGPTで作成しました。何か分からないことがあれば、ChatGPTに質問すればすべて解決できます。このコードをシンプルにしたり、精度を上げる方法もChatGPTが知っています。

Google ColaboratoryとChatGPTを組み合わせることで、誰でも簡単にプログラミングができる時代です。何か質問や疑問があれば、いつでもコメントしてください!

最後までお読みいただき、ありがとうございました。

いいなと思ったら応援しよう!

シークレット
もし記事が良かったなと思った人はサポートしていただけると嬉しいです! より良い情報をお伝えできるように頑張ります🙇‍♂️