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

AI競艇

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

回帰分析(regression)

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

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

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

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

学習用ソースコード

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

PythonのソースコードはUTF-8で保存する必要があります。何のこっちゃ分からん場合は、このページの最後の、有料会員限定のダウンロードリンクからもファイルをダウンロードできます。

ソースコードはQiitaの記事から簡単にコピーできます。
※ソースコードの右上にあるアイコンをクリックしてください。
https://qiita.com/PC-KYOTEI/items/af8810905c44ec9f0db0

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着→6
  • 2着→5
  • 3着→4
  • 4着→3
  • 5着→2
  • 上記以外→1

このページの最後に、サンプルのSQLを有料会員に公開しています。ユーザーがカスタマイズして利用することも可能ですし、SQLを学習したい方の参考にもなります。

Kerasに学習させる

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

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

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

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

cd C:\pckyotei

python dl_regression_train.py

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

モデルを評価する

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

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

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

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

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

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

予測用ソースコード

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

PythonのソースコードはUTF-8で保存する必要があります。何のこっちゃ分からん場合は、このページの最後の、有料会員限定のダウンロードリンクからもファイルをダウンロードできます。

ソースコードはQiitaの記事から簡単にコピーできます。
※ソースコードの右上にあるアイコンをクリックしてください。
https://qiita.com/PC-KYOTEI/items/af8810905c44ec9f0db0

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」とします。
今回のサンプルでは「2022/10/25(火)常滑12R 第69回ボートレースダービー(SG)」を予想してみます。

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

このページの最後に、サンプルのSQLを有料会員に公開しています。ユーザーがカスタマイズして利用することも可能ですし、SQLを学習したい方の参考にもなります。

予測(予想)させる

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

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

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

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

cd C:\pckyotei

python dl_regression_pred.py 202210250812.csv

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

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

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

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

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

SQLファイルのダウンロードと使い方

コンテンツの残りを閲覧するにはログインが必要です。 お願い . あなたは会員ですか ? 会員について