LightGBMによるAI競艇予想(多クラス分類)

AI競艇

この記事を読む前に「LightGBMによるAI競艇予想(準備編)」の記事を先に読んでください。機械学習の知識や、学習データで使う説明変数の内容など、他のデータ分析方法と共通する説明を書いてます。

多クラス分類(multiclass)

「多クラス分類」は目的変数を多クラスに分類する方法です。「二値分類」の三値以上版みたいなイメージ。

ここに公開するPythonのソースコードは「正解率」の評価指標と「特徴量重要度」の可視化を実装しています。学習データを作るSQLで目的変数の項目名を「target」にすれば、オリジナルの学習データで分析する場合でもそのまま使えます。

目的変数が三値以外の場合、LightGBMパラメータ(num_class)の修正が必要です。

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

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

学習用ソースコード

以下が「多クラス分類」で学習するPythonのソースコードです。

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

import pandas as pd
import numpy as np
import lightgbm as lgb
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
# CSVファイル読み込み in_file_name = 'multiclass_train.csv' df = pd.read_csv(in_file_name, encoding='SHIFT_JIS')
# 説明変数(x)と目的変数(y)を設定 target = 'target' x = df.drop(target, axis=1).values # y以外の特徴量 y = df[target].values
# 説明変数の項目名を取得 feature = list(df.drop(target, axis=1).columns)
# 訓練データとテストデータを分割 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# LightGBM パラメータ params = { 'objective':'multiclass', # 目的 : 多クラス分類 'metric':{'multi_error'}, # 評価指標 : 不正解率(= 1-正解率) 'num_class':3 # クラス数 : 3 }
# モデルの学習 train_set = lgb.Dataset(x_train, y_train) valid_sets = lgb.Dataset(x_test, y_test, reference=train_set) model = lgb.train(params, train_set=train_set, valid_sets=valid_sets)
# モデルをファイルに保存 model.save_model('multiclass_model.txt')
# テストデータの予測 y_prob = model.predict(x_test) y_pred = np.argmax(y_prob, axis=1)
# 評価指標 acc = accuracy_score(y_test, y_pred) print('正解率 = ', acc)
# 特徴量重要度 importance = np.array(model.feature_importance()) df = pd.DataFrame({'feature':feature, 'importance':importance}) df = df.sort_values('importance', ascending=True)
n = len(df) # 説明変数の項目数を取得 values = df['importance'].values plt.barh(range(n), values)
values = df['feature'].values plt.yticks(np.arange(n), values) # x, y軸の設定
plt.show()

学習データを作る

説明変数は他の分析方法と共通にしました。内容は「LightGBMによるAI競艇予想(準備編)」の記事を見てください。学習データのファイル名は「multiclass_train.csv」とします。

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

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

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

LightGBMに学習させる

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

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

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

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

cd C:\pckyotei

python multiclass_train.py

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

モデルを評価する

今回のサンプルでは評価指標として「正解率」を表示します。

正解率という評価指標は、名前のまんまで100%に近いほど良い数字です。今回のモデルでは正解率 = 54%という結果になりました。これを競艇場ごとに分析したら、もっと精度の高いモデルに出来るかもしれません。多クラス分類の評価指標は、正解率の他にもあるのでググって研究してください。

このモデルを「multiclass_model.txt」に保存しています。このファイルは予想するとき使います。

特徴量重要度

参考として「特徴量重要度」の可視化を実装してます。特徴量重要度をざっくり言うと、重要度が高い説明変数ほど、目的変数である着順に対して影響力が強いということです。

これを見ながら説明変数を取捨選択したり、LightGBMパラメータをチューニングしたりします。今回のモデルでは「当地3連率」が最も影響力が強いと判断されました。

あくまで今回のモデルによる結果だから、すべての競艇においてこの結果が当てはまると言うわけじゃないです。

いろいろ試してモデルの精度に納得したら、これを使って明日のレースを予想させます。

予測用ソースコード

以下が「多クラス分類」で予想するPythonのソースコードです。

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

import pandas as pd
import numpy as np
import lightgbm as lgb
import os
import sys
# 出走表ファイル読み込み fname = sys.argv[1] x_test = np.loadtxt(fname, delimiter=',')
# モデル読み込み bst = lgb.Booster(model_file='multiclass_model.txt')
# テストデータの予測 y_prob = bst.predict(x_test, num_iteration=bst.best_iteration) y_pred = np.argmax(y_prob, axis=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)
# 予測確率を出力 df = pd.DataFrame({'0の確率':y_prob[:,0], '1の確率':y_prob[:,1], '2の確率':y_prob[:,2]}) df.to_csv(fname + '_prob.csv', encoding='SHIFT_JIS', index=False)

出走表データを作る

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

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

出走表データのファイル名は何でも良いですが、ここでは「レースID(※1).csv」とします。
今回のサンプルでは「2022/10/25(火)常滑12R 第69回ボートレースダービー(SG)」を予想してみます。

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

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

予測(予想)させる

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

  • 出走表(レースID(※1).csv)
  • モデル(multiclass_model.txt)
  • 予測用ソースコード(multiclass_pred.py)

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

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

python multiclass_pred.py 202210250812.csv

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

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

このファイルは数値のデータ以外に何も無いので分かりにくいですが、出走表データと同じ艇番の昇順で出力されます。これを使って舟券を買うときは、艇番とレーサー氏名だけの出走表をSQLで表計算ソフトに出力して、そこへ貼り付けて確率で並べ替えるとかして使えば良いでしょう。例えばこんな感じです。

レース結果は「2の確率」上位4艇で3連複を的中してます。

「多クラス分類」による競艇予想の話は以上です。

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

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

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