競馬予想AIの開発がはかどるPythonのソースコード

AI競馬

この記事は、YouTubeでもご覧いただけます。映像とナレーションで内容がよりわかりやすく解説されているので、ぜひ以下のリンクからご覧ください。
■競馬予想AIの開発がはかどるPythonのソースコード
https://youtu.be/HSXkCLDoge0

競馬予想AIの開発がはかどるPythonのソースコード

この記事を読む前に、次の記事を先に読んでください。その中には、機械学習の基礎知識や、学習データで使う説明変数の内容など、他のデータ分析方法と共通する説明が含まれています。

  1. LightGBMによるAI競馬予想(準備編)
  2. Windowsエクスプローラー設定

学習用ソースコード (Development Ver.)

ここに公開するPythonのソースコードを使えば、特徴量選択とハイパーパラメータのチューニングが一度にできて、機械学習モデルの開発がすごくはかどります。

基本の学習用ソースコードに「Boruta」と「Optuna」の実装を統合したものです。時間をかけて作った説明変数が「Boruta」にバッサリ捨てられたときは悲しいですが(笑)

さらに、引数で学習データを指定できるので、複数の機械学習モデルをまとめて作ることもできます。

今回の例では、「二値分類」を使いますが、ハイパーパラメータや評価指標の部分を修正すれば、「多クラス分類」や「回帰分析」にも応用できます。各分析方法の記事でソースコードの差異を確認して、必要に応じて修正してください。

この学習用ソースコードのファイル名は「binary_train_development.py」とします。

学習用ソースコード

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

import matplotlib.pyplot as plt
import numpy as np
import optuna.integration.lightgbm as lgb
import os
import pandas as pd
import sys
np.float = float
np.int = int
from boruta import BorutaPy
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score
from sklearn.metrics import precision_score
from sklearn.metrics import recall_score
from sklearn.model_selection import train_test_split
# CSVファイル読み込み in_file_name = sys.argv[1] 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
# 訓練データとテストデータを分割 x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)
# Borutaによる特徴量選択 estimator = RandomForestClassifier(n_estimators=100, random_state=0, n_jobs=-1) feature_selector = BorutaPy(estimator=estimator, n_estimators='auto', random_state=0, verbose=2, alpha=0.05, max_iter=100) feature_selector.fit(x_train, y_train) x_train = feature_selector.transform(x_train) x_test = feature_selector.transform(x_test)
# LightGBM ハイパーパラメータ params = { 'objective':'binary', # 目的 : 二値分類 'metric':'binary_error', # 評価指標 : 正答率 'num_boost_round':100 }
# モデルの学習 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, num_boost_round=100)
# モデルをファイルに保存 fname = os.path.splitext(in_file_name)[0] fname = fname + '_model.txt' model.save_model(fname)
# テストデータの予測 y_prob = model.predict(x_test) y_pred = np.where(y_prob < 0.5, 0, 1)
# 評価指標 accuracy = accuracy_score(y_test, y_pred) precision = precision_score(y_test, y_pred) recall = recall_score(y_test, y_pred)
# 評価指標をファイルに保存 fname = os.path.splitext(in_file_name)[0] fname = fname + '_score.txt' with open(fname, mode='w') as f: f.write('正解率 = ' + str(accuracy) + '\n') f.write('適合率 = ' + str(precision) + '\n') f.write('再現率 = ' + str(recall) + '\n')
# 特徴量重要度 importance = np.array(model.feature_importance()) selected_features = feature_selector.support_ # Borutaによって選択された特徴のインデックス feature = df.drop(target, axis=1).columns[selected_features] 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軸の設定
# 特徴量重要度をファイルに保存 fname = os.path.splitext(in_file_name)[0] fname = fname + '_model.png' plt.savefig(fname, bbox_inches='tight', dpi=500)

Development Ver.の使い方

前提条件

前提条件として、次の記事で紹介しているPythonのライブラリが全てインストールされていることが必要です。

  1. LightGBMによるAI競馬予想(準備編)
  2. Optunaで競馬予想AIモデルをチューニング
  3. Borutaで競馬予想AIモデルをチューニング

py -m pip install pandas

py -m pip install scikit-learn

py -m pip install lightgbm

py -m pip install matplotlib

py -m pip install optuna

py -m pip install optuna-integration

py -m pip install boruta

インストール済みライブラリの一覧を確認するには、次のコマンドを使えばOK。

pip list

作業用フォルダを作る

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

学習データを作る

今回の例では、「二値分類」の記事で公開している学習データを、芝とダートに分類してみます。

SQLファイルをコピーする

学習データ作成用のSQLファイル「binary_train.sql」をコピーします。「pckeiba」のフォルダはこういう状態です。2つのファイルを置きます。

SQLファイルの名前を変更する

