0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Kerasで実現するディープラーニングによるAI競馬予想(回帰分析)

Posted at

回帰分析(regression)

この記事を読む前に「Kerasで実現するディープラーニングによるAI競馬予想(準備編)」の記事を先に読んでください。その中には、機械学習の基礎知識や、学習データで使う説明変数の内容など、他のデータ分析方法と共通する説明が含まれています。

「回帰分析」は数値を目的変数とする場合に使う方法です。競馬予想の場合、例えば走破タイムなど。

ここに公開するPythonのソースコードは「予測誤差」と「決定係数」の評価指標と「散布図」の作成を実装しています。学習データを作るSQLで目的変数の項目名を「target」にすれば、オリジナルの学習データで分析する場合でもそのまま使えます。

ソースコードは学習用と予測用に分けてます。

欠損値(null)は、SQLで何らかの値(0など)に変換しておくことを前提にしてます。欠損値についてPythonでは何もしてないってことです。

学習用ソースコード

以下が「回帰分析」で学習するPythonのソースコードです。この学習用ソースコードのファイル名は「dl_regression_train.py」とします。

PythonのソースコードはUTF-8で保存する必要があります。

dl_regression_train.py
import joblib
import numpy as np
import pandas as pd
from keras.layers import Dense, Dropout
from keras.models import Sequential
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

# CSVファイル読み込み
in_file_name = 'dl_regression_train.csv'
df = pd.read_csv(in_file_name, encoding='SHIFT_JIS')

# 説明変数(x)と目的変数(y)を設定
target = 'target'
x = df.drop(target, axis=1)
y = df[target]

# 訓練データとテストデータを分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# 特徴量の標準化
scaler = StandardScaler()
x_train = scaler.fit_transform(x_train)
x_test = scaler.transform(x_test)

# スケーラーを保存
joblib.dump(scaler, 'regression_scaler.joblib')

# モデルの構築
model = Sequential()
model.add(Dense(128, input_dim=x_train.shape[1], activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1)) # 回帰のため出力層は1つのニューロン

# モデルのコンパイル
model.compile(loss='mean_squared_error', optimizer='adam', metrics=['mean_squared_error'])

# モデルの学習
model.fit(x_train, y_train, epochs=50, batch_size=32, validation_data=(x_test, y_test))

# モデルをファイルに保存
model.save('regression_model.h5')

# テストデータの予測
y_pred = model.predict(x_test)

# 評価指標
loss, mse = model.evaluate(x_test, y_test)
rmse = np.sqrt(mse)
r2 = r2_score(y_test, y_pred)

print(f'予測誤差 = {rmse:.4f}')
print(f'決定係数 = {r2:.4f}')

学習データを作る

説明変数は他の分析方法と共通にしました。内容は「Kerasで実現するディープラーニングによるAI競馬予想(準備編)」の記事を見てください。学習データのファイル名は「dl_regression_train.csv」とします。

今回のサンプルでは目的変数の「確定着順」を、次のように分類してみます。

  • 1着→3
  • 2〜3着→2
  • 4〜5着→1
  • 上記以外→0

PC-KEIBAのWebサイトで、サンプルのSQLを公開しています。ユーザーがカスタマイズして利用することも可能ですし、SQLを学習したい方の参考にもなります。
https://pc-keiba.com/wp/keras-regression/

Kerasに学習させる

今回の例では、Cドライブの直下に「pckeiba」というフォルダを作って、

  • 学習データ(dl_regression_train.csv)
  • 学習用ソースコード(dl_regression_train.py)

2つのファイルを置きます。こういう状態です。

画像

そして、コマンドプロンプトを起動し、次の2つのコマンドを「1行ずつ」実行してください。

cd C:\pckeiba
python dl_regression_train.py

Kerasが学習を開始します。処理が終わると評価指標を表示します。

モデルを評価する

今回のサンプルでは評価指標として「予測誤差」と「決定係数」を表示します。

画像

今回のモデルでは上記のような結果になりました。

  • 予測誤差 = 値が小さいほどモデルの精度が良い
  • 決定係数 = 1 に近いほどモデルの精度が良い

なので、とても使い物にならなさそうですね。この目的変数を走破タイムに変えるなどしたら、精度の高いモデルが出来るかもしれません。回帰分析の評価指標は、この他にもあるのでググって研究してください。

このモデルを「regression_model.h5」に、スケーラーを「regression_scaler.joblib」に保存しています。このファイルは予想するとき使います。

画像

これを使って明日のレースを予想させます。

予測用ソースコード

以下が「回帰分析」で予想するPythonのソースコードです。

PythonのソースコードはUTF-8で保存する必要があります。

dl_regression_pred.py
import joblib
import numpy as np
import pandas as pd
import os
import sys
from keras.models import load_model

# 出馬表ファイル読み込み
fname = sys.argv[1]
x_test = np.loadtxt(fname, delimiter=',', skiprows=1)

# 1行だけの場合でも2次元配列に変換
if x_test.ndim == 1:
    x_test = x_test.reshape(1, -1)

# モデル読み込み
model = load_model('regression_model.h5')
scaler = joblib.load('regression_scaler.joblib')

# 特徴量の標準化
scaled = scaler.transform(x_test)

# データの予測
y_pred = model.predict(scaled)
y_pred = y_pred.flatten() # 予測結果を1次元に変換

# 拡張子を除いたファイル名を取得
fname = os.path.splitext(os.path.basename(fname))[0]

# 予測値を出力
df = pd.DataFrame({'予測値':y_pred})
df.to_csv(fname + '_pred.csv', encoding='SHIFT_JIS', index=False)

出馬表データを作る

予測させる出馬表データは、学習データ作成のSQLと出力後のファイルを少し改造すれば作れます。学習データとの違いは次の2つです。

  1. SQLで目的変数「target」の項目を消す。
  2. SQLで予想するレースでレコードの抽出条件を設定する。

出馬表データのファイル名は何でも良いですが、ここでは「レースID(※1).csv」とします。
今回のサンプルでは「2023/02/04(土)小倉12R」を予想してみます。

(※1)レースID
年月日場R
yyyymmddjjrr(12桁)

PC-KEIBAのWebサイトで、サンプルのSQLを公開しています。ユーザーがカスタマイズして利用することも可能ですし、SQLを学習したい方の参考にもなります。
https://pc-keiba.com/wp/keras-regression/

予測(予想)させる

先ほどと同じ「pckeiba」というフォルダに、

  • 出馬表(レースID(※1).csv)
  • モデル(regression_model.h5)
  • スケーラー(regression_scaler.joblib)
  • 予測用ソースコード(dl_regression_pred.py)

4つのファイルを置きます。こういう状態です。

画像

そして、コマンドプロンプトを起動し、次の2つのコマンドを「1行ずつ」実行してください。2番目は、予測用ソースコードの後に、半角スペースと出馬表のファイル名です。

cd C:\pckeiba
python dl_regression_pred.py 202302041012.csv

処理が終わると「予測値」のファイルが出力されます。

  • レースID(※1)_pred.csv (予測値)

画像

このファイルには数値データしか含まれていないので、分かりにくいかもしれませんが、出馬表データと同じ馬番の昇順で出力されます。馬券を買うときは、SQLで馬番と馬名だけの出馬表をCSVに出力して、そこへ貼り付けて予測値で並べ替えると便利です。例えば、こんな感じです。

画像

「回帰分析」による競馬予想AIの話は以上です。

今回のサンプルはあくまで1つの「サンプル」でしかありません。完成させるのはユーザーのあなたです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?