あまり荒れる事がないレースって印象ではありますが
えむあいてぃのメモ
自分の記録用
2025/06/01
2025/05/31
JRA-VANデータラボ
定義的な話は別として、JRA-VANの有料サービス契約してJV-Linkを使ってデータ取得するのは基本なんです。自分が感じた感覚的な話ではありますが、JRA-VANはソフトウェア開発においては素人の集団でほぼ役に立たないJRAからの天下り的なメンバーなんだと感じます。いや、あくまで外野の感じたフィーリングからなので、実際にはどうなのかは知りませんのであしからず。
そんな事は別にしてJRA-VANが提供するData Labのデータ提供を活用してデータ取得するにはJV-Linkの利用を強要してるのは既成事実。これが32bit環境を強要しているのも事実。何度かここでも書いてますが、AutoMLやLightGBM、多分TensorFlowもなんだと思いますが64bitを要求してます。で、Data-Labの提供データを利用するアプリとしては32bitに制限されるので、ここまではアプリ本体を32bitで行いData-LabのデータをSQLiteに蓄積して利用する方向で、64bitが必要な部分に関しては外部プロセスとして連携する事で実現してきました。
最近やってた事はTensorFlowでの機械学習なんですが、これの実装でまた外部? もう外部多過ぎだよねぇっと考えて、単にJV-Link経由でデータ取得する部分のみ32bitで外部プロセスとしておけば、残りのアプリ本体は64bitで行けるんじゃないかって話です。
で、ここまでWindowsフォームアプリの開発してきました。これってそもそもの始まりは、多分Visual Basicなんだと思います。MS-DOSの時代にMS-DOSに乗せる形で起動してたWindows Version 2.1辺りとかまではアプリ開発も非常にハードルが高く、Cなんかで苦労して色々する所を、記憶的には曖昧ですが、Windows 95辺りでMS-DOSから独立(?)して単独なOSとして動くようになり、アプリ開発をビジュアル的な行える様にしたのがVBの始まりだったと思います。これに慣れているとWin UI3とかでって本当に原始的? この辺りは流石MSです(笑) 最先端OSのWindows 11的なアプリにはWin UI3を使う事でって事の様なんですが、これが本当に地味なもので、ここ最近は何度もトライして挫折の繰り返しorz ただ、今回はちょっと本腰入れての取り組みなので今日も1日やってました。
アプリを64bit化及びWin UI3に
思う所があり、今ならまだ間に合う? いや、年齢的にね、ここで気合い入れればまだやり遂げられる? JRA-VANのJV-Linkの64bit化について公式は相変わらずの無反応。諸々が64bitでないと動かない為に外部プロセスとして実装試みてきましたが、これが間違った対応だったんじゃないかと思えてきました。JV-Linkを使ってデータ取得する部分は確かに32bitでなければ動きませんが、その取得したデータを64bitのアプリに渡す32bitの外部プロセスを作って64bitアプリから利用するって考えれば、全てがスムーズに行える様に思えてきました。
まあ、64bit化してアプリを作り直すならWindowsフォームアプリではなく、最近のWindows11的なアプリにしていく必要があるかなぁって事でWin UI3になる訳です。これまでにも何度かWin UI3はいじってみたのですが、Windowsフォームに比べたら、まあ所謂Visualって事ではなくコード書くんかい!ってなものね。これが本当に面倒な気がしてますが、楽に開発出来ないのか知りたいです。なので、まっさらな状態からやる事になるので、しばらくは「さらだ」の開発は「さらだ64」目指すので頓挫する可能性もありますし、ちょっと時間頂く事になるかと思います。ってここに書くのも微妙ですが、サポートサイトに書いちゃうと確定事項的に後戻りも出来なくなる気がするので、あえてこちらに書きます。ユーザー様の何人かはこちらにも着て頂いているかと思うので😅
2025/05/25
第86回優駿牝馬(オークス)
朝から色々やってたら、結局Win5の締切に間に合わずですが、まあ、当たらんから良いか(笑)
たった今終わった東京10Rは当たったかな😁 え?
これ、こんなに付いたの?(笑)
本日の勝ちが確定しました^^
2025/05/24
少し進展した
継続は力とはよく聞きますが、諦めずにやれる事を続けてきてます。そもそもの原因は自分の理解不足なのは承知してます。更にCopilotに振り回されても耐えられる忍耐と多分知力かなぁ。まあ、なんにしてもRMSEが38辺りでって問題は突破出来た。簡単に言えば、層の構築方法に問題があった模様です。
って事で、本来のデータを使った訓練スタートしてます。相変わらずのサイズなので38分/epochで50epochsを試してますので32時間弱かな。明日夜には終わる予定なので、そこまで無難に訓練されていれば良いのですが、数値的に問題があったりしたら中断するかもです。現時点では3epochがRMSE 18辺りなんですが、少なくとも明日朝にはRMSE 2未満になっている事を期待したいかな。
で、まあ、これが順調に終わったと仮定すると、新馬戦用、通常用、順位予測の3本建てのモデルが揃うってか、そもそも新馬戦用と通常用が出来た時点で、これを使った順位予測用学習データ出力にしなければならなくて、それを使って順位予測の訓練をする必要もある。この辺りをまとめて外部プロセスとしてLightGBMでも作った感じのものをTensorFlow用にも作成してアプリに同胞出来る様に仕上げる訳ですが、ダービーには間に合わないorz
それでもそれ仕上げるのとUI変更なんかもこれから徐々に進めてもう少しだけ良いものになればと思ってます。まだまだやる事が山ほど有るな😓
追記 2025.5.25 7:44
あと少しで29epochが終わりますがRMSEはやっと16未満になる辺り。ただ、じりじりと下がってはいるので回数が必要なんだと。順位の時だったか500epochを5日半とか掛けてやりましたが、この通常用でやると13日ちょい掛かるって2週間ぶん回すのはキツイなぁ。電気代もそうだけど、このポンコツPCにトドメ刺しそう。しかもね、これ、そこまでやって本当に良い結果が得られる保証は無い。単純計算では2週間このポンコツ(750W電源使用)回すと7千円以上の電気代になるっぽい。アイドル状態ではなく、機械学習してるとほぼPCのファンがうるさい状態って事はかなり電気は消費してると思われますしね。
これは酷い!
こちらにも何度も書いてますが、Microsoft Rewardsはほぼ欠かさず参加してます。夜勤で、人数調整の為に半日有休で帰宅して、日付が変わっているので本日分の「日々のセット」内のクイズで
何をどうするとこんな事になるんだろ? 40年以上前に"Where are you from?"ってアメリカ人に聞かれて"From Japan."と答えると"Hong Kong?"って...遥か遠くのアジアの話ならってのも本来微妙だけど、自国の話でしょ? いや、もしかしてこの問題作ったのはMicrosoftとは無関係でアメリカとは無縁の場所の方が?
2025/05/23
全くの謎
TensorFlowの理解が全く進まない。
これが現時点の問題で、5epoch辺りで収束してそれ以上改善されない。先週はこれに挑んで、まあ、こんなグラフ出力までしても何の改善方法も見つけられない。昨夜久しぶりに新馬戦用の訓練もしてました。20時間弱で500epochsをこなし、見てる限りはRMSE 2.0辺りまで行ってましたが、最終的な表示は8.9とかだったかな? これはなんか計算方法間違えてるのかは疑問だが、それでも500回でもまだモデル自体は収束ってまあ、確かになかなかそれ以上は進まない感じながらもじりじりとで、たった5回程度で収束方向ってのとは違う。
今回改めて新馬戦用の訓練を実行したのは、Anacondaの仮想環境の再構築ってか、そもそも以前ちょっと試してダメだったGPUの力を少し試すってのをね、まあ、うちのPCは今年の夏には丸7年になるポンコツで、NVIDIA GeForce GTX 1050Tiに4GBメモリなZOTAC ZTGTX1050TI-4GD5MINI001/ZT-P10510A-10って18,800円のグラボしか載ってないのでほぼ助けにはならないのは覚悟でCUDAとcuDNNを以前インストールしたらVisual Studioの動きに支障があったのでアンインストールして放置してたんですが、
- CUDA 12.9.0
- cuDNN 9.10.1
をインストールして仮想環境を再構築しました。今回は一応NVIDIA公式のCUDA Installation Guide for Microsoft Windowsを参考に
- conda install cuda -c nvidia
としてAnaconda側でもCUDAを入れて
- python -m pip install --upgrade setuptools pip wheel
とする事で
- python -m pip install nvidia-pyindex
これが出来る様になるらしい。で、仮想環境を構築する準備が出来たので仮想環境をPython 3.9で作成して
- tensorflow
- pandas
- scikit-learn
をpip使って入れて、新馬戦用はこれで足りますが、通常版ではグラフ出したりするので更に
- livelossplot
- ipython
も入れてます。
でも、ここまでしても流石にグラボの恩恵はほぼ感じられない😞
2025/05/18
特徴量を正規化し、学習率を徐々に減少させる方法
層毎のユニット数調整では顕著な変化は見られなかったので新たな試みとして
- 特徴量の正規化
- 学習率の調整
をCopilotの助言を元に施してみました。
- from tensorflow.keras.layers import Activation, BatchNormalization
- x = Dense(256)(merged_features)
- x = BatchNormalization()(x)
- x = Activation('relu')(x)
- x = Dropout(0.3)(x)
- x = Dense(128)(x)
- x = BatchNormalization()(x)
- x = Activation('relu')(x)
- x = Dropout(0.3)(x)
- x = Dense(64)(x)
- x = BatchNormalization()(x)
- x = Activation('relu')(x)
- uma_networks.append(x)
これが特徴量の正規化追加した部分で
- from tensorflow.keras.optimizers import Adam
- # 学習率を指定
- initial_learning_rate = 0.001
- lr_schedule = tf.keras.optimizers.schedules.ExponentialDecay(
- initial_learning_rate, decay_steps=10000, decay_rate=0.9, staircase=True)
- optimizer = Adam(learning_rate=lr_schedule)
- # モデルをコンパイル
- model.compile(optimizer=optimizer, loss='mse', metrics=['mae', root_mean_squared_error])
これがExponentialDecayを利用して
- decay_steps=10000: 1 万ステップごとに減衰
- decay_rate=0.9: 10% ずつ減衰
- staircase=True: 段階的に学習率を減らす
としているらしい。50epochsで既に開始して、今までだとRMSE 38辺りが限界値的に得られた程度だったんですが、7epoch辺りで到達してここから更に良くなるかが気になる所です。まあ、CopilotにはDropout(0.3)はちょっと大きいのでDropout(0.2)にしてみてはってアドバイスも頂いてるので、それも試そうとは思ってます。
最近のLightGBM
ここ最近はTensorFlowに労力全て持っていかれて他に手が回らない状態が続いてます。やりたい事は山ほどあるけどってのと、やはり現在のPCの能力の低さが痛いです。
まあ、そんな中でも久しぶりに現在のLightGBMの今年の検証をしてみました。2025.1.1~2025.5.11分です。
- SouhaTimeCK13762_1_31_2172.lgbm
1,227R 1点 芝(529R) ダート(652R) 障害(46R) 8頭以下(48R) 9~12頭(265R) 13頭以上(914R) 多点 単勝 23.63%
(87.19%)21.36%
(98.07%)25.15%
(78.68%)28.26%
(82.61%)47.92%
(136.87%)28.30%
(85.06%)21.01%
(85.20%)53.14%
(85.47%)複勝 51.26%
(83.46%)48.02%
(85.44%)53.53%
(82.15%)56.52%
(79.35%)66.67%
(92.71%)55.85%
(81.55%)49.12%
(83.53%)85.82%
(80.81%)枠連 13.43%
(92.55%)11.09%
(86.00%)15.17%
(99.32%)12.82%
(60.00%)--
(--)14.72%
(66.98%)12.36%
(95.21%)27.83%
(80.83%)馬連 9.13%
(71.43%)6.62%
(53.91%)11.04%
(86.92%)10.87%
(53.48%)10.42%
(33.96%)11.70%
(71.70%)8.32%
(73.33%)19.48%
(68.45%)ワイド 19.89%
(76.42%)16.07%
(63.40%)22.09%
(83.97%)32.61%
(119.13%)29.17%
(51.67%)26.42%
(74.68%)17.51%
(78.23%)39.61%
(72.15%)馬単 5.54%
(75.24%)4.73%
(87.73%)5.98%
(65.32%)8.70%
(72.17%)10.42%
(67.08%)7.55%
(89.47%)4.70%
(71.54%)19.48%
(69.32%)三連複 4.07%
(49.41%)3.59%
(24.52%)4.29%
(67.87%)6.52%
(73.91%)10.42%
(63.96%)7.92%
(65.81%)2.63%
(43.88%)11.74%
(56.12%)三連単 0.81%
(21.65%)0.76%
(15.33%)0.92%
(28.31%)0.00%
(0.00%)4.17%
(93.75%)1.89%
(48.30%)0.33%
(10.14%)11.74%
(52.80%)総合 52.97%
(69.45%)50.28%
(63.94%)54.91%
(73.98%)56.52%
(67.73%)72.92%
(77.14%)56.98%
(72.94%)50.77%
(67.63%)86.31%
(62.51%) - RaceJuniFullCK36570_1_39_419.lgbm
1,272R 1点 芝(548R) ダート(678R) 障害(46R) 8頭以下(48R) 9~12頭(268R) 13頭以上(956R) 多点 単勝 21.31%
(81.12%)18.07%
(88.14%)23.30%
(74.16%)30.43%
(100.22%)37.50%
(100.83%)24.25%
(90.63%)19.67%
(77.47%)50.79%
(89.18%)複勝 50.47%
(84.58%)47.45%
(86.04%)52.36%
(83.11%)58.70%
(88.70%)62.50%
(86.67%)58.21%
(94.63%)47.70%
(81.65%)84.75%
(82.22%)枠連 12.06%
(87.98%)9.81%
(78.37%)13.66%
(94.01%)12.82%
(104.10%)--
(--)13.43%
(62.76%)11.09%
(90.72%)26.00%
(74.86%)馬連 8.25%
(70.29%)6.20%
(66.48%)9.88%
(75.37%)8.70%
(40.87%)10.42%
(33.96%)10.82%
(74.48%)7.43%
(70.94%)18.79%
(107.09%)ワイド 18.63%
(74.61%)16.06%
(72.17%)20.06%
(76.00%)28.26%
(83.26%)33.33%
(59.79%)26.49%
(87.16%)15.69%
(71.84%)39.62%
(81.72%)馬単 4.32%
(58.28%)3.28%
(58.70%)4.87%
(56.99%)8.70%
(72.17%)10.42%
(67.08%)5.22%
(71.57%)3.77%
(54.11%)18.79%
(111.78%)三連複 3.38%
(40.63%)3.47%
(29.69%)3.39%
(49.66%)2.17%
(37.83%)14.58%
(96.04%)5.22%
(45.56%)2.30%
(36.46%)10.30%
(48.55%)三連単 0.71%
(44.70%)0.36%
(8.21%)1.03%
(77.23%)0.00%
(0.00%)4.17%
(93.75%)0.37%
(5.11%)0.63%
(53.34%)10.30%
(47.10%)総合 52.20%
(67.58%)49.45%
(60.70%)53.98%
(73.24%)58.70%
(65.15%)66.67%
(76.88%)59.70%
(66.49%)49.37%
(67.07%)85.06%
(67.29%)
決して褒められたレベルではないのは確かです。まあ、だからTensorFlowに期待して作業進めてるんですがね。
追記 2025.5.18 10:36
比較としてモデルビルダーも載せておきます。
- SouhaTimeCK.mlnet
1,227R 1点 芝(529R) ダート(652R) 障害(46R) 8頭以下(48R) 9~12頭(265R) 13頭以上(914R) 多点 単勝 21.35%
(84.25%)17.58%
(75.60%)24.69%
(93.17%)17.39%
(57.39%)31.25%
(125.00%)22.64%
(77.25%)20.46%
(84.15%)49.47%
(77.12%)複勝 51.02%
(85.97%)45.75%
(78.36%)55.06%
(92.71%)54.35%
(78.04%)60.42%
(91.67%)56.23%
(84.83%)49.02%
(86.01%)85.90%
(83.74%)枠連 12.01%
(77.44%)9.57%
(66.93%)13.27%
(73.78%)20.51%
(260.77%)--
(--)15.09%
(99.40%)10.50%
(67.09%)27.03%
(91.36%)馬連 7.17%
(59.21%)5.29%
(45.82%)8.44%
(61.18%)10.87%
(185.22%)10.42%
(79.37%)10.19%
(88.49%)6.13%
(49.66%)19.32%
(76.03%)ワイド 20.95%
(86.59%)18.15%
(80.95%)23.31%
(90.05%)19.57%
(102.39%)35.42%
(96.04%)27.92%
(94.94%)18.16%
(83.67%)40.34%
(80.47%)馬単 3.83%
(54.95%)2.65%
(46.18%)4.91%
(64.48%)2.17%
(20.65%)6.25%
(117.92%)4.91%
(71.55%)3.39%
(46.83%)19.32%
(71.10%)三連複 5.05%
(78.08%)4.73%
(92.31%)5.52%
(71.15%)2.17%
(12.83%)6.25%
(32.92%)7.55%
(73.09%)4.27%
(81.90%)13.77%
(74.77%)三連単 0.73%
(41.21%)0.38%
(59.77%)1.07%
(29.05%)0.00%
(0.00%)0.00%
(0.00%)0.38%
(5.17%)0.88%
(53.82%)13.77%
(76.23%)総合 52.73%
(70.90%)47.64%
(68.26%)56.60%
(71.94%)56.52%
(86.34%)68.75%
(77.56%)57.74%
(74.34%)50.44%
(69.14%)86.63%
(77.05%) - RaceJuniFullCK.mlnet
1,272R 1点 芝(548R) ダート(678R) 障害(46R) 8頭以下(48R) 9~12頭(268R) 13頭以上(956R) 多点 単勝 19.42%
(73.78%)15.15%
(61.15%)23.01%
(85.90%)17.39%
(45.65%)33.33%
(126.25%)22.01%
(71.31%)17.99%
(71.84%)48.98%
(75.59%)複勝 48.51%
(82.84%)42.15%
(76.51%)53.10%
(88.41%)56.52%
(76.09%)62.50%
(93.13%)53.73%
(86.27%)46.34%
(81.36%)85.46%
(84.03%)枠連 12.15%
(80.00%)10.44%
(81.52%)13.35%
(77.97%)12.82%
(95.64%)--
(--)17.91%
(109.85%)9.94%
(67.70%)25.74%
(86.78%)馬連 7.86%
(79.50%)6.39%
(65.73%)9.14%
(92.57%)6.52%
(50.87%)12.50%
(94.37%)12.69%
(104.14%)6.28%
(71.84%)18.71%
(77.90%)ワイド 20.60%
(93.10%)17.52%
(82.79%)23.16%
(101.80%)19.57%
(87.61%)33.33%
(85.42%)27.99%
(99.25%)17.89%
(91.76%)39.15%
(85.33%)馬単 4.01%
(86.53%)3.65%
(82.96%)4.57%
(95.28%)0.00%
(0.00%)8.33%
(140.21%)6.34%
(115.34%)3.14%
(75.75%)18.71%
(71.69%)三連複 5.11%
(94.65%)4.20%
(84.23%)6.19%
(109.50%)0.00%
(0.00%)6.25%
(37.50%)7.46%
(99.48%)4.39%
(96.17%)13.92%
(96.15%)三連単 0.86%
(55.42%)0.73%
(83.89%)1.03%
(36.17%)0.00%
(0.00%)0.00%
(0.00%)1.49%
(84.22%)0.73%
(50.13%)13.92%
(102.51%)総合 50.39%
(80.73%)44.34%
(77.28%)54.72%
(85.98%)58.70%
(43.49%)68.75%
(82.41%)56.34%
(96.23%)47.80%
(75.82%)85.93%
(91.96%)
若干ではあるがモデルビルダーの方が回収率が良いので買うならこちらかな😅
2025/05/17
時短には
結局良い結果が得られないままで、時間だけが過ぎていく。そこで、そもそも最初から2004年~2024年という21年分のデータを学習させているのも時間が掛かる一因な訳でこれを2004年~2010年の7年分にして試す事にしてみました。って事で今はCSVデータ出力中でそんな中でもCopilotに質問ぶつけて各層のユニット数調整のアドバイスをもらってみた。
- x = Dense(256, activation='relu')(merged_features)
- x = Dropout(0.3)(x) # 過学習防止
- x = Dense(128, activation='relu')(x)
- x = Dropout(0.3)(x)
- x = Dense(64, activation='relu')(x)
- uma_networks.append(x)
馬毎はこんな感じとし、
- # 結合後のネットワーク全体
- x = Dense(512, activation='relu')(final_features) # 隠れ層
- x = Dropout(0.3)(x) # 過学習防止
- x = Dense(256, activation='relu')(x) # 隠れ層
結合後もちょい調整してみる事にしました。CSVデータ出力し終えたら試します。
追記 2025.5.17 14:56
ちょっとした手違いから時間が余分に掛かってしまいました。まあ、Visual Studio Community2022もVersion 17.14.0がリリースされたので先にアップデートも済ませて訓練開始してみると、10分/epochに短縮されてますのでこれで色々試せればと思います。
2025/05/14
TensorFlowの理解不足
そもそも理解してるとは思っていませんが、取敢えずモデルの訓練が出来る様になったので50epochsで試してました。ああ、これ、35分/epochなんで50epochsだと29時間です😨 初トライではあまり良い結果が出ず、RMSEが確か39とかだった記憶なんですが、Copilotにあまり精度が上がらないけどって相談してみると
- from tensorflow.keras.optimizers import Adam
- # 学習率を指定
- optimizer = Adam(learning_rate=0.01) # 例えば 0.01 に変更
- # モデルをコンパイル
- model.compile(optimizer=optimizer, loss='mse', metrics=['mae', root_mean_squared_error])
とする事で学習率が指定出来るとの事で試しました。そもそもデフォルトでは0.001らしいです。でも、結果的にはそれ程改善された訳では無かったです。そこで、まあ、そもそも特徴量が爆発的に増えてますので層毎の指定を大幅に変更し、馬毎の部分を
- x = Dense(1024, activation='relu')(merged_features)
- x = Dropout(0.3)(x) # 過学習防止
- x = Dense(256, activation='relu')(x)
- x = Dropout(0.3)(x)
- x = Dense(64, activation='relu')(x)
として、より複雑(?)にして50epochsスタートしてみました。これ、結果わかるの29時間以上後なので...
追記 2025.5.14 21:17
そもそも当初はどうだったのかが分からんと比較出来ないですね😓
- x = Dense(64, activation='relu')(merged_features)
- x = Dropout(0.3)(x) # 過学習防止
- x = Dense(32, activation='relu')(x)
- x = Dropout(0.3)(x)
- x = Dense(16, activation='relu')(x)
これ、新馬戦用からコピーしてそのままだったんですが、そもそも新馬戦用ももう少し変更は必要ですね。
ああっ、そいえばWindowsに緊急のUpdateが来てるんだったけど、訓練スタートしちゃったから後日だなorz
追記 2025.5.15 21:23
終わるまで我慢出来なくて中断しました。思えば、上記なんですが、馬毎にしてるので馬毎は確か533特徴量なんてす。なので流石に1024は違うだろうって判断です。まあ、残り10epochsでやはりRMSE 38辺りだったのも中断の決め手です。
- x = Dense(128, activation='relu')(merged_features)
- x = Dropout(0.3)(x) # 過学習防止
- x = Dense(32, activation='relu')(x)
- # x = Dropout(0.3)(x)
- # x = Dense(16, activation='relu')(x)
時短になるかもって事で1つの層を削ってみたけど、これは効果無い感じorz いや、まだ1つ目も終わってないが訓練始まるとそのepochの残り時間とかが出るので単純にどの程度掛かるのか分かるんだが、38分とかだったので変わってないなっと。明日朝時点でRMSEがどの程度かで、今回の修正が意味あるのか分かるかも?
Microsoft Rewards 20回目
前回は4月5日でしたので今回は40日目です。大分早かったのはスマホ側で1,000ポイント付いたりしたからですね。今回は5,250ポイントを楽天660ポイントにしました。よくよく計算してみたらこちらの方がAmazonより還元率は良かった。