機械学習機能を自前で行う事は可能です。現時点では4通りの方法があります。
- さらだ自体での機能利用
- さらだから外部プロセス利用
- ML.NET Model Builder利用
LightGBM v4.5.0利用(Version 1.8.8で追加)(Version 2.3.6で削除)
さらだ自体はJV-Link対応アプリである為現状32bitアプリとなってます。ML.NETの機能の中には64bitアプリのみサポートされるものがある為にさらだ自体では不可能な部分がある為、外部プロセスとして64bitの機械学習アプリを使う事でML.NETの全てを利用しての機械学習を行えます。ML.NET Model BuilderはCSVファイルを用意すれば手軽に機械学習させる事が出来るものです。
学習させるCSVファイルを用意して、自分が納得いく機械学習をして予想させる事で自分だけの予想する事を可能にしてます。
さらだ自体で機械学習
[分析(A)]-[ML(M)]に新馬、走破タイム、順位の3つがあります。基本的な使用方法は3つとも同じ感じにはしてます。[新馬(S)...]を選択すると
この画面が表示されます。サンプルで学習用データ期間を指定して「CSV」ボタンを押すと学習用CSVデータファイルが出力されます。トレーニング秒数を希望の秒数にして「AutoML」ボタンを押す事で出力したCSVデータを学習して学習モデル(ShinbaTime.zip、上の様に60秒ならShinbaTime60.zip)が出力されます。
外部プロセスで機械学習
上の画面の「AutoML(x64)」ボタンを押すと
機械学習の外部プロセスが起動します。こちらのプロセスは64ビットアプリなのでML.NETのフル機能で学習可能です。良く分からない場合は準備したCSVファイルの大きさに対して適切な秒数を指定して5個ならんだチェックボックス全てにチェックを入れて繰り返し回数を指定して「開始」ボタンを押すと機械学習させる事が出来ます。
Model Builderで機械学習
この方法を行うには多少なりともVisual Studioが使える程度の知識は必要になります。Visual Studioも色々なバージョンがあるかと思いますが、Visual Studio Community 2022が基本学生または教育機関、なんちゃらな個人が該当するんですが、詳細はMSの該当サイトでご確認願います。現行バージョンのML.NET Model Builder Version 17.18.2.2415501では、学習用CSVファイルのサイズが1GB超えるとCSVファイル指定後次に進めない事を確認してます。さらだ Version 1.3.0で行ったフル順位予測用のファクター追加で標準偏差と各馬の偏差値を倍精度実数として1992.1.1~2023.12.31分のCSV出力すると1GB超えて、このトラブルに遭遇。元々Model BuilderやAutoMLではデータを単精度実数としてたと思うので、これらのデータも単精度実数としました。データ開始を1992.1.1にしてるのは1991年の日本ダービーが18頭超えたレースで現行競馬では18頭立てが上限なのでその辺りの制限からです。
Visual Studio起動して「新しいプロジェクトの作成」から適当なプロジェクトを選択してってのもプログラミングとかする訳ではないので
コンソールアプリでかまいません。この画面の見え方もVisual Studioのインストール時に選択してる内容で違ってくると思います。
インストール時に「.NET デスクトップ開発」にチェックは入れておかないとダメです。確かModel Builderの正式名は"ML.NET Model Builder 2022"だったかと。新しいプロジェクトの作成でコンソールアプリを選択して「次へ(N)」で進み
ここでプロジェクト名に好きに名前入れて「次へ(N)」で進み
ここでは多分.NET 8.0が最初から出てきてると思いますが、まあそれ程重要ではないはずなので「作成(C)」します。うちでは既にModel Builderがインストール済みなのでちょっと微妙ですが、[拡張機能]-[拡張機能の管理(M)...]
右上の「検索(Ctrl+E)」の所に"Model Builder"と入力すれば表示されるのでインストールを指定してVisual Studioを終了すると確かインストールされるんだったかと。無事にインストールされたらVisual Studioを起動して先程のプロジェクトを選択する。右側にあるソリューション エクスプローラーの中からプロジェクト名を右クリックして「追加(D)」
にある「機械学習モデル...」
「名前(N):」にある"MLModel1.mbconfig"を"ShinbaTime.mbconfig"に変更して「追加(A)」する。シナリオの選択で
「値の予測」を選び、トレーニング環境の選択ではそのまま「次の手順」で進み
データの追加で入力に「参照...」で、準備したCSVファイルを選択し
「予測する列(ラベル)」で"Souha"を選択し「詳細なデータ オプション...」
で、"Souha"以外の全て列のデータ型が"Single"に、"KaisaiKai"、"KaisaiNichi"、"Kyori"、"Waku"、"Tousu"、"BareiDays"、"Souha"のカテゴリ別のチェックが外れてそれ以外がチェックされている状態にして「保存」する。「次の手順」で進み
で「トレーニングする時間」に秒数してして「高度なトレーニング オプション...」
ここで「二乗平均平方根誤差(RMSE)」を選択し、トレーナーは"Light gradient boosted machine(LightGBM)"のみ選択で良いかと。これ、全てにチェック入れても問題はありませんが、結局成績が良い感じなのはLightGBMなのであえて他を使うと余分な時間が使われる気がするんです。で、「保存」で高度なトレーニング オプションを完了したら「トレーニングの開始」で学習させます。
これがModel Builderでの学習手順となります。新馬戦用("ShinbaTime.csv")の話で説明しましたが、他も同じ手順で可能です。使うCSVを該当するものに変えて予測する列の指定をし、予測する列以外の全てのデータ型が"Single"なのとカテゴリ別のチェックはイメージとしてはほぼ同じ感じです。学習完了するとプロジェクトフォルダ下に同名のフォルダがあり、そこに機械学習モデルで使った名前で拡張子が.mlnetになっているのが出来ているのでそれを採用するならさらだをインストールしたフォルダ下の"ML"フォルダにコピーして指定すれば使えます。
さらだ Version 1.5.1で新馬用にもCKを追加してますので"ShinbaTimeCK.csv"を利用して"HahaHahaHaha"項目と"Kishu"項目の間に36項目が追加されてます。これら全てカテゴリ別は×です。
さらだVersion 2.2.6以降で血統情報は文字列に変更したので"Chichi"~"HahaHahaHaha"はデータ型を"String"に設定する必要があります。
通常予測の学習では"SouhaTime.csv"を利用して"Souha"以外の全ての列のデータ型が"Single"にカテゴリ別は
| カラム名 | カテゴリ別 |
| JouCD | ○ |
| KaisaiTuki | ○ |
| KaisaiKai | × |
| KaisaiNichi | × |
| TrackCD | ○ |
| Course | ○ |
| Kyori | × |
| Waku | × |
| Tousu | × |
| Tenko | ○ |
| Baba | ○ |
| Barei | × |
| Sex | ○ |
| Blinkers | ○ |
| Kinryo | × |
| Chichi | ○ |
| Haha | ○ |
| ChichiChichi | ○ |
| ChichiHaha | ○ |
| HahaChichi | ○ |
| HahaHaha | ○ |
| ChichiChichiChichi | ○ |
| ChichiChichiHaha | ○ |
| ChichiHahaChichi | ○ |
| ChichiHahaHaha | ○ |
| HahaChichiChichi | ○ |
| HahaChichiHaha | ○ |
| HahaHahaChichi | ○ |
| HahaHahaHaha | ○ |
| Kisyu | ○ |
| Chokyosi | ○ |
| PrevJouCD1 | ○ |
| PrevTuki1 | ○ |
| PrevKai1 | × |
| PrevNichi1 | × |
| PrevTrackCD1 | ○ |
| PrevCourse1 | ○ |
| PrevKyori1 | × |
| PrevKyosouJouken1 | ○ |
| PrevKyosouShubetu1 | ○ |
| PrevJuuryoShubetu1 | ○ |
| PrevWaku1 | × |
| PrevTousu1 | × |
| PrevTenko1 | ○ |
| PrevBaba1 | ○ |
| PrevBarei1 | × |
| PrevSex1 | ○ |
| PrevKinryo1 | × |
| PrevKishu1 | ○ |
| PrevJuni1 | × |
| Prev1Corner1 | × |
| Prev2Corner1 | × |
| Prev3Corner1 | × |
| Prev4Corner1 | × |
| PrevAto4Furlong1 | × |
| PrevAto3Furlong1 | × |
| PrevDate1 | × |
| PrevChakusa1 | × |
| PrevTimeSa1 | × |
| PrevSouha1 | × |
| PrevJouCD2 | ○ |
| PrevTuki2 | ○ |
| PrevKai2 | × |
| PrevNichi2 | × |
| PrevTrackCD2 | ○ |
| PrevCourse2 | ○ |
| PrevKyori2 | × |
| PrevKyosouJouken2 | ○ |
| PrevKyosouShubetu2 | ○ |
| PrevJuuryoShubetu2 | ○ |
| PrevWaku2 | × |
| PrevTousu2 | × |
| PrevTenko2 | ○ |
| PrevBaba2 | ○ |
| PrevBarei2 | × |
| PrevSex2 | ○ |
| PrevKinryo2 | × |
| PrevKishu2 | ○ |
| PrevJuni2 | × |
| Prev1Corner2 | × |
| Prev2Corner2 | × |
| Prev3Corner2 | × |
| Prev4Corner2 | × |
| PrevAto4Furlong2 | × |
| PrevAto3Furlong2 | × |
| PrevDate2 | × |
| PrevChakusa2 | × |
| PrevTimeSa2 | × |
| PrevSouha2 | × |
| PrevJouCD3 | ○ |
| PrevTuki3 | ○ |
| PrevKai3 | × |
| PrevNichi3 | × |
| PrevTrackCD3 | ○ |
| PrevCourse3 | ○ |
| PrevKyori3 | × |
| PrevWaku3 | × |
| PrevTousu3 | × |
| PrevTenko3 | ○ |
| PrevBaba3 | ○ |
| PrevBarei3 | × |
| PrevSex3 | ○ |
| PrevKinryo3 | × |
| PrevKyosouJouken3 | ○ |
| PrevKyosouShubetu3 | ○ |
| PrevJuuryoShubetu3 | ○ |
| PrevKishu3 | ○ |
| PrevJuni3 | × |
| Prev1Corner3 | × |
| Prev2Corner3 | × |
| Prev3Corner3 | × |
| Prev4Corner3 | × |
| PrevAto4Furlong3 | × |
| PrevAto3Furlong3 | × |
| PrevDate3 | × |
| PrevChakusa3 | × |
| PrevTimeSa3 | × |
| PrevSouha3 | × |
| PrevJouCD4 | ○ |
| PrevTuki4 | ○ |
| PrevKai4 | × |
| PrevNichi4 | × |
| PrevTrackCD4 | ○ |
| PrevCourse4 | ○ |
| PrevKyori4 | × |
| PrevKyosouJouken4 | ○ |
| PrevKyosouShubetu4 | ○ |
| PrevJuuryoShubetu4 | ○ |
| PrevWaku4 | × |
| PrevTousu4 | × |
| PrevTenko4 | ○ |
| PrevBaba4 | ○ |
| PrevBarei4 | × |
| PrevSex4 | ○ |
| PrevKinryo4 | × |
| PrevKishu4 | ○ |
| PrevJuni4 | × |
| Prev1Corner4 | × |
| Prev2Corner4 | × |
| Prev3Corner4 | × |
| Prev4Corner4 | × |
| PrevAto4Furlong4 | × |
| PrevAto3Furlong4 | × |
| PrevDate4 | × |
| PrevChakusa4 | × |
| PrevTimeSa4 | × |
| PrevSouha4 | × |
| PrevJouCD5 | ○ |
| PrevTuki5 | ○ |
| PrevKai5 | × |
| PrevNichi5 | × |
| PrevTrackCD5 | ○ |
| PrevCourse5 | ○ |
| PrevKyori5 | × |
| PrevKyosouJouken5 | ○ |
| PrevKyosouShubetu5 | ○ |
| PrevJuuryoShubetu5 | ○ |
| PrevWaku5 | × |
| PrevTousu5 | × |
| PrevTenko5 | ○ |
| PrevBaba5 | ○ |
| PrevBarei5 | × |
| PrevSex5 | ○ |
| PrevKinryo5 | × |
| PrevKishu5 | ○ |
| PrevJuni5 | × |
| Prev1Corner5 | × |
| Prev2Corner5 | × |
| Prev3Corner5 | × |
| Prev4Corner5 | × |
| PrevAto4Furlong5 | × |
| PrevAto3Furlong5 | × |
| PrevDate5 | × |
| PrevChakusa5 | × |
| PrevTimeSa5 | × |
| PrevSouha5 | × |
| Souha | × |
として頂ければと思います。
さらだ Version 1.5.0で追加されたCKでは"SouhaTimeCK.csv"を利用して上記に追加で"HahaHahaHaha"項目と"Kishu"項目の間に378項目が追加されてます。"HirachiShokin"から"CSChakuX"までです。これら全てカテゴリ別は×です。
さらだ Version 2.4.0で過去走に競走条件、競走種別、重量種別を追加してます。これら全てカテゴリ別は○です。
順位予測の学習では"RaceJuni.csv"を利用して「予測する列(ラベル)」で"Juni"を選択し、"Juni"以外の全ての列のデータ型が"Single"にカテゴリ別は
| カラム名 | カテゴリ別 |
| JouCD | ○ |
| KaisaiTuki | ○ |
| KaisaiKai | × |
| KaisaiNichi | × |
| TrackCD | ○ |
| Course | ○ |
| Kyori | × |
| Tousu | × |
| Tenko | ○ |
| Baba | ○ |
| KyosouShubetu | ○ |
| KyosouJouken | ○ |
| JuuryoShubetu | ○ |
| Uma1Souha | × |
| Uma2Souha | × |
| Uma3Souha | × |
| Uma4Souha | × |
| Uma5Souha | × |
| Uma6Souha | × |
| Uma7Souha | × |
| Uma8Souha | × |
| Uma9Souha | × |
| Uma10Souha | × |
| Uma11Souha | × |
| Uma12Souha | × |
| Uma13Souha | × |
| Uma14Souha | × |
| Uma15Souha | × |
| Uma16Souha | × |
| Uma17Souha | × |
| Uma18Souha | × |
| Umaban | × |
| Juni | × |
として頂ければと思います。
フル順位予測の学習では"RaceJuniFull.csv"を利用して「予測する列(ラベル)」で"Juni"を選択し、"Juni"以外の全ての列のデータ型が"Single"にカテゴリ別は
| カラム名 | カテゴリ別 |
| JouCD | ○ |
| KaisaiTuki | ○ |
| KaisaiKai | × |
| KaisaiNichi | × |
| TrackCD | ○ |
| Course | ○ |
| Kyori | × |
| Tousu | × |
| Tenko | ○ |
| Baba | ○ |
| KyosouShubetu | ○ |
| KyosouJouken | ○ |
| JuuryoShubetu | ○ |
| StandardDeviation | × |
| Uma1Barei | × |
| Uma1Sex | ○ |
| Uma1Blinkers | ○ |
| Uma1Kinryo | × |
| Uma1Kishu | ○ |
| Uma1Chokyosi | ○ |
| Uma1Souha | × |
| Uma1DeviationValues | × |
| Uma2Barei | × |
| Uma2Sex | ○ |
| Uma2Blinkers | ○ |
| Uma2Kinryo | × |
| Uma2Kishu | ○ |
| Uma2Chokyosi | ○ |
| Uma2Souha | × |
| Uma2DeviationValues | × |
| Uma3Barei | × |
| Uma3Sex | ○ |
| Uma3Blinkers | ○ |
| Uma3Kinryo | × |
| Uma3Kishu | ○ |
| Uma3Chokyosi | ○ |
| Uma3Souha | × |
| Uma3DeviationValues | × |
| Uma4Barei | × |
| Uma4Sex | ○ |
| Uma4Blinkers | ○ |
| Uma4Kinryo | × |
| Uma4Kishu | ○ |
| Uma4Chokyosi | ○ |
| Uma4Souha | × |
| Uma4DeviationValues | × |
| Uma5Barei | × |
| Uma5Sex | ○ |
| Uma5Blinkers | ○ |
| Uma5Kinryo | × |
| Uma5Kishu | ○ |
| Uma5Chokyosi | ○ |
| Uma5Souha | × |
| Uma5DeviationValues | × |
| Uma6Barei | × |
| Uma6Sex | ○ |
| Uma6Blinkers | ○ |
| Uma6Kinryo | × |
| Uma6Kishu | ○ |
| Uma6Chokyosi | ○ |
| Uma6Souha | × |
| Uma6DeviationValues | × |
| Uma7Barei | × |
| Uma7Sex | ○ |
| Uma7Blinkers | ○ |
| Uma7Kinryo | × |
| Uma7Kishu | ○ |
| Uma7Chokyosi | ○ |
| Uma7Souha | × |
| Uma7DeviationValues | × |
| Uma8Barei | × |
| Uma8Sex | ○ |
| Uma8Blinkers | ○ |
| Uma8Kinryo | × |
| Uma8Kishu | ○ |
| Uma8Chokyosi | ○ |
| Uma8Souha | × |
| Uma8DeviationValues | × |
| Uma9Barei | × |
| Uma9Sex | ○ |
| Uma9Blinkers | ○ |
| Uma9Kinryo | × |
| Uma9Kishu | ○ |
| Uma9Chokyosi | ○ |
| Uma9Souha | × |
| Uma9DeviationValues | × |
| Uma10Barei | × |
| Uma10Sex | ○ |
| Uma10Blinkers | ○ |
| Uma10Kinryo | × |
| Uma10Kishu | ○ |
| Uma10Chokyosi | ○ |
| Uma10Souha | × |
| Uma10DeviationValues | × |
| Uma11Barei | × |
| Uma11Sex | ○ |
| Uma11Blinkers | ○ |
| Uma11Kinryo | × |
| Uma11Kishu | ○ |
| Uma11Chokyosi | ○ |
| Uma11Souha | × |
| Uma11DeviationValues | × |
| Uma12Barei | × |
| Uma12Sex | ○ |
| Uma12Blinkers | ○ |
| Uma12Kinryo | × |
| Uma12Kishu | ○ |
| Uma12Chokyosi | ○ |
| Uma12Souha | × |
| Uma12DeviationValues | × |
| Uma13Barei | × |
| Uma13Sex | ○ |
| Uma13Blinkers | ○ |
| Uma13Kinryo | × |
| Uma13Kishu | ○ |
| Uma13Chokyosi | ○ |
| Uma13Souha | × |
| Uma13DeviationValues | × |
| Uma14Barei | × |
| Uma14Sex | ○ |
| Uma14Blinkers | ○ |
| Uma14Kinryo | × |
| Uma14Kishu | ○ |
| Uma14Chokyosi | ○ |
| Uma14Souha | × |
| Uma14DeviationValues | × |
| Uma15Barei | × |
| Uma15Sex | ○ |
| Uma15Blinkers | ○ |
| Uma15Kinryo | × |
| Uma15Kishu | ○ |
| Uma15Chokyosi | ○ |
| Uma15Souha | × |
| Uma15DeviationValues | × |
| Uma16Barei | × |
| Uma16Sex | ○ |
| Uma16Blinkers | ○ |
| Uma16Kinryo | × |
| Uma16Kishu | ○ |
| Uma16Chokyosi | ○ |
| Uma16Souha | × |
| Uma16DeviationValues | × |
| Uma17Barei | × |
| Uma17Sex | ○ |
| Uma17Blinkers | ○ |
| Uma17Kinryo | × |
| Uma17Kishu | ○ |
| Uma17Chokyosi | ○ |
| Uma17Souha | × |
| Uma17DeviationValues | × |
| Uma18Barei | × |
| Uma18Sex | ○ |
| Uma18Blinkers | ○ |
| Uma18Kinryo | × |
| Uma18Kishu | ○ |
| Uma18Chokyosi | ○ |
| Uma18Souha | × |
| Uma18DeviationValues | × |
| Umaban | × |
| Juni | × |
として頂ければと思います。
さらだ Version 1.5.4で追加されたCKでは"RaceJuniFullCK.csv"を利用して頂き、"Uma1Kyakusitu1"、"Uma1Kyakusitu2"、"Uma1Kyakusitu3"、"Uma1Kyakusitu4"という4項目が各馬18頭分追加されてますのでこれら全てカテゴリ別は×です。
さらだ自体で機械学習もしくは外部プロセスで機械学習した場合はさらだがインストールされたフォルダの下にあるMLフォルダに学習モデルファイルが出来ます。Model Builderでは作成したプロジェクトフォルダの方に学習モデルファイルが作成される。
実際の予想で作成した学習モデルを利用するには[ツール]-[オプション]で「ML選択」タグにある「新馬戦」、「全般」、「順位」にそれぞれ学習モデルファイルを指定します。
自分自身は学習モデルファイルにRMSEを入れてますので上記の様になってます。(単純にエクスプローラーで名前の変更してるだけです。)何回か学習させて検証を見て選択しやすい様にする為の工夫です。
| 種別 | 学習モデル |
| 新馬戦 | ShinbaTime.mlnet,ShinbaTimeCK.mlnet,ShinbaTime.zip,ShinbaTimeCK.zip等 |
| 全般 | SouhaTime.mlnet,SouhaTimeCK.mlnet,SouhaTime.zip,SouhaTimeCK.zip等 |
| 順位 | RaceJuni.mlnet,RaceJuniFull.mlnet,RaceJuniFullCK.mlnet, RaceJuni.zip,RaceJuniFull.zip,RaceJuniFullCK.zip等 |
LightGBM v4.5.0で学習
本来ならML.NETのAutoMLでLightGBM v4.5.0が利用出来るのが筋だとは思いますが、現状LightGBM v3.3.5が使われてます。Model Builderがどのバージョン採用しているかは不明です。仕方なくさらだVersion 1.8.8で外部プロセスとして追加してます。利用方法はリリースの所を参照してください。(ML.NETのAutoMLでLightGBM v4.6.0が利用される様になった為、こちらは削除)