今回の例では、SQLファイルの名前をそれぞれ次のように変更して作業を進めます。

  • binary_train_dirt.sql
  • binary_train_shiba.sql

ファイル名は、自分が分かりやすい名前にすれば何でもOKです。

SQLに抽出条件を追加する

オリジナルの学習データを作る場合は、この節は読み飛ばしてください。必要な学習データの分だけSQLを用意すればOKです。

SQLファイルをサクラエディタで開いて、それぞれの抽出条件を追加します。

ダート(binary_train_dirt.sql)の場合は、次のように抽出条件を追加します。

芝(binary_train_shiba.sql)の場合は、次のように抽出条件を追加します。

学習データCSVを出力する

学習データCSVを出力する」のマニュアルの手順に従って、「学習データCSV出力」画面で学習データCSVを出力します。

2つの学習データCSVを出力したら、「pckeiba」のフォルダはこういう状態です。4つのファイルがあります。

  1. 学習データ(binary_train_dirt.csv)
  2. SQLファイル(binary_train_dirt.sql)
  3. 学習データ(binary_train_shiba.csv)
  4. SQLファイル(binary_train_shiba.sql)

学習データCSVを出力したら、SQLファイルはもう必要ないので別の場所に移動してください。

バッチファイルを作る

その後、「pckeiba」フォルダに学習用ソースコードを置きます。すると、フォルダはこういう状態です。3つのファイルがあります。

  1. 学習用ソースコード(binary_train_development.py)
  2. 学習データ(binary_train_dirt.csv)
  3. 学習データ(binary_train_shiba.csv)

ファイルパスのコピー

Ctrl+A(全選択)でフォルダ内のファイルを全選択。その状態で、Ctrl+Shift+C(パスのコピー)でフォルダ内のファイルのパスをコピーします。

次に、サクラエディタを起動して貼り付け(Ctrl+V)ましょう。

ファイル名の一覧を作る

学習用ソースコードのファイル名の、前のパスを選択(Shift+Home)して、こういう状態にして、コピー(Ctrl+C)します。

コピーしたパスをファイル名だけに変更します。次の手順で作業します。

  1. Ctrl+R(置換)でダイアログを起動
  2. 「置換前」にコピーしたパスを貼り付け(Ctrl+V)
  3. 「置換後」を空白にする
  4. 「すべて置換」ボタンをクリック

後ろのダブルクォーテーションも不要なので、同じ要領ですべて置換します。これでファイル名の一覧ができました。

コマンドを作る

次に、学習用ソースコードのファイル名の先頭に「python」と半角スペースを追加します。ファイル名の後に半角スペースを追加します。こういう状態です。

最後に、正規表現を使って仕上げをします。直前に編集したテキストを切り取って、学習データのファイル名の前に貼り付けます。手順は次のとおりです。

  1. 1行目を全選択して切り取り(Ctrl+X)
  2. Ctrl+R(置換)でダイアログを起動
  3. 「置換前」にキャレット(^)を入力
  4. 「置換後」に切り取りしたコマンドを貼り付け(Ctrl+V)
  5. 「正規表現」にチェック
  6. 「すべて置換」ボタンをクリック

すると、こういう状態になります。コマンドの意味を説明すると、引数で学習データのファイル名を渡して、学習用ソースコードを実行します。

バッチファイルの保存

このファイルを「binary_train_development.bat」という名前で保存(Ctrl+S)します。これでバッチファイルが完成しました。

学習用ソースコードのファイル名と違うのは拡張子だけです。バッチファイルの名前は何でも良いんですが、直感的に分かりやすいのでこうしました。

LightGBMに学習させる

ここまでの手順を進めると、「pckeiba」のフォルダはこういう状態です。4つのファイルがあります。

  1. バッチファイル(binary_train_development.bat)
  2. 学習用ソースコード(binary_train_development.py)
  3. 学習データ(binary_train_dirt.csv)
  4. 学習データ(binary_train_shiba.csv)

バッチファイルの実行

バッチファイルをダブルクリックして、学習用ソースコードを実行します。すると、LightGBMが学習を開始します。まず、「Boruta」が特徴量選択を行います。

その次に、「Optuna」がハイパーパラメータのチューニングを行います。

処理が終わるとコマンドプロンプトが自動的に閉じます。

出力されるファイル

1つの学習データに対して、次の3つのファイルが出力されます。それぞれのファイルの意味は次の通りです。

  1. *_model.png→特徴量重要度
  2. *_model.txt→機械学習モデル
  3. *_score.txt→評価指標

特徴量重要度を見て、特徴量選択の結果を確認します。評価指標を確認して、モデルの品質に納得するまで繰り返します。

完成したら、機械学習モデルを使って予測させます。予測のやり方は「二値分類」の記事を参考にしてください。

では「PC-KEIBA Database」を活用して、AI競馬予想を思う存分楽しんでください!

Pythonソースコードのダウンロード

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