2023/05/31

解像度の異なる環境対応

 本日無事にJRA-VANの今年の夏に予定される仕様変更への対応作業の検証を終えました。で、まあ、じゃあ、データが取り込めたなら表示してみるかと...もう、愕然とするしかない位酷い結果でした。いや、多少乱れてるとかなら、まだまあ当然だって感じはしますが、そもそも、表示されているものがウィンドウサイズに入らないからスクロールバーが出てるのに、一番下までスクロールしても一番下が見えないとか😱 現在の開発環境は4K(3840×2160)です。今回の検証用仮想マシンはフルハイビジョンで1920×1080です。確かに現環境でWindowsフォームのデザイン画面の時に画像倍率だったかが何%ですよ的なメッセージが出てたとは思います。単に開発画面で見やすい為と思ってたんですが、それがそのままデザインに影響してたんだと。これ全てのフォームで再点検しなきゃですorz

24時間学習

 無事に完走は出来ました。3700トライアル出来た模様。内23トライアルが1分以上、最大が3時間越えで、10分越えも何個かって感じですね。途中確認出来たのは最大27ギガ程度メモリ使ってました。って事は、以前はうちのPCも16ギガしか積んでなかったりですが、そんな状態では止まらないまでもメモリスワップ頻発でここまでトライアルはこなせなかったかも。まあ、一旦PCを休ませます😉

2023/05/30

原因不明な機械学習

 もう何度も実行してるのですが、昨夜も24時間学習を夜通しの覚悟で居たんですが、ふと進んでない事に気が付く。ログ画面に今何回目のトライアルって出力されるんです。10時間の時でだいたい2100回とかだったかと記憶してます。1回のトライアルが数秒から数十秒が一般です。10時間学習から計算すると1回のトライアルが17秒程度かと。しかし、昨夜、既に6時間程実行してるのに延々と210で動いない事に気が付きました。つまり、1時間程度した後に進まなくなっていたんですね。ログはRichTextBox使っていて1秒毎にタイマー使って最後尾に飛ぶようにしてるので、カクカクと常に動いてるんです。数秒から長いとほんと1分位とか掛かるので全く気にしてないのですが、昨夜は計算上5時間は進まなくなっていた事になる。で、プロセスを停止して昨夜は作業終了としました。

前にもここにもちらっと書いたかもなんですが、新馬戦用とそれ以外用の24時間学習を同時に実行してた時に新馬戦用が、まあ、この時は完全にハング状態でタスクマネージャーでキルしたんです。昨夜の場合はハングではなかったです。心当たりは...この状態になっている事に気が付く少し前に、JRA-VANからのテスト環境の不備を修正したって返信があった事に気が付いたので、仮想マシン立ち上げてテストをし始めて、あららっ、バグかって事でその調査しようかな~っと、ふと、学習プロセス見て気が付きました。でも、既に5時間とか経過してるタイミングなんで今回の計算からすると1時間程度で、原因は別かもなんですが、32ビットアプリとして動いている時にも、まあ、これはログにもOut of Memoryな表示が出たんですが今回は無し。仮想マシン起動によるメモリ消費ではないかなぁ。1時間程度後にやった事で思い当たるのは、メディアプレイヤーで映画見始めた事かな。ディスクIOか何かでビジー状態とかでデッドロックしたのかなぁ😓しか思い当たる事がないです。映画データは物理的に別ドライブではあるんですけどね。今も書きながら学習プロセスは動いてるんですが、今40分程度過ぎてて243回のトライアルは終わってたりします。210回は30分程度でって事かも。まあ、学習プロセス起動して、ひたすら待つので暇つぶしで映画でも見るかって行動ではあったんですが、PCへの負荷は極力避けなきゃかもです。ファクターの数が違うとはいえ、24時間学習自体は無事に終わった経験はあるので不可能ではないと思うので、今回も無事を祈るしかないのかな😜

追記 2023/5/30 8:46
諸々PCいじってたりしましたが、今朝も90分程度で学習の進行が止まったorz アイビー先生もたいした回答はしてくれない。で、今はVisual Studioのデバックモードで実行中。いや、だからって別になんじゃないけど、メモリとかはモニター出来るので何か分かれば良いな~って程度なんですが、まあ、これで行けるならそれはそれでねぇ。ただ、なんとなくなんですが、リリース・バージョンでの実行時はトライアルが短いものは5~6秒でしたが、デバッグモードではもっぱら9~10秒でたま~に5秒とか。原因特定出来ないと、安心して長時間学習に挑めない。

追記 2023/5/30 12:08
モニター出力部分はほぼサンプル通りにしてたんですが、ちと工夫入れました😉 新たなトライアル開始時にその時点の時刻出力。あと出力自体も少しフォーマットして見やすくしてみた。いや、だからって原因解決にはなってませんが、ただ、少なくとも開始時間が出力されているので止まったのが長いと判断もしやすくなったので、やはり数分以上だと何かがって思わないと。それとタイマーで処理してたRichTextBoxの末尾への移動もモニターで出力する度にって変更する事でカクカクは無くした。で、これ書いてる間に既に今のトライアルが8分程進んでないorz

追記 2023/5/30 13:26
長く留まっているのは分かりやすくなったんですが、判断は別問題。先程書いたトライアルは9分ちょいで次に進んだし、少し前にうわぁ~30分超えてるから駄目かな~っと止めようか悩んでると34分少々で次にとか。5秒で終わるのと34分以上なのと何がそんなに違うんだかブラックボックス過ぎて以前の様にひたすら知らんぷりで終わるの待って結果だけ確認が正解なのかなぁ。今のは明日昼前に24時間が終わる予定です。

追記 2023/5/30 17:03
やばい!なんと!3時間36分後に次のトライアルに進むとか。これマジで向き合わず、時間まで放置が良いですね。タスクマネージャーで少し見てて、普通にCPUを3~4割使ってて、メモリはその時は5ギガ程度で徐々に増えてたので、まあ、ハングはしてなくて、何かしてるんだろうな~って事で映画を1本見てました。諦め半分でPCの画面に戻すとトライアルが進んでたんです。今はメモリ11ギガとか使ってます。これじゃ32ビットアプリじゃメモリ不足もなっとくな感じです。さて、64ギガ積んでますが無事に24時間完走出来るかなぁ。今5時間で11ギガ。ここまあ4時間弱で6ギガ程度増えてます。残り19時間で5倍の30ギガならメモリは足りるのかな?こうして書いている間にもメモリ増えるだけじゃなくちょっと減る事もあるので多少開放もしてるのかも。

2023/05/29

無茶な試み

 機械学習には本当にリアルに時間が掛かります。今日は10時間学習を朝から始めてるんですが、ちょっとまあ、どうなるのか分かりませんが、並行処理させてみようかと試みてます。仮想マシン立ち上げて、仮想マシン内で試しに24時間、48時間、72時間と3つスタート掛けてみました。流石に仮想マシンでしかも3つはキツイ感じで反応悪いので24時間だけにしました。まあ、それでも2つの学習が行われてるんですが、仮想マシンを選んだのは仮想マシンはサスペンドが簡単に出来るので、24時間といっても途中でサスペンドして(寝る時はPCを休ませて)再開可能なので、2日に分けても出来ますし、今後48時間や72時間も地道に出来る。ただ、この仮想マシンは新仕様JV-Linkのテスト用に準備してるやつで、JRA-VANが修正をしばらく待ってくれって事なので、修正がリリースされればテストもしなきゃなのですがね。まあ、有効利用します😉

追記 2023/5/29 16:39
やはり仮想マシンでの学習は中止しました。ざっくりと計算してみると、まあ、この機械学習ってリアルタイムで縛って行うんですが、仮想マシンでのリアルタイムの学習は実機の学習の1/5とかかも😖 つまり、24時間しても実質5時間程度の学習にしかならないと判断しました。って事で、実機で既に24時間はスタートして、明日のこの時間に終わる予定で、今晩は夜通しPCには頑張って頂こうかと思います。逆に考えるともし1/5だとすると24時間学習として仮想マシンでは5日としないと成立しないのかもなんですねぇ。1週間以上は掛かると思うと中止も当然の判断かとね。

2023/05/28

ファクター追加して期間変更

 自分自身がそもそも学習しながら、今回新たにファクター追加してサンプルデータは2004年~2020年に変更。で、これなら実証検証として2021年~2022年としても2年取れるのである程度参考になる結果が取れるかなっと。CSVは出力に4時間掛かりました。で、先ずはテスト的に10分学習させてみました。いや、既に1時間学習も終わらせてますが、2年分の検証が1時間掛かるんですよ😓

10分 > 366KB
予想[6912] 的中[1496] (21.64%) 購入[¥4,838,400] 払戻[¥3,754,710 (77.60%)]

60分 > 224KB
予想[6912] 的中[2963] (42.87%) 購入[¥4,838,400] 払戻[¥4,757,680 (98.33%)]

1時間の方が少し小さい。相変わらずこの学習済みモデルファイルって微妙ですね。ああっ、新馬戦用の24時間学習済みモデルファイルはなんとたったの21KBだったりします。で、まあ、成果の方は上々かな? 的中率も回収率も期待出来るのかな~。まあ、今は取り敢えず段階踏んで2時間やってますが、今晩はPC休ませて明日にでも10時間や24時間にも行ってみようかなって思います。しかし、追加ファクターが良かったのか、単に偶然なのかがねぇ。

もう少し高速化したいけど

 ここまでの学習用CSV出力でも4時間半とか掛かってましたが、更にファクターの追加をしました。で、コーディングも終えていざ出力としばらくやってたんですが、これが長い時間要する事を思い出し中断しました。今日のレースの予想が全然出来ないので予想が済んでから出力しようと思います。

しかし、この出力がこんなに遅いのは辛いのでなんとかスピードアップを図りたい。ああ、プロファイリングで、ボトルネックを探して対策出来るかも調べてみようかと思います。

2023/05/27

機械学習での未来予測

 まだまだど素人レベルなのにちょっと解った気分になってましたが、やはり素人なりの心配は的中してたりします。えっと、24時間の学習を終えてってか、まず、話を整理しますね。今回用意したCSVは2004年~2022年の19年分です。で、今回の機械学習は基本設定として8割のデータを学習して残り2割で検証して学習精度上げるってのがまあ簡単な説明だったと。15年ちょっとのデータで学習して4年弱でその精度確認してるって事かと。で、更に今回の学習結果の検証で使ってたのは2020年~2022年の3年程度のデータです。つまり、ここ、3年分は精度上げるターゲットの4年弱に含まれます。で、それ程重要じゃないと判断勝手にして詳細なデータは残してないですが、まあ、ザックリとした話、的中率が52%程度で回収率が200%超え的な一見夢の様な成果なんですが、この24時間学習済みモデル使って今年の初めから先週までの検証すると、まあ、酷いものです。そう、競馬予想はそんなにあまいものじゃないとね😓

まあ、機械学習とかじゃなくても予想してるアプリはありますし、それに迫るもしくは超えるものを目指したいですよね。もっと知恵をひねり出す必要は痛感しました。今年の分に関しては24時間よりは10時間の方がまあ、ここ5か月弱では上ってのが、サンプリの誤差からなのかは不明ですが...まあ、学習用を2020年辺りまでにしてそれ以降で実証検証って感じにせめてしなきゃダメな感じだし、更にファクターを考える必要性はありますね。

2023/05/26

第90回東京優駿日本ダービー

 本当の節目の10年後は元気で観戦出来るかは分かりませんが、取り敢えず現時点の10時間がはじき出したものですが、

◎ 6枠12番 タスティエーラ レーン 2'27"48
○ 1枠2番 スキルヴィング ルメール 2'27"66
▲ 3枠5番 ソールオリエンス 横山武史 2'27"85
△ 1枠1番 ベラジオオペラ 横山和生 2'27"96

オークスは大外しでした。まあね、狙った三連単とか4千万馬券でしたから😅 そんな簡単には来ませんね。ただ、オークスとはそんなに相性は悪くないので行ってみました。で、ダービーなんですが、これがまあ、相性はってか当てたのは記憶に無い位に酷い。直近10年見ると三連単は一昨年が50万円、去年は10万円。ちょっと荒れながらでも固い感じもする。ホープフル勝ち馬は前走海外挑戦して2着ってのが良いのか悪いのか、JRA-VANがタイム提供してないし、微妙に評価が出来てない感じで13番手評価なんですが、この馬が全く読めないですね。まっ、明日以降オッズが出たり、天候馬場の発表があるとまた変わるとは思うけど。

長時間の学習

 年齢的にもってか、若い頃からポカは多かったとは思うけど、自分を過信し過ぎるのはダメだね。フルセットアップとかログが残る様にしてるので前回のログ見るとエラーの山😱 ってか、まあね、やってあると思った修正がしてなかったのでやって再度フルセットアップ流して放置。ろくにログも見ずに居たんですが、今回、まあ、たまたまリアルタイムでログにエラーが出ているのを発見(フルじゃなく更新時にね)。で、見直した訳ですが、これ、コーディングとして数字の羅列なんで見付け難い。これ防ぐ為に色々な策があるんだとは思うけど...

まあ、それとは別に、今回24時間の学習を昨夜から行ってたんですが、今回のポカの修正をして念の為にバックアップ。それ自体はこれまでの習慣なんで仕方のない事ではあるんですが、プロジェクト丸ごとZIPにしてるんですが、これが問題があったかも。新馬戦用とそれ以外の全般用の2つを流してたんですが、不幸中の幸いですが、全般用は未だに継続してます。21時終了予定なので、残り3時間半程度。ああ、実際には今日の昼過ぎにやらかしたので開始後16~17時間後に新馬戦用のプロセスが固まりました。確証は無いけど、ZIPにする時にタイミング悪くAutoMLプロセスとファイル取り合いか何かで無反応になり強制終了しました。まあ、全般用の結果が良ければ新馬用の再実行を検討します。

この長い処理はこんな弊害もそうですが、Windows Updateの再起動待ちでもあるんです。その昔には勝手に再起動されたりで迷惑被った事もありましたが、今は待ってくれてます。

あっ、この所ってか、前は大体フルセットアップに2時間前後だったんです。でも、今日はまあ、学習プロセスとかが動いてるとはいえ、どの程度の影響があるかは分かりませんが、なんとほぼ3時間でした。今年初めの頃までは頻繁にやり直したりでフルセットアップもやってましたが、ここの所は安定していたのでそんなにやってなかったので半年程度の期間増加ではありますが、諸々の影響で長くなったのかもですね。

2023/05/25

機械学習って本気で時間掛ければ...

 一連の感覚はつかめた気がするし、まあ、バグも無くなった気で居ます😁 いや、機械学習以外の部分にはあると思うし、検証部分は相変わらず手抜きのまま手をつけてないし、なんですがね、10時間はやりました。で、これ、1か月とかやれば...なのか、まあ、64ビット化はしてますが、実メモリ64GB積んでる程度です。システムドライブには300GB以上の空きは有ります。明日のこの時間には24時間でも終わって週末には間に合うので開始してみました。あまりにも現実離れしてたりしたら、追記しないかも😎

新馬戦用のトレーニング済みモデル(3)

 滅茶苦茶酷いバグがありました😖 よくもまあ、あんなのを何時間もテストしたり検証したりと無駄な時間を使ってました。今回のは多分大丈夫なんじゃないかと思います。新馬戦のCSVは出力も早いのでまだ良かった。学習は時間指定で変わりませんがね。

60分 > 28KB
予想[902] 的中[327] (36.25%) 購入[¥630,000] 払戻[¥388,170 (61.61%)]

まあ、1時間は本来こんなものなのかな?新馬戦がそんなにがんがん当たるイメージは無いですもんね😅 10時間がどの程度かは終わってからのお楽しみって事で今晩にでも追記します。

追記 2023/5/25 19:24
無事に?ってか、まあ、時間切れでの停止でしたが、

10時間 > 651KB
予想[902] 的中[381] (42.24%) 購入[¥630,000] 払戻[¥672,050 (106.67%)]

まあ、的中率は上がり、回収率が3年間でプラスキープは良いのかな? ちょっとやれやれって感じで(-。-)y-゜゜゜です。

2023/05/24

新仕様対応完了してる気で居たけど

 やっとテスト環境が整いました。先日のリリースバージョンでのエラーも2004年から提供が始まってる出走別着度数に生産者が含まれるのでその修正が全く出来てないというお粗末なもの。対処して、更に元々のバグも発見。既存なのもフルセットアップし直しです。

検証用は1986年からやるのは取り敢えずさけ、2000年からにしてみました。で、実機はフルセットアップがこの50分程度で2011年7月とか処理してます。検証用は少し遅れてスタートしてますが、35分程度で今2009年1月に入れました。

この辺りのテストが終わったら、アプリの登録申請に向けてサイトの準備とかも進めなきゃです。

追記 2023/5/24 21:53
何故か色々とエラーが出てる😔 まず自分を疑わなきゃなんですが、そもそも、今回触ってない坂路調教やウッドチップ調教でエラーが出てたり、コース情報で結局止まっちゃいました。この辺りは全く触ってないので、この検証用JV-Linkが微妙なデータを送ったり返す値がおかしい気がするけど...ってそんな辺りは実機で何度も動いてるし...でも、エラーにならなかったバグがあったのも事実。これ、ちょっとかなりな手間が掛かりそうorz

新馬戦用のトレーニング済みモデル(2)

 諸々修正して新たに2004年~2022年のCSVの出力し直しました。先ずは1時間学習させて今10時間を実行中。

60分 > 22KB
予想[902] 的中[390] (43.24%) 購入[¥630,000] 払戻[¥417,020 (66.19%)]

2020年~2022年の3年分検証結果です。10時間終わったら検証して追記します。

追記 2023/5/24 21:59
10時間の学習も無事に終わりました。

10時間 > 46KB
予想[902] 的中[275] (30.49%) 購入[¥630,000] 払戻[¥362,270 (57.50%)]

う~ん、大幅ダウンです。ちとバグとか入れ込んでないか再確認が必要ですね。

2023/05/23

仮想マシン上のVisual Studio

 今日1日丸々浪費して仮想マシンの構築とVisual Studio入れ込んでのテスト環境整備を試みてましたが、まあ、先日も書きましたがインストール最後で延々とってのと、今日は再インストール試みてたんですが、インストーラー自体がぶっ飛ぶってか仮想マシンがぶっ飛ばされてるのか、まあ、仮想マシンが強制的に再起動してインストーラーがまた最初から初めてまた飛ぶってねぇ😞

結局まあ仮想マシン削除して、今回は先日のハード更新時に空いた旧起動ドライブだったSSDが480GB空なのでここに入れてみました。で、アイビー先生のアドバイスでは仮想化ベースのセキュリティ(VBS)を有効化してくれって事でした。それと、まあ、ここまで何度も苦労してたWindows起動時の自動ログインも解決方法がやっと分かりました。

手順的には仮想マシン構築してWindowsのインストール。
VBSの有効化
・[コンピューターの構成 > 管理用テンプレート > システム > DEVICE GUARD] の順に移動
(ここ、アイビー先生はカタカナでデバイスガードってんでしばらく悩んだ)
・[仮想化ベースのセキュリティを有効にする] をダブルクリック
・[有効] をクリックし、[コードの整合性の仮想化ベースの保護] で [UEFIロックなしで有効] を選択
・[OK] をクリックして変更を保存
ローカルアカウントでサインインする様に変更
・[設定]>[アカウント]>[ユーザーの情報]に移動
・[ローカルアカウントでサインインする]を選択
で、この後にいつものregeditとnetplwizをすれば良い。

まあ、これで仮想マシン構築及びOSのインストールは完了で、この後、JV-LinkとVisual Studioのインストールですね。UmaConnだったら今月はゲームオーバーでしたがJRA-VANはキーの再発行に制限がなのいで助かる。今月初めにSSDが飛んでOSのクリーンインストールで1回目のキー再発行。SSD新調してOSのクリーンインストールで2個目のキーの発行。これでもう後が無い😓 まあ、今月も残り1週間と少々なんでどうにかかなぁ。

無事にJV-LinkとVisual Studioのインストールも終わりました。ああ、プロジェクトのバックアップをプロジェクトのフォルダごとZIPにしてるんですが、これを仮想マシンに持って行って初めて気が付いた。通常プロジェクトのフォルダの下にまた同じ名前のフォルダが存在してそのフォルダど並んでプロジェクトファイル(sln)があるんですが、なぜかZIPにはこのプロジェクトファイルが入ってない😰 なんのこっちゃねMicrosoftって感じですね。OSの標準ツールのエクスプローラの標準機能のZIP化使ってるんですがね。しかもMicrosoftの開発環境ね。

う~ん、JV-Linkの利用キーが当たり前ですが、既に使われてるって。実機で使っている方には利用中と出ていて再発行ボタンが有効なんですが、先日仮想マシンに入れたやつはまだ利用中になっていないので入れたら既に使われてるってのは検証用のJV-Linkだからなか?まあ、こんな時間に問い合わせても反応ないので今晩はここまでですね。問い合わせだけは書いて送信しておくか。

追記 2023/5/24 15:43
今日の午前中に回答がありました。今回の検証用では利用キー不要なので入れないで使って下さいって言われても、既に入れちゃっててそれ消す術無しorz 普通にアンインストールして再インストールで元の試用期間になり問題なくテストが出来る様になりました。

リリースビルドでテストは無謀でした

 仮想マシンにテスト環境を整備してリリースビルドを入れて、まあ、検証用ではあるけどフルセットアップに挑みました。まあ、実機では2時間のフルセットアップも流石に仮想マシンでは遅いです。確か4時間以上経った頃にエラーで止まってました😱 もう忘れちゃってますが、アウト・オブ・レンジとかなんとかだった気がしますが、ああっ、デバッグ環境じゃないから駄目だと諦めリリースビルドを削除。取り敢えず仮想マシンにもVisual Studioインストールしてデバッグ環境を準備中。で、このVisual Studioのインストール最後に「すべてを準備中です。これには数分かかる場合があります...」で延々と、もう30分は過ぎてる。仮想マシンなんで延々と放置出来ますが終わるかなぁ。

2023/05/22

インストーラー作成にチャレンジ

 まだまだ完成にはほど遠い段階ですが、まあ、先日リリースされたJV-Linkの検証用バージョンは実機には入れられないので仮想マシン構築してそちらにアプリをインストールしてテストしようかとインストーラー作成に着手。これまで適当なアプリは自作するもインストーラーとか無縁なレベルだったので全くの未経験者です。アイビー先生に問い合わせても簡単な回答しか得られず、ちょっと古い説明を参考に進めてみました。なんとか無事にセットアップのビルドに成功したので仮想マシンにインストールを試みるも作成されたデスクトップのショートカットクリックするとDLLだとかなんとか。で、インストール先のフォルダ確認するとアイコンファイルと幾つかのDLLはあるもののそもそものEXEファイルは存在しない始末orz

ターゲットのアプリのプロジェクト内にSetupプロジェクト(?)を追加して、そのFile Systemビュー的な中にApplication Folderってのがあり、そこにプライマリ出力とかがあり、これが赤い波下線が付いた状態だったので一度削除。リリース版のビルドをした後にもう一度そこにプライマリ出力を追加すると今度は赤い波下線は表示されないので良いかな~っと。で、セットアップのリビルトすると今度はビルド失敗orz どうやら、赤い波下線が付いたものへのデスクトップショートカットとスタートメニューへのショートカットが原因だったようで、それらを再度指定し直したらビルドは成功した。

しかし仮想マシンが遅い😔 その昔、もっと非力なマシンだった頃にVMware WorkstationのまあProバージョンの正規ユーザーだったので、使ってたんですが、ここまで遅いと感じた事はなかったと思うんですが...マジでストレスです。ネットでこのPlayerでの遅いのに対処するお呪い的なものは入れてますが本当に酷い。

で、インストールしてみるがやはりEXEがインストールされません😱 勉強不足だとは思うけど、インストーラー作成でこんなに苦労するとはです。これは今後の課題として、今回はリリースビルドをZIPにして仮想マシンに持っていって実行しようとすると、まあ、これは当然なんだとは思うけど.NET6 x86のランタイムが無いよって怒られてインストール。インストール後は無事に動き始めた😀 ここでJV-Linkの利用キーを入れなきゃな訳で、まあ、1つは実機、もう1つをこのテスト環境に使えば問題はないと思う。取り敢えず、検証用でのテストスタート!ってフルセットアップ開始した後に、ああ、この検証用はVer.4.8.0なので新仕様では動かない事に気が付くも、まあ、テスト環境での動作確認にはなるかとそのまま待ってみます😅

2023/05/21

64ビット版単独AutoMLアプリ

 AutoML自体は複雑なクラス定義とかが必要ないので、新馬用とかそんな特別なものはなく、単に与えられたCSVを自前でまあ解析して学習する。まあ、実際には今回新馬とその他的な2種類でどちらも共通な部分があるので細かい違いな部分はAutoMLには影響ないから共通化出来てるんですが、まあ、サラッと完成させたのでこれを本アプリから起動させて動かす様にする為に単一ファイルの実行形式にしようと試みましたが上手く行きませんでした。

アイビー先生やら諸々の調査してVisual Studioで作成したプロジェクトから単一ファイルにする方法を試しました。結果はNG!まあ、自分が設定しきれてないのが原因かもですが、このAutoMLが使う諸々が単一ファイルには入れられない。なので総勢13個のファイルをコピー。まあ、今後どうするかまた検討しますが、現時点ではAutoML含むと単一ファイルには出来ないって事にします😓

まあ、そんな作業もしながら新馬戦用バグってか途中で処理してなかった部分を発見。先日行ったCSVは古いものだったので、今日開催終了後にでも出力し直します。で、その後学習と検証かなぁ。なので先日の新馬戦の結果は微妙な物でした。

2023/05/19

トレーニング済みモデル(3)

先程10時間が終わりました。終わり方は時間切れできっちりとは行きませんでしたが

600分 >  6,514KB
予想[1200] 的中[450] (37.50%) 購入[¥840,000] 払戻[¥469,620 (55.91%)]

結果的には的中率は2時間を若干上回る程度😔 ここまで一気に時間違いの検証してきたのですが、的中率が重要って事でそちらばかりに目が行ってましたが、ここまでの成果をもう一度整理しますね。

1分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
2分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
5分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
10分 > 39KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
25分 > 5,817KB
予想[1200] 的中[462] (38.50%) 購入[¥840,000] 払戻[¥623,610 (74.24%)]
30分 > 287KB
予想[1200] 的中[488] (40.67%) 購入[¥840,000] 払戻[¥559,290 (66.58%)]
60分 > 422KB
予想[1200] 的中[524] (43.67%) 購入[¥840,000] 払戻[¥566,830 (67.48%)]
120分 > 66KB
予想[1200] 的中[448] (37.33%) 購入[¥840,000] 払戻[¥2,971,840 (353.79%)]
180分 > 182KB
予想[1200] 的中[460] (38.33%) 購入[¥840,000] 払戻[¥601,670 (71.63%)]
240分 > 60KB
予想[1200] 的中[495] (41.25%) 購入[¥840,000] 払戻[¥532,600 (63.40%)]

なんですが、的中率と比例して回収率がって事でもないのは、的中率はあくまでも1点目の複勝の的中率なんですよね。回収率には1点目~3点目の予想がまあ、馬券圏内入ってくるとワイドなり三連複や三連単が当たるので上がるって事なんだと思います。的中率はここまでの結果では1時間なんですが、回収率からすると2時間なんですよね。ただ、これってあくまで今年1月から4月末を対象とした検証結果でたまたま2時間が偶然にって言われればねぇ😓

って事でまあ、学習期間ではあるんですが2020年1月1日~2022年12月31日で検証すると

120分
予想[10368] 的中[3446] (33.24%) 購入[¥7,257,600] 払戻[¥4,881,740 (67.26%)]
60分
予想[10368] 的中[3940] (38.00%) 購入[¥7,257,600] 払戻[¥5,687,170 (78.36%)]

やり始めてこれが苦痛なのが、今まで4か月程度の検証なので10分ちょいで終わってたんですが、これ3年になると単純に9倍の90分なんですよ😱 まあ、この2つを見ると最初の4か月はラッキーな期間なんだったのが分かりますね。でも、3年分の検証でも1時間は強いな~っとね。

追記 2023/5/20 8:22
時間の掛かる3年検証を10時間モデルでやってみました。

予想[10368] 的中[4860] (46.88%) 購入[¥7,257,600] 払戻[¥6,367,160 (87.73%)]

流石に10時間の実力なんですかね? 3年分って長期で本領発揮してるんかな~😉

新馬戦用のトレーニング済みモデル

 この所は新馬戦用は放置してたんですが、気が付けば一連の作業で全て一度消去したりしてて新馬戦用のが無くなってて1時間やって検証してみました。

60分 > 3,744KB
予想[301] 的中[160] (53.16%) 購入[¥210,700] 払戻[¥242,190 (114.95%)]

これ、実はサンプル期間が2004年1月1日から2022年12月31日にしてます。あ、スタートが2004年な理由は何処かで書いたか覚えてませんが、2004年辺りから出走別着度数の提供があるのが理由です。出走時の騎手と調教師の勝率とかをファクターにしてるので。で、この新馬戦の検証は今年のデータでは少な過ぎると思って毎回昨年のデータにしてます。つまり、学習した所に含まれてます。なので、それが好成績の要因になっている可能性は否めません。

予想[45] 的中[17] (37.78%) 購入[¥31,500] 払戻[¥17,130 (54.38%)]

これが今年なんですが、今年はまだ新馬戦が45戦しかないので検証にはどうなのかな~って事です。まあ、それでもこの成績なので新馬戦予想としては悪くないのかな?7月位には今年の新馬戦も始まるので期待出来るかな~😉

追記 2023/5/21 17:58
一段落して取り敢えず新馬戦用の1時間やり直し

60分 > 36KB
予想[301] 的中[133] (44.19%) 購入[¥210,700] 払戻[¥137,380 (65.20%)]

まあ、時間見て10時間学習して検証もしてみようかと思います。新馬戦って限られてるおかげで諸々時間掛からないで済む感じですが、学習は10時間してすれば確実に10時間なので、これは明日以降に😉 ああ、↑は2022年の1年分ですが

予想[902] 的中[408] (45.23%) 購入[¥630,000] 払戻[¥574,830 (91.24%)]

これは2020年~2022年の3年分です。

追記 2023/5/22 16:00
ちょっとしたバグってか作業不足な部分も修正し、10時間してみたんですが、時間切れでの停止だったのが原因なのか分かりませんが、ちと巨大なものになりました😅

10時間 > 22,375KB(21.8MB)
予想[902] 的中[414] (45.90%) 購入[¥630,000] 払戻[¥422,650 (67.09%)]

↑のよりは的中率上がるも回収率が下がってるって事は2番手3番手の予想制度が落ちたのかな😔

2023/05/18

第84回優駿牝馬オークス

 AutoMLによる予想を出馬表に表示する部分が書けたので試しに動かそうとした所、ん?5月21日が表示されるので、え?なんかバグ入れ込んだ?って感じで開くと確かに木曜日だし既に枠順とかが発表になってるんですね。

別に何じゃないが、今回のAutoMLのファクターには枠と騎手があれば出るので表示されました。ああ、今の時点で良さそうな1時間を使ってます。

◎ 6枠11番 ミッキーゴージャス 戸崎圭太 2'31"63
○ 5枠9番 コナコースト レーン 2'31"63
▲ 7枠14番 ペリファーニア 横山武史 2'31"76
△ 8枠17番 シンリョクカ 吉田豊 2'31"89

って感じに出てます。◎と○は同タイム的な僅差って事ですかね。ってふとタイムが全然らしくないですね。東京芝2400mはもっと早いな~😣 昨年は2'23"9だし。ああ、ファクターに天気と馬場コンディションを入れているからそれ無しでの予測にはなってるとはいえ。まだまだ全然調整不足って事かな😫

追記 2023/5/20 9:22
ささっと思いつきで書き上げたりしてるのでいっぱいバグ有ったっぽいです😖

◎ 3枠5番 リバティアイランド 川田将雅 2'27"47
○ 5枠9番 コナコースト レーン 2'27"49
▲ 7枠14番 ペリファーニア 横山武史 2'27"59
△ 6枠12番 ハーパー ルメール 2'27"96

1時間でもこれと同じ感じでしたが、これは10時間使ってます。まあ、相変わらず現時点では天候と馬場無しですけど。不動の○▲は偶然なのかな~😜

追記 2023/5/20 20:41
この時間だと現時点での天候と馬場は拾えるので予想内容は変わらない感じはするけど、予想されている走破タイムが若干変わってきてる。◎は2'25"21、○は2'25"31、▲は2'25"44、△は2'25"69になってます。これなら昨年の勝ち時計に大分近づいたのでそれっぽいかな。

追記 2023/5/21 10:43
何かを間違えてたのかちと分かりませんが、諸々のバグ処理って他の部分関連だったと思うけど、まあ、再度出馬表開くと

◎ 5枠9番 コナコースト レーン 2'25"17
○ 7枠14番 ペリファーニア 横山武史 2'25"24
▲ 6枠11番 ミッキーゴージャス 戸崎圭太 2'25"30
△ 3枠5番 リバティアイランド 川田将雅 2'25"33

とガラッと変わってました。ただ、自分としては昨夜の予想としては18→11→14かな~っとか思ってたり。最後まで悩むかも😅

トレーニング済みモデル(2)

 昨夜の続きです。朝から取り敢えず1時間終わらせて今2時間を。

60分 > 422KB
予想[1200] 的中[524] (43.67%) 購入[¥840,000] 払戻[¥566,830 (67.48%)]

この1時間なんですが、終わり方はログ確認すると'Time budget exceeded'からの'failed'で終わってるんですが、25分の時の様にファイルが膨れ上がる事はなかった。更にいうと、現在のファクターで1時間の検証はしてたりするんですが、前回のより向上してる😁 考えられる原因はMLContextクラスの使い回し。今回からは学習前に毎回newしてるのでフレッシュな状態に戻ってるのが良いのかな。2時間の結果次第で5時間もしくは4時間でも良いけど試そうかな。的中率は随分上がってきてるけど、5割に届いたらヤバいね😉

こんな作業をしてるので待ち時間長いから本来のアプリの作業も進めます。これ出来るのもAutoMLを分離した恩恵だ。出馬表にこのAutoMLの結果を表示させて予想の参考にしようかと思います。

120分 > 66KB
予想[1200] 的中[448] (37.33%) 購入[¥840,000] 払戻[¥2,971,840 (353.79%)]

う~む、これってトレーニング済みモデルのサイズが小さくなったからなんとなく下がるのかな~っとは思いながら検証したんですけど...前にも1時間より2時間が悪化してたんですよね。ここは3時間で様子見ようかと思います。

追記 2023/5/18 14:49
3時間が終わりました。が、ちと本体側に問題があり、結局フルセットアップ中で後2年分程度で終わるのでその後検証です。

180分 > 182KB
予想[1200] 的中[460] (38.33%) 購入[¥840,000] 払戻[¥601,670 (71.63%)]

これも時間切れで終わってましたがそれ程肥大化はしてません。結局微妙な感じですね。2時からよりは良いが1時間よりは劣る。現在は4時間のトレーニング中です。

追記 2023/5/18 19:27
無事に4時間も終わり、タイミングも良かった感じでした。

240分 > 60KB
予想[1200] 的中[495] (41.25%) 購入[¥840,000] 払戻[¥532,600 (63.40%)]

コンパクトですが1時間に次ぐ成績です。夜通しは避けて明日朝から一気に10時間とか見てみたくなりました。まあ、次の書き込みにも微妙なタイムの誤差はあるもののレース内での順位決め的にはまだまだ期待出来るかも?

2023/05/17

トレーニング済みモデル

 ちょっと疑問なのが、ここまで30分、1時間、2時間、5時間と学習させてみた。で、その出来上がりはzipファイルで保存されてる。

30分 > 5,960KB
1時間 > 180KB
2時間 > 2,952KB
5時間 > 157KB

学習時間には無関係に大きさが異なる。これが正常なのかどうなのか。そもそも何か失敗とかミスしてるのか不安になりました。

予想[1200] 的中[433] (36.08%) 購入[¥840,000] 払戻[¥481,400 (57.31%)]

これが5時間の検証結果なんですが、また悪化してるし2時間よりもなんか検証が早く終わった気がするんですよ。そこで実験してみようかと😏 ってここで不安材料が...この機械学習の根底にあるのがMLContextクラスなんですが、これをフォームのLoadイベントでnewしてるのみで後は使い回してるって事になるけど、一回一回アプリ止めないとこのままだと問題があるかも。なので学習させる度にnewしてみます。

余談ですが、今回AutoML専用アプリを作ったので学習中でも開発中のアプリの作業したり予想したりが出来るのは良かった。ただ、少し前のビルドではあるが、単一ファイルにビルトしておいたやつで試してた所終了時間になっても何やら延々とエラーメッセージ吐いてる状態になつたので、デバックモードで現在は諸々作業してます。これだと特に問題は無く、普通に動作してるかと。

まあね、C#での開発とかその昔はnewするとかって無かった時代でしばらくプロして、現役退く頃からオブジェクト指向とかでC++がとか、なんかそんなタイミングでしたので、はっきり言えばオブジェクト指向は素人です😅 その後、VB6とか諸々ってか、確かVisual Basic 6は自腹で購入してるし、Visual Studioのどのバージョンだったか迄は正規ユーザーだったりとかね。EntityFrameWorkとかなんかデザインファーストとかでJRA-VANのデータ全部作ったり、その当時にもSQLiteがあり、当たり前だけどそのEntityFrameWorkでSQLiteを的な事で苦労したり。今回の取っ掛かりもコードファーストでの何だ、諸々をVisual Studio community 2019で始めて、Visual Studio community 2022のリリースイベント参加しながらVB.NETに見切りをつけ、C#に転向。ってコードファーストとか捨てて素のSQLiteのアクセスじゃなきゃって感じで現在なんですよ。ああ、処理待ちで暇なんでだらだら書いてました😁 学習と検証別アプリなんで同時実行とか出来てるからまだ効率は前より良い。

1分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
2分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
5分 > 25KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
10分 > 39KB
予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]
25分 > 5,817KB
予想[1200] 的中[462] (38.50%) 購入[¥840,000] 払戻[¥623,610 (74.24%)]

う~む、ここまで順調でしたが、この25分がね😔 ログ見ると、ってここまであまり注意深くログ見てないのも問題だったかも。でもね、このログが何ともな奴でね~。まあ、毎回秒指定で実行してるのでタイミング的に良いとか悪いとかは本来はやめて欲しいが、今回25分の終わりには

75 cancelled. Time budget exceeded.

75 failed with exception One or more errors occurred. (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.) (Operation was canceled.)

てな感じの終わり方。これ自体は時間が来たから打ち切りねって普通だと思うけど。一方、直前の10分なんかだと、

Trial 48 finished training in 7320ms with pipeline ReplaceMissingValues=>OneHotHashEncoding=>Concatenate=>SdcaRegression

ってなまあ、'failed'とかではないんですよね。タイミングが良かったかなぁ。でも、そんなタイミングは時間指定した時点では予測不能だし、もしそれが原因なら終了時に何かしらその事象を知って何か手を打つようにこちらがするべきなのか謎です。確かにログは残してるので、プログラム的にログチェックしてこの構文的なものを検知してってのも不可能ではないとは思うけど、TrialResultクラスでAutoMLExperimentクラスのRunAsyncメソッド戻り値取得してるけど、このTrialResultクラスでその辺りを判別して、今回の学習結果を採用するかしないかの判断しなきゃなのかなぁ。

30分 > 287KB
予想[1200] 的中[488] (40.67%) 購入[¥840,000] 払戻[¥559,290 (66.58%)]

そもそも、このAutoMLがVersion 0.20.1ってのも何かまだ微妙なのかもですけどね。ちと疲れて1時間のを終わらせて、終わったって終了しちゃったのでログ見なかったorz ログをセーブする様に改造明日しようかと思います。

2023/05/16

ファクター更に追加

 今回の追加でCSV出力は4時間半掛かりました。生データは95MB程度。まずはAutoML30分と60分をやって120分は結果で考えようかと。久しぶりに30分の結果見たんですが

予想[1200] 的中[267] (22.25%) 購入[¥840,000] 払戻[¥368,500 (43.87%)]

なんか随分的中率が低い😨 悪いもの入れたかな~。まあ、それでも我慢して60分待って

予想[1200] 的中[468] (39.00%) 購入[¥840,000] 払戻[¥482,910 (57.49%)]

まあ、待ったかいがあったかな😅 ただ、ここまでの最高には届いてないので120分してみますが、一旦書き込んで追記します。

追記 2023/5/16 20:43
そろそろ終わる頃かなっとログに目をやると😱 ログの半分過ぎた辺りから'Out of Memory'の文字が...ダメだな~。最悪の場合、AutoML部分のみを単にJV-Linkとは切り離して学習のみ行う様に64ビットアプリとして書かないとダメかも。

追記 2023/5/17 7:21
昨夜、ここでめげる訳には行かないので早速64ビット版のAutoML専用アプリ作成。これ、別にAutoML専用で書いたのでSQLiteもJV-Linkも関係ないし、更にはCSV生成も無関係なのでコード自体はシンプルなものであっという間に出来ました。まあ、また、夜通しでの5時間とかも可能でしたが、Microsoft Rewardsの件とか、起きて確認したら'Out of Memory'だったとか最悪なので、朝まで待って、起床後にまずは2時間。既に前回の実行でエラー出始めた1時間半は経ちましたが無事に処理中😁 やはり32ビットなのが原因確定かな。

追記 2023/5/17 8:30

予想[1200] 的中[509] (42.42%) 購入[¥840,000] 払戻[¥716,550 (85.30%)]

なんか感覚的に検証時間が長くなった気がする。まあ、当たり前ですがAutoML実行時間長くしてるので、実際にそれ使うと時間も掛かるのかも。取り敢えず、時間延ばせば結果良くなったので一気に5時間試してみます。

2023/05/15

AutoMLの途中でOut of Memoryとなり停止

 5時間設定して多分4時間程度までは行けてたんですが、ふと気が付くとログにエラーが出ていて止まりました😱 早速アイビー先生に確認したらマイクロソフトの公式見ろと言われ見に行くとFAQが用意されているレベル。まあ、単純に生データの10倍程度のメモリをって事でした。今の生データ、92MB程度のファイルです。うちの現在のPCは64GBメモリ積んでます。あっ、10倍って1GBにも満たないのに...。ただ、ちと気になるのは今のアプリは前にもちらっと触れたと思うけどJV-Linkの32bitが足かせになっていてターゲットがx86なんです。32ビットだと2GBの制限とかあったかな?アプリで他の部分もあるから余分にメモリ喰ってて足りない可能性はあるのかな。アプリ自体はまだこれから更に肥満化すると思うのに...JRA-VANさん、本当に出来るだけ早くJV-Linkの64ビット化お願いします!

単に時間が長ければ良くなる訳じゃない

 2時間も学習させて

予想[1200] 的中[442] (36.83%) 購入[¥840,000] 払戻[¥665,020 (79.17%)]

的中率ダウン😨 なかなか奥が深い機械学習です。一応現時点では10時間まで指定可能にしてますが、どうせ放置しておいて確認するだけなので、取り敢えず5時間試して夕方には分かるかな。ちと別の工夫も必要かな~😓

ファクターの選択

 昨夜から追加した斤量ですが、検証結果から書きます。

予想[1200] 的中[490] (40.83%) 購入[¥840,000] 払戻[¥748,610 (89.12%)]

回収率ってもちろん重要なんですが、やはり的中率が高くないとってのは長年の経験からってか、長年じゃなくても的中率が重要なのは当たり前? 直前の結果が的中率42.58%でしたから若干ですが下がってます。斤量は重要なファクターなのは間違いなく、ハンデ戦なんかで斤量なしでは問題外だし。斤量がファクターとして無い状態で的中率が上ってのはもしかするとファクターが増えた分、学習時間が余計に掛かるのに同じ時間しかしてないので調整が十分じゃないと考えるべきかも。なので倍の120分ってのも試してみます。

夜通しPC稼働

 昨夜も遅くまで作業。寝る前にそもそも斤量がファクターに入っいない事に気が付き、こりゃダメだって事でまたソースデータ出力なのでそれを動かしたまま就寝。まあ、今朝無事に終わってました。今回は4時間と少々掛かってました。でまあ、AutoMLを60分で実行中。

で、日課となってるMicrosoft Rewardsを開けると日が変わってるが今日のデイリーストリークとかが出ない。もしかして3月末にデイリーストリークが飛んだのもこれが原因だったかも。なんだろ?これ夜しっかりとPC落としておかないとダメなのかな😓まっ、ちと処理終わったら一度PC休憩させます。

追記 2023/5/15 15:32
何気なくMicrosoft Rewards開けたら普通にデイリーストリークが復活してた😃 単に時差の関係なのかな? マイクロソフトの本社はワシントン州だったかな?まあ、カリフォルニアの北の方だから今だと16時間の時差かな。サマータイムで15時間って事だとまあ確かに日本の15時にあちらは日付が変わるけどね。

2023/05/14

CsvHelperで可変項目数のレコード出力

 ターゲット用外部指数出力は以前ダビジェネ予想をターゲットで表示させる為に作ったりしてたので今回のアプリにも機能を載せてます。その際にはCsvHelperなしで作ったりしてたツールのイメージそのままで作りこんだので馬単位でした。これだと単純に1レコードに3項目固定なんです。レースID、指数、順位ですね。まあ、これ指数だけってのもありなんですが、なんとなく順位も入れてました。今回はまあ、他のアプリでも多いレース単位にしようかと思い、まあ、それが原因で躓いてました。

アイビー先生に何度もお願いして試しましたがイメージとしては可変な部分はList<>にすれば良いって事で取り掛かったんです。

internal class TG_Uma
{
    public int Shisu { get; set; }
    public int Juni { get; set; }
}

internal class TG
{
    public string RaceID { get; set; }
    public List<TG_Uma> Umas { get; set; }
}

てな感じで定義しておいて出力しても何故かってかそれが本来の動作なのかは別として、このTGクラスを

List<TG> TGs = new List<TG>();

として出力に使おうと、データ準備して

TG rc = new TG();
TG.RaceID = "202301050501";
for (int i=0; i<Tousu;i++)
{
    TG_Uma uma = new TG_Uma();
    uma.Shisu = shisu[i];
    uma.Juni = chaku[i];
    rc.Umas.Add(uma);
}
TGs.Add(rc)

1日分のレース分用意出来たら

var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = false
};
using (StreamWriter sw = new StreamWriter(this.TG_Folder + @"¥" + CurKaisaibi + ".csv", false))
using (var csv = new CsvWriter(sw, config))
{
    csv.WriteRecords(TGs);
}

で行けるものと試すが"202301050501,プロセス名+TG_Umas,プロセス名+TG_Umas,プロセス名+TG_Umas,..."てな内容に。Listが全然上手く出力出来ないじゃんってね😨 まあ、今回はそのListが別クラスってのが悪かったのか

internal class TG
{
    public string RaceID { get; set; }
    public List<int> Umas { get; set; }
}

にして

rc.Umas.Add(shisu[i]);
rc.Umas.Add(chaku[i]);

って感じで入れ込んで出力する事で思った出力にたどり着けました。これ、もし、実数の指数と順位だったらどうすれば良かったのか...

今回の不調な状況

 今回SSDとHDDを新調した背景ですが、JV-Linkのサービスキーをまあ当然設定してるんですが、にもかかわらず認証エラー的なものがJV-Linkから返された。なんか、ネットに繋がってはいるものの、微妙に速度が...😓 で、起動ドライブのSSDを疑ってみた訳ですが、実際頻繁に発生していたJV-Linkのサービスキー関連は今の所なくなった。実際にはもっと長い期間問題出なければ解決って事になるかとは思う。

で、昨日結局2004年~2022年のサンプルデータ出力実行してたんですが、5時間半掛かりました😨 新たなファクター追加とかがなければやらない事とはいえ、長いってか遅い。インデックスの追加とかで改善出来れば良いんだけど、まあ、現状としては次のステップに進めながら検討していこうかと思います。

取り敢えず30分AutoMLしてみました。今年初めから4月末まで検証すると

予想[1379] 的中[493] (35.75%) 購入[¥840,000] 払戻[¥627,980 (74.76%)]

こんな感じの結果です。

追記 2023/5/14 10:12
AutoMLを60分にしてみたんですが、同範囲の検証結果は

予想[1379] 的中[430] (31.18%) 購入[¥840,000] 払戻[¥436,380 (51.95%)]

って感じになりました。時間延ばせばいい結果が得られるとは限らないですね。まあ、これって多分ファクターにもよるかと思いますが、今回待っている間に前走のタイム関連入れてるんですが、そのレース間隔入れてないのでこれはダメだなぁっと😓 この為にCSV再出力に5時間半は辛いのでちとインデックスとか工夫してみようかと思います。

追記 2023/5/14 14:57
インデックスちょっと追加して前回と同様な期間のサンプルデータ出力してみた所、3時間40分に短縮されてました。でもね~、まだまだ長いorz 実は今日のレースの予想しようと眺めてたんですが、ターゲットのデータがまた変だ。BLITZさんに報告しても良いんですが、前回も微妙な反応だったので、まあ、普通に削除してクリーンインストールしてます😜 次にトラブったら報告しようかと。でも、このクリーンインストールなんですが、たまたま使った過去データ込みなインストーラーが昨年の何月分だかまでの奴で今そこから今日までの分の取得をしてるんですが長い😨 もう1時間以上やってますが昨年6月辺りから取得してるようですが、今やっと9月orz JRA-VANお薦めのソフトって言ってももう何十年前のアプリだよってね。自分の今のアプリがある程度の段階まで来たら間違いなく放置するかと。お世話にはなったけど、これで馬券当てられたとかはないのでね。予想は常に他のアプリと自分自身かな。その自分自身を超えるものを今回のアプリに期待したいね。

若干検証部分に間違いがあったのを修正してAutoMLを30分した検証結果は

予想[1200] 的中[491] (40.92%) 購入[¥840,000] 払戻[¥669,490 (79.70%)]

でした。今60分のAutoMLスタートしたのでその結果も書きます。

追記 2023/5/14 16:58
なにか違う気がしなくもないが、検証済みました。

予想[1200] 的中[511] (42.58%) 購入[¥840,000] 払戻[¥1,080,700 (128.65%)]

的中率は然程上がってないのに回収率が😮 まあ、なにかデカい大物が当たったんでしょうね。ちょっと検証部分が貧弱なんで、取り敢えずちょっとした機能追加してみます。

2023/05/13

新たな環境完了

 昨日は帰宅後に無事に宅急便受け取り、早速作業してOSのクリーンインストールから諸々の復旧作業してまあね、こんなのは何度かやって来たのであっという間に完了しました。Visual Studioのインストール後に今回のプロジェクト試そうとするとJV-Link関連が認識されずにあれ?な感じになり、ちょっとだけ焦りましたが、.NETの開発環境を選択してたと思うけどC#で普通にWindowsアプリが新規プロジェクトに出てこないのでセットアップ修正して仮に新規のJV-Linkアプリってして、もう一度の今回のプロジェクト開くと問題解決してた😉

地方競馬のUmaConnサービスキー入れ直す時に今月既にってメッセージが出た気がしてたが、別に悪い事してないからスルーしてたんですが、諸々のアプリで認証エラーとか😖 2個あるキーで同一キーの再取得は月1度だけとかなんとかって制限があるらしい。まあね、不正利用防止か何かの策だとは思うが正規ユーザーに支障が出るのはやめて欲しい。今回はそもそも1つしか使ってなかったので2つ目を使う事で難は逃れたけど、これ、今月もう一度トラブルとかでクリーンインストールしたらアウトって事かと思うと微妙だなぁ。

クリーンインストール自体は本当になれたものですが、歳で諸々忘れてたりなのが面倒でした。まあ、本日朝にはほぼ完了して作業進めてました。バグもいつくか見つけて修正して取り敢えず現在は通常のリソースとなるCSVの出力中です。17時に始めてますが、2004年から2022年末までで4時間経過した今も多分2018年辺りを処理中っぽいorz 19年分の出力で5~6時間は掛かる感じですが、1986年~現在のフルセットアップが2時間掛からないのに、ごにょごにょしてるとはいえ、時間掛かり過ぎです。何度もやらないので我慢してますが、これ基にAutoMLしていい結果が得られれば報われますがどうだろうね~

2023/05/12

SSDとHDDを新調

 既に書いてましたが、予定通り金曜日になった深夜にAmazonに発注するとなんと本日配達予定。が、午前中に済むとふんでいた予定が午後に😱 配送業者が不明でなんともですが業者さんには申し訳ないけど、不在だったらまたお願いします。

シリコンパワー SSD 512GB 3D NAND M.2 2280 PCIe3.0×4 NVMe1.3 P34A60シリーズ 5年保証 SP512GBP34A60M28 ¥3,861
サンワサプライ M.2 SSD用ヒートシンク TK-HM5S ¥597
Western Digital ウエスタンデジタル WD Blue 内蔵 HDD ハードディスク 2TB SMR 3.5インチ SATA 5400rpm キャッシュ256MB PC メーカー保証2年 WD20EZAZ-EC 【国内正規取扱代理店】 ¥7,971
セメダイン タイルエース 120Ml RE-358 120ml ¥682
合計¥13,111
ギフト券¥4,900
ポイント¥1,323
差引¥6,888

まあ、こんなんです。最後のは自宅の風呂場の修繕用。最後まで4TBと悩みました。金額差は二千円に満たないのでね。しかし、4TBは大き過ぎると判断しました。現状1TB+1TB+500GBなのでまあ、500GBの所を2TBにすればしばらくは問題ないかと。

新馬戦用ファクター追加して

 新馬戦用のファクターにそもそも馬の性別入れてないとか、まあ、それを追加するついでに父馬にプラスして母馬と母父馬を追加してAutoMLの時間も30分に延長してやってみました。

予想[301] 的中[158] (52.49%) 購入[¥210,700] 払戻[¥395,200 (187.57%)]

そんなに悪くないのかな😉 全体的な予想用にもファクター追加して試してみようかと思います。



2023/05/11

機械学習での最初の予想結果

 新馬用って考えは、その時点でその馬のレース経験は当たり前ですが何もない状態なので予想ファクターとしては、競馬場、トラック、距離、天候、馬場、父馬、騎手勝率、調教師勝率を使うものとして試したんですが、このファクターのまま新馬戦以外にも試してみようと試みたんですが、CSVの出力が2時間半掛かりました😔 なので学習時間も10分ではなく30分に伸ばして試してみたのですが、

予想[1374] 的中[315] (22.93%) 購入[¥807,100] 払戻[¥346,290 (42.91%)]

でした。ああ、学習用に準備したCSVは2004年1月1日~2022年12月31日で、検証は2023年1月1日~2023年4月30日です。まあ、これじゃどうしようもないレベルだけど、実はまあ新馬用に先に試したのは学習用は同じ期間で検証は今年はまだ新馬戦ないので昨年1年間で試してたんです。

予想[301] 的中[130] (43.19%) 購入[¥196,700] 払戻[¥395,930 (201.29%)]

まあ、これがたまたまってか検証が学習期間に含まれているのが微妙な気もするけど、悪くないな~って事で新馬戦以外もあわてて試しました。新馬戦以外はやはり前走とかのデータを入れ込んで行うんですが、これが上手く出来るのかがね~😓 で、ファクター増えてのCSV出力が更に時間長くなるのも気になるので準備は慎重にやらなきゃですね。

ああ、検証なんですが、これまだ手抜きなんです。同着とか諸々考えずにざっくりと作りました。単勝、複勝、馬連、ワイド、馬単、三連複、三連単各1点買いです。同着考慮してないので、同着あったりしたレースは的中判定が出来てないかと思うので、実際には結果が違うんですけどね。あと、的中は全券種どれか1つでも当たっていれば当然的中となってます。三連単的中してればまあ他全て当たってるのかな。

2022/12/04中山5R

1着 14番 予想タイム[2'05"42]
2着 13番 予想タイム[2'05"44]
3着 5番 予想タイム[2'05"75]
4着 6番 予想タイム[2'05"88]
5着 10番 予想タイム[2'05"89]
6着 9番 予想タイム[2'05"90]
7着 2番 予想タイム[2'05"95]
8着 7番 予想タイム[2'05"96]
9着 4番 予想タイム[2'06"24]
10着 3番 予想タイム[2'06"47]
11着 8番 予想タイム[2'06"50]
12着 1番 予想タイム[2'06"62]
13着 12番 予想タイム[2'06"75]
14着 11番 予想タイム[2'07"13]
単勝[14] ¥320 複勝[14] ¥150 馬連[13-14] ¥850 ワイド[13-14] ¥400
馬単[14→13] ¥1,340 三連複[5-13-14] ¥5,570 三連単[14-13-5] ¥19,370

こんな感じです。それと、参考までにこのレースの勝ちタイムは2'5"0でした。ビリは7番の馬で2'7"4。これが良い結果が出てるのかどうなのかはなんともですけどね。4着は3番、5着は10番でした。

AutoML:自動機械学習(2)

今朝方体調不良で目が覚めた。ここ数日の肌寒さが気にはなっていたが特に対処しなかったのがたたったかな😨 くしゃみ、鼻水が止まらなくて寝てられなかった。とはいえ、先に進める必要があるので作業は続けてます。

前回進捗状況観る為にってやつですが、あれだと何が何だか分からない出力がだらだらと出るだけで、まあ、チュートリアルではなんであんなの入れているのか不明だけど、実際にはその続きが書かれているのかなぁ。

public class AutoMLMonitor : IMonitor
{
    private readonly SweepablePipeline _pipeline;

    private readonly List<TrialResult> _completedTrials;

    private readonly RichTextBox _richTextBox;

    public IEnumerable<TrialResult> GetCompletedTrials() => _completedTrials;

    public AutoMLMonitor(SweepablePipeline pipeline, RichTextBox rtbLog)
    {
        _pipeline = pipeline;
        _completedTrials = new List<TrialResult>();
        _richTextBox = rtbLog;
    }

    public void ReportBestTrial(TrialResult result)
    {
        return;
    }

    public void ReportCompletedTrial(TrialResult result)
    {
        var trialId = result.TrialSettings.TrialId;
        var timeToTrain = result.DurationInMilliseconds;
        var pipeline = _pipeline.ToString(result.TrialSettings.Parameter);
        _completedTrials.Add(result);
        // Console.WriteLine($"Trial {trialId} finished training in {timeToTrain}ms with pipeline {pipeline}");
        _richTextBox.AppendText($"Trial {trialId} finished training in {timeToTrain}ms with pipeline {pipeline}" + Environment.NewLine);
    }

    public void ReportFailTrial(TrialSettings settings, Exception exception = null)
    {
        if (exception.Message.Contains("Operation was canceled."))
        {
            // Console.WriteLine($"{settings.TrialId} cancelled. Time budget exceeded.");
            _richTextBox.AppendText($"{settings.TrialId} cancelled. Time budget exceeded." + Environment.NewLine);
        }
        // Console.WriteLine($"{settings.TrialId} failed with exception {exception.Message}");
        _richTextBox.AppendText($"{settings.TrialId} failed with exception {exception.Message}" + Environment.NewLine);
    }

    public void ReportRunningTrial(TrialSettings setting)
    {
        return;
    }
}

これが本来使うもので、ああ、実際には相変わらずConsole.WriteLineだったのでRichTextBoxに出力する様に修正してます。で、これをAutoML実行前に、

var monitor = new AutoMLMonitor(pipeline, rtbLog);
experiment.SetMonitor(monitor);

としておけばいい感じです。AutoMLの実行も

var cts = new CancellationTokenSource();
TrialResult experimentResults = await experiment.RunAsync(cts.Token);

って感じに変更なんですが、この部分がいまいちよく分かってないけど真似しておく😉 AutoMPが終わったら

var completedTrials = monitor.GetCompletedTrials();

mlContext.Model.Save(experimentResults.Model, data.Schema, $"ShinbaTime.zip");

てな感じで保存しておかないと無駄になるのでしておきます。保存しておけば、

DataViewSchema predictionPipelineSchema;
ITransformer predictionPipeline = mlContext.Model.Load($"ShinbaTime.zip", out predictionPipelineSchema);

predictionEngine = mlContext.Model.CreatePredictionEngine<ShinbaTime, ShinbaTimePrediction>(predictionPipeline);

とすれば使えます。予測したいサンプル準備して

yoso = predictionEngine.Predict(inputData);

まだまだやる事は多いけど、一時は全ての苦労が水の泡かと思ったけどなんとかなったかな😁

2023/05/10

あくまでも憶測かな

 今月初め、突然の起動不能に遭遇した事は書きましたが、その後も妙な現象を経験してます。まあ、そもそも動作不安定な事があったりしますので、このPC自体8月で丸5年。今回の原因と思われるというか、疑わしいのはやはり起動ドライブとして使っているSSDです。


健康状態「正常」だけど96%ってのが徐々に劣化がって判断も有かな? 流石にここまでずっとHDDでこのPCから導入してるSSDは初心者😅 的確な判断は無理だけど、HDDなら、ん?ってなると新たなドライブ用意してってしてましたが、現在繋げているHDD3台全てもう10年とかかな😥 そもそも、月曜日には一度Amazonの買い物かごに入れて...ポイ活に関連して週末まつ事にして保留。ああ、ちと余談ですがSSDって生物で日々値段が変わるので機種特定に至っていません。今のが500GBなので同サイズで検討中。まあ、お買い得なのは4,000円未満ですね。まあ、この際なんですが、3つ繋いでるHDDも不安材料ではあるのでHDDの2TB~4TB辺りのお手頃な奴にしたいとは思ってます。

今後の収入の目途がたたない現状での微妙な決断が必要な状態では贅沢は出来ませんので、SSD 500GBとHDD 2TBで9,000円程度で明後日には発注して土曜日に総取替後のOSクリーンインストール及び現状レベルの復元。こんな状態でも開発継続とか😖 日曜日に笑顔で競馬予想して全てを補えれば良いんだけどね~。



AutoML:自動機械学習

ここまでの苦労を無駄にしない為に、モデルビルダーでやる事を自前でMicrosoft.ML.AutoMLを使ってやってみようと、チュートリアル通りに進めてみます。既にCSV出力部分はここまで書いた様に出来上がってるしCSVファイル自体もあるので、これをソースとして使う。まずは、InferColumnsメソッド使ってテキストローダーの準備をする。

ColumnInferenceResults columnInference = mlContext.Auto().InferColumns(path, labelColumnName: "Souha", groupColumns: false);

これは説明ではCSVから数行読み取り、カラム毎のデータの種類を推測してるらしい。で、今回はモデルビルダーの時にも指定してましたが、

// 競馬場コード
columnInference.ColumnInformation.NumericColumnNames.Remove("JouCD");
columnInference.ColumnInformation.CategoricalColumnNames.Add("JouCD");

// トラックコード
columnInference.ColumnInformation.NumericColumnNames.Remove("TrackCD");
columnInference.ColumnInformation.CategoricalColumnNames.Add("TrackCD");

// 天候コード
columnInference.ColumnInformation.NumericColumnNames.Remove("Tenko");
columnInference.ColumnInformation.CategoricalColumnNames.Add("Tenko");

// 馬場状態コード
columnInference.ColumnInformation.NumericColumnNames.Remove("Baba");
columnInference.ColumnInformation.CategoricalColumnNames.Add("Baba");

// 繁殖登録番号_父
columnInference.ColumnInformation.NumericColumnNames.Remove("Chichi");
columnInference.ColumnInformation.CategoricalColumnNames.Add("Chichi");

これらのカラムは数値だけどカテゴリ別なだけで特段数値的な要素ではないのでその為の変更を入れる。で、テキストローダーを準備してデータビューを読み込む。

TextLoader loader = mlContext.Data.CreateTextLoader(columnInference.TextLoaderOptions);

IDataView data = loader.Load(path);

読み込んだデータビューの内、TrainTestSplitメソッドでトレーニングと検証に使うデータの割合を指定。パイプライン定義して、最適な予測方法を探す指示をする訳です。

TrainTestData trainValidationData = mlContext.Data.TrainTestSplit(data, testFraction: 0.2);

SweepablePipeline pipeline =
    mlContext.Auto().Featurizer(data, columnInformation: columnInference.ColumnInformation)
        .Append(mlContext.Auto().Regression(labelColumnName: columnInference.ColumnInformation.LabelColumnName));

AutoMLExperiment experiment = mlContext.Auto().CreateExperiment();

experiment
    .SetPipeline(pipeline)
    .SetRegressionMetric(RegressionMetric.RSquared, labelColumn: columnInference.ColumnInformation.LabelColumnName)
    .SetTrainingTimeInSeconds(300)
    .SetDataset(trainValidationData);

SetTrainingTimeInSecondsで秒数で時間指定(チュートリアルでは60秒でしたが5分にしてみた)して待つ訳ですが、進捗状況観る為に、

mlContext.Log += (_, e) => {
    if (e.Source.Equals("AutoMLExperiment"))
    {
        if (this.InvokeRequired)
        {
            this.logMessage = e.RawMessage + Environment.NewLine + Environment.NewLine;
            this.Invoke(new Action(this.OutputLog));
        }
        else
        {
            this.rtbLog.AppendText(e.RawMessage + Environment.NewLine + Environment.NewLine);
        }
    }
};

これ、チュートリアルではInvokeとか無しに単純にConsole.WriteLineしてるんですが、コンソールアプリじゃないので、RichTextBoxにログ表示させているんですがそのままではエラー出ます。で、その回避策としてInvoke使ってます。AutoMLの実行は、

TrialResult experimentResults = await experiment.RunAsync();

でしますが、これawaitしてるので、ログ出力が別スレッドからだとエラー起こす訳で↑のInvokeって事です。で、この一連のメソッド定義にもasyncが必要になる。ここまではスムーズに書き上げて実際に実行するとだらだらと何やらログが出て終わります。

ここから更に色々と修正加えるっぼいので一旦ここまでです。

2023/05/09

衝撃の新事実!

 ソースとなるCSVファイルは、まあ、簡単に出来上がり、早速モデルビルダー試してプロジェクトに入れ込んだ。で、衝撃の新事実は、プロジェクトに自動でモデルビルダーが入れ込む最適なモデル用のパッケージがターゲットとしてx64のみ😱 JRA-VANがもういつから言ってるのか分らない位前からJV-Linkの64ビット対応する予定ではあるが難航してるという事で未だに32ビットのままなので現在のプロジェクトも当たり前にx86ターゲットです。なので、モデルビルダーで最適なモデル入れてビルドしようとするとビルドエラーが出てどうしようもなくなるので、この苦労も一旦プロジェクトから削除orz

即座にJRA-VANがJV-Linkの64ビット化を完了するのは期待薄なのでどうするべきか。まあ、考えられる方法は現在のプロジェクトから64ビットアプリとして作る予想エンジンを別プロセスとして起動してその予想を受け取って使うとか。ただ、SQLite自体は基本2つのプロセスからのアクセスとか想定外となるので面倒な話です。JV-Link使ってSQLiteにデータ取り込んだ後、基本的に別プロセスに切り替えてそちらで作業する。でも、リアルタイムでオッズなんかも欲しいとかなると問題になるし考えたくないね。参りました。ああ、(3)の時に書いたチュートリアルが使ってたFastTreeRegressionTrainerって多分、別NuGetパッケージに入ってる奴で、Microsoft.ML.FastTreeとかがあるから、それ入れれば使えるのかも。まあ、なんにしても、基本的にCSVソースにする時には使うっぽい説明が書かれてる気がする。が、既にもう削除してるし、ML.NETどうしようか検討します。

ソースとしてはSQLiteからは無理な現状らしい

 アイビー先生の力も借りてみましたが、とっかかりの時点で使うInferColumnsメソッドがそもそもまあCSVが基本でSQLiteとかのデータ読込には対応してないので、前回リストに入れたものをデータビューにとかは出来ない。って事は、まあね、ソースをSQLiteからCSVとして抜き出して、それを元にすれば...ってこれするなら単純にモデルビルダーで行けるじゃんorz なのでautoMLについて調べる気力が失せました😨

なので、ちと方向転換して何をCSVとして吐き出すかがキーになりそうで、それを検討しながらまたCsvHelperのお世話になるんですが、既に忘れてます😖 出力用のクラスを

internal class STSrc
{
    public string JouCD { get; set; }
    public byte TrackCD { get; set; }
    public short Kyori { get; set; }
    public byte Tenko { get; set; }
    public byte Baba { get; set; }
    public long Chichi { get; set; }
    public float KishuSyoritsu { get; set; }
    public float ChokyosiSyoritsu { get; set; }
    public float Souha { get; set; }
    public STSrc
    (
        string JouCD,
        byte TrackCD,
        short Kyori,
        byte Tenko,
        byte Baba,
        long Chichi,
        float KishuSyoritsu,
        float ChokyosiSyoritsu,
        float Souha
    )
    {
        this.JouCD = JouCD;
        this.TrackCD = TrackCD;
        this.Kyori = Kyori;
        this.Tenko = Tenko;
        this.Baba = Baba;
        this.Chichi = Chichi;
        this.KishuSyoritsu = KishuSyoritsu;
        this.ChokyosiSyoritsu = ChokyosiSyoritsu;
        this.Souha = Souha;
    }
}

として、このマッピング用に

internal class STTable : ClassMap<STSrc>
{
    private STTable()
    {
        Map(c => c.JouCD).Index(0).Name("競馬場コード");
        Map(c => c.TrackCD).Index(1).Name("トラックコード");
        Map(c => c.Kyori).Index(2).Name("距離");
        Map(c => c.Tenko).Index(3).Name("天候コード");
        Map(c => c.Baba).Index(4).Name("馬場状態コード");
        Map(c => c.Chichi).Index(5).Name("繁殖登録番号_父");
        Map(c => c.KishuSyoritsu).Index(6).Name("騎手勝率");
        Map(c => c.ChokyosiSyoritsu).Index(7).Name("調教師勝率");
        Map(c => c.Souha).Index(8).Name("走破タイム");
    }
}

と準備して、

List<STSrc> st = new List<STSrc>();

をリーダーループ前に宣言して、

kaisaibi = rs.GetDateTime("KAISAIBI");
jouCD = rs.GetString("JOUCD");
rno = rs.GetByte("RNO");
tracdCD = rs.GetByte("TRACKCD");
ketto = rs.GetInt32("KETTO");
syoritsu = GetSyoritsu(cmdCK, kaisaibi, jouCD, rno, ketto, tracdCD);
// データクラス
STSrc shinbaTime = new STSrc(
                        jouCD,
                        tracdCD,
                        rs.GetInt16("KYORI"),
                        rs.GetByte("TENKO"),
                        rs.GetByte("BABA"),
                        GetChichi(cmdU, ketto),
                        syoritsu.Kishu,
                        syoritsu.Chokyosi,
                        rs.GetFloat("SOUHA")
                        );
st.Add(shinbaTime);

と回してリスト作ったら、

var path = @"ShinbaTime.csv";
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = true
};
using (StreamWriter sw = new StreamWriter(path, false))
using (var csv = new CsvWriter(sw, config))
{
    csv.Context.RegisterClassMap<STTable>();

    csv.WriteRecords(st);
}

とすればCSV出力は完了する。

CSVが出来たのでまあ普通にモデルビルダーが動かせるので試してみた。

Microsoftが使う機械翻訳が酷い

 英語のドキュメントを読むのは、コンピュータ関連なら相変わらずそんなに不自由なく出来ますが、Microsoftが自社のドキュメントを日本語で公開する際に使用する機械翻訳が本当に酷い。これ、chatGPTなりに沿った最近のBingの様にやり直して欲しいものです。今回のML.NET関連のチュートリアルからML.NET 自動機械学習 (AutoML) API を使用する方法を読む必要があり、読んでみれば分かると思いますが本当に酷いものです。多分日本人には理解不能なレベル。で、まあ、How to use the ML.NET Automated Machine Learning (AutoML) APIが原文かと思いますが、こっちの方がはるかに理解しやすいです。これを参考にしながら進めないと先に進めないので理解出来るように努力してみます。

若干気になるのは、このMicrosoft.ML.autoML NuGet packageの最新バージョンが0.20.1とか、まだまだ使うべきかためらうレベルのバージョンな気がしなくもないです。Microsoft.MLの方は2.0.1とかなので特に問題はない気がします。まあ、それでもプレリリースではないので、ここまで来たら乗り掛かった舟かなぁ😅

2023/05/08

Machine Learning:機械学習(3)

本日一連の動作が出来るまで来ましたが、最初の時に書いた データクラスなんですが、これ、まあ、頭の片隅にml.netのチュートリアルを観てた時だったか何かで単精度実数ってのが全てに使われる的な話があったんですが、気にせずに普通のクラスを書きました。しかし、動かしてみるとそれが原因でエラーになり思い出す始末。で、クラスメンバー全てfloat型に修正してどうにか動く所までは来ました。

トレーニングパイプラインの所がJouCDが文字列だから的なのが、データクラス全てをfloat型にしたので必要なくなり、抜けもありました。機械学習タスクを追加しなきゃならない所が抜けてましたので、

var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "Souha")
    .Append(mlContext.Transforms.Concatenate("Features",
            "JouCD", "TrackCD", "Kyori", "Tenko", "Baba", "Chichi", "KishuSyoritsu", "ChokyosiSyoritsu"))
    .Append(mlContext.Regression.Trainers.LbfgsPoissonRegression());

って感じに変更。あっ、データクラス修正時に追加項目がありちょっとその辺りも変わってます。本当は、FastTreeRegressionTrainerをってチュートリアルには書かれていますが、その通りに真似しようとしてもそんなトレーナー無いよって😖 でまあ、選択可能な3つ位あるRegressionから上記のもので試しました。

検証で、検証期間のデータをまたリストに読み込んでdataView用意して、

var predictions = model.Transform(dataView);

として予測して、

var metrics = mlContext.Regression.Evaluate(predictions, "Label", "Score");

で、評価なか。metrics.RSquaredとmetrics.RootMeanSquaredErrorが結果らしい。

しかし、結局の所、自分のものに出来ていないので本来のモデルビルダー利用して簡単に出来るらしい事が出来てないorz モデルビルダーはautoMLをサポートしていて、さまざまな機械学習アルゴリズムと設定が自動的に探索され、シナリオに最適なものを見つけるのに役立つらしい。モデルビルダー使ったチュートリアル動画観てると確かに5個位の結果の中から一番良いものが選択出来るようになっていて、そのシナリオのコーディングを使う的な話になってた感じ。先はまだまだ長そうです😓

2023/05/07

Machine Learning:機械学習(2)

 週末の予想なんかしながらだと微妙に作業は捗りません😓 しかも、先日のクリーンインストール後の後遺症なのか競馬ソフトが全体的におかしいな~って思って色々調べたり。まあ、そもそも、自分に落ち度があるとは思うけど微妙な部分が判明。いやね、先日のトラブルの原因は特定出来てはいないものの、起動ドライブには余分なものは入れないのが鉄則。JV-Linkもしかりです。で、これ、当たり前に毎回入れ直したりしてもD:ドライブに入れるんですが、これには連動せずにどこにデータをセーブするかを指定する所があるのを思い出しました。単純にTARGETなんかでJV-Link設定とかあるので設定ダイアログ開くと「データの保存設定」としてデータ保存場所の指定が出来るんですが、そこがD:にインストールしてもデフォルトではC:トライブに。しかも、これが隠しになってるので分かり辛い😖 本日たまたまコースデータの読込で今まで何の問題も無かった東京芝2400mとかが表示されなくて、あれ?ってなってデバックしてると上手く表示されるコースでも画像データのPATHがC:ドライブなんで、ほんと、あれれ?ってなりますよね。で、まあ、クリーンインストール後にその辺りの設定しなおしを忘れてたのが原因でしたが...JV-Linkのアンインストールからの再インストールとこのセーブ先の指定やら、D:ドライブに既に存在しているフォルダを名前変更しておいて作り直しのとかね。権限の問題でってのも引っかかるので一応ね。

で、前置き長くなりましたが本題ね。アイビー先生を極限まで問いただしたらやっと教えてくれました😁 前回書込みした最後の

mlContext = new MLContext(seed: 0);

なんですが、'seed: 0'の部分理解してませんので一旦無しに😉 データリーダーからデータを読み込んでリストに格納すればいいって事で

List<ShinbaTime> data = new List<ShinbaTime>();

と宣言しておいて、いつものリーダーループで

ShinbaTime shinbaTime = new ShinbaTime();

shinbaTime.JouCD = rs.GetString("JOUCD");
shinbaTime.TrackCD = rs.GetByte("TRACKCD");
shinbaTime.Kyori = rs.GetInt16("KYORI");
shinbaTime.Tenko = rs.GetByte("TENKO");
shinbaTime.Baba = rs.GetByte("BABA");
shinbaTime.Souha = rs.GetFloat("SOUHA");
data.Add(shinbaTime);

てな感じで読み込んでセットして、リストからデータビューを作成するのに

IDataView dataView = mlContext.Data.LoadFromEnumerable(data);

ってします。で、トレーニングパイプラインを作成するんですが

var pipeline = mlContext.Transforms.CopyColumns(outputColumnName: "Label", inputColumnName: "Souha")
    .Append(mlContext.Transforms.Categorical.OneHotEncoding(outputColumnName: "JouCDEncoded", inputColumnName: "JouCD"))
    .Append(mlContext.Transforms.Concatenate("Features", "JouCDEncoded", "TrackCD", "Kyori", "Tenko", "Baba"));

JouCDが文字列なのでこれを数値にするのにOneHotEncodingを使うらしい。で、要素全てを'Features'にまとめるってのも一気に指定(それがConcatenateね)。やれやれ、で、パイプラインでデータビューをトレーニングしてモデルを作成するのに

model = pipeline.Fit(dataView);

までで、今日はおしまい😉 まだまだ、大変です。

2023/05/05

Machine Learning:機械学習

 どうやら、人工知能の下位カテゴリに入るらしい機械学習ですが、この節目に挑んでみましょう。って事で、もう今回のプロジェクト作り始めた時から手を出そうとは思っていたけど、なかなか手が出ない。ってか、本家Microsoftのチュートリアルの方は微妙なアクセントがある方で見ていても若干違和感はある。まあ、それでもざっくりと理解はしたつもりです。その程度の英語の理解力はまだ残っているかと思います。しかし、実際にコーディングに取り掛かろうとml.netを何だっけ? モデルビルダー使ってとか、行き成りテキストかSQL Serverかの2択とかね😖 こちらはSQLiteなんでどうすんだよって感じになる。いや、別に入力が何でも出来るのは普通。しかもこのml.netってオープンソースでごにょごにょってやつなのでMicrosoftには縛られていない筈。

で、まあ、本来分かりやすくあちこちにチュートリアルで使われるコンソールアプリケーションですが、今時コンソールアプリを作る人って少数派では? なのに普通に探すとそんなんばっかりです。自分自身はWindowsフォームアプリ作ってるので回り道は避けたいのでプロジェクトのフォームの1つとして実装してみようと今日から本腰を入れて取り掛かってみます。

using Microsoft.ML.Data;

これをまず入れるんですが、これが既に名前空間'Microsoft'には'ML'とかないよってorz 参照が足りてないんですね。で、NuGetパッケージマネージャーでMicrosoft.MLを入れろって事で入れます。次にデータクラスを作成するって。まあね、今回はまだまだ最初なので簡単な物にして今後色々とって事で😉

public class ShinbaTime
{
    [LoadColumn(0)]
    public string JouCD;
    [LoadColumn(1)]
    public byte TrackCD;
    [LoadColumn(2)]
    public short Kyori;
    [LoadColumn(3)]
    public byte Baba;
    [LoadColumn(4)]
    public float Souha;
}
public class ShinbaTimePrediction
{
    [ColumnName("Score")]
    public float Souha;
}

こんな感じでしてみます。で、これはプロジェクトに新しいクラスとして"ShinbaTime.cs"って事で追加してみました。最初はフォームのローカルクラスとして定義してみたけど、チュートリアルではクラスとして追加するってなってるので。更にチュートリアルではこのクラスのPredictionの方をusingでってなってるので真似してみるとそんなのいらねえって😓 コンソールアプリケーションでは必要でWindowsフォームアプリでは不要って事じゃないと思うけど、なんだろね~。で、フォームのローカル変数として、

MLContext mlContext;

を定義して、Loadイベントで

mlContext = new MLContext(seed: 0);

ってな感じで初期化する。今日はここまでにします。

2023/05/04

Microsoft Rewards 5回目

 先日の突然のPC起動不能で、OSのクリーンインストールを余儀なくされた訳ですが、流石にほぼ戻ってきた感じです。で、まあ、今回のクリーンインストール後に画面な真ん中にEdgeの検索バーみたいなものが勝手に表示されているのはEdgeの新しい機能なのか全く理解してませんが、3日連続で検索すると3,100ポイント貰えるっていうのでダメ元で検索してましたが、5月1日のクリーンインストール後何日目かは上手く検索がカウントされなくて本日「おめでとうございます。3日間のチャレンジを終了し、3,100ポイント獲得しました」って事で一気にポイントが増えて5回目のAmazonギフト600円分を申請し数時間後にはメールが届いて無事にアカウントに登録しました。

もうどのタイミングだったか忘れましたが、デイリーストリークはリセットされちゃいました。普通に日課のMicrosoft Rewardsサイトを開けると何やらエラーが表示され、200をどこまで超えてたか忘れましたが開き直したりで無事に表示されるとポイントは消えませんでしたがストリーク値は0に。で、まあ、今は6だったりします。Amazonギフト残高も4,900円程になりポイントも合わせると6千円分超えた。もう少し貯めたらPS5用の増設SSDでも買おうかなっとSSDの値下がりチェックしながら検討します。2TBならもう12,000円程度まで下がってるし、4TBがお手頃になればな~っと😉

2023/05/03

ツールチップの最大表示文字制限

少し前からってか、元々他の所でもツールチップで情報表示する様にしたりしてました。でも、今回のはテキストの長さが最大6,800バイトと長めなので不安はあった。実際コーディングしてテストするとハングとまでは行かないものの該当する所にマウス持っていくとしばらく反応しなくなる。で、アイビー先生にツールチップに表示出来る文字数の制限とかあるか訊ねても特に制限ないよ的な回答。でも、明らかに長い時間待たされた挙句に何も表示されないとか😖 ふとね、やはり長さが問題で、最大値になる事は少ないんじゃないかと思い、テキストをツールチップに設定する前にTrim()してやると普通に表示される様になりました。マイクロソフトの公式でも少し眺めてみたものの制限には触れられていませんでした。いや、まあ、実際に制限は無いのかもしれないけど、現実問題として通常の利用では考えられない時間待たされた後に表示される様なら、そこは制限設けてリーズナブルな時間内で表示出来る所にしてほしいものです。

で、長いツールチップが他の場所でも表示されて非常に見づらい。これも何やら本来はコントロールの幅になるとかならないとかって何処かで見た気もしますが、画面の端から端までorz 更に検索するとこれを自前でコントロールする方法もあるけど面倒なんです。なので今回はこのまま他の開発続行します。

2023/05/01

突然のPC起動不能

 本日普通に朝起きてPC起動する。スマホ見たりしてたので、ふと、モニターに目を向けるとASUSマザーのロゴのままで、ん?リセットボタン押して再び試みるもやはりマザーのログで止まる😖まあ、今年8月で丸5年になるPCなのでそろそろ問題あっても不思議はないものの突然のトラブル。昨日まで新たに入れた2つのソフトが数日ぶっ通しでセットアップ作業していて、これが無条件に起動ドライブにインストールされ、そこにデータベース構築とかねぇ。しかも、数日動かして予想すら出来ない状態のまま、なんだこれ?って感じのソフトでした。やはりインストール先が指定出来ない様なソフトは入れないのが吉かも。いや、別に犯人が確定してる訳じゃないので...あくまでも怪しいってのとトリガー引いたかな~ってね。

まあ、そんなんで、今朝からOSのクリーンインストールとなり作業してます。SSDが年数的にも微妙な気はするけど、それ言ったら3つ繋いでるHDDなんかはそれ以前から使っていてるものなので、それらもねぇ。更にPCだってと考え出したらきりがないです。おいおい、予算組んで検討しなきゃですね。

追記
書き込んで確認すると4月30日ってorz 今日は既に5月1日です。なんだろ?このグーグルのブログシステムが前にも日付違ってたりしたんだけど原因不明です。