2026/04/19

第86回皐月賞

相対タイム導入でひたすら作業してたんですが、本日午前中にGeminiに愛想つかしてGeminiにダメ出し後に自力で動くコードに戻す。相変わらずAIの頑固な考えには呆れます。そんなメソッドはそのクラスには無いよって言ってるのに何度も同じコードを提示するとかはさ、人間の世界では完全にNGですよね。リアルな会社で上司に間違い指摘され、更に同じミスを何度もした場合、まあ、現代の日本ではモラルなんかで守られているとはいえ、自分の時代の学校で先生に「1+1=3」ですって回答して、それ間違ってるよね? 正しい答えは? って言われ、再度「1+1=3」ですって回答して、これ多分数回続けたら殴られるか校長室に連れていかれるよね。

まあ、なんにしても、そんな作業を含め昨日は全く競馬してない(笑) 流石に時間的に一旦競馬しておこうかとね、独自予想です。

相変わらずです。

シンプルに穴狙いで行きます。でまあ、作業に戻ります。

2026/04/18

ひたすらコーディング

連日コーディングに明け暮れてます。最近はCopilotだけではなくGeminiも以前と比べやり取りが増えてます。そもそもどちらもAIなんですが、それぞれの企業の味が出てるって事なのかは分かりませんが、どちらも同じネット上の情報を元にしているにしては結構違いがある。

ああっ、前にGeminiに移行を考えてChromeへの乗り換えも検討した時に垂直タブ未対応で断念したChromeに確か最近垂直タブが実装されたようだけど、まだ試してないな。今はそんな余裕が無いってのもありますけどね。

モデル学習が壁にぶち当たってる感が半端なくて、まあそりゃ昨年8月辺りからだから、下手すれば1年経ってしまいそうな危機感で色々とやってきてました。で、たどり着いたのが今の作業です。ここまで基本3つの学習モデルに予想を託してきました。

  • 新馬戦用走破タイム予測
  • 通常用走破タイム予測
  • 順位予測(上記走破タイムを使用)

しかし、ここ最近ってか昨年8月から行っている作業ではRMSE 1.4の壁どころか1.45辺りにも壁が出来た感じがしてたんですよ。そこでまあ色々と試してきました。ここ最近はUbuntuでの学習とかね。でも、それも良い結果は得られず初心に帰った訳じゃないけど、そもそものAutoMLの使い方の改善。いや、実際にはML.NETのバージョンアップ関連での改善なのか改悪なのかは不明だけどRMSE 1.38とかは幻と化した。CopilotにもAutoMLの使い方の改善を相談したり、Geminiにも同様に相談した。

そんな中でGeminiがそもそも走破タイムの予測自体がAI的(AutoML)に限界まで改善はしての結果だから予測を変えた方が良いのでは?って提案をしてきたんです。それが相対タイム。その実装でひたすらコーディングしてるんですが、ここ数日、厳密には水曜日辺りからその学習用CSV出力をまず取り掛かって一応これまで同様にCKの有無で2種類。で、その過程でこれまでの走破タイム予測モデルの学習用CSV出力を参考にちょっと変えれば出来る話なのでと思いながら、でも、これってこれまで2~3時間掛かる処理だったけど、これも最適化しておいてからマネして作る方が無難と判断。巨大化した機械学習用のクラスを分割して

internal class MLTime : IDisposable

としてたクラスを

public partial class MLTime : IDisposable

として、追加するクラスを

public partial class MLTime

としながらプロパティやメソッドをそちらに分けて書く。なんとなく、自分的に分かりやすくする為に元々"MLTime.cs"ってファイル名だったので、追加のクラスのファイル名は"MLTime.SouhaCKCsv.cs"とする事で同じクラスだと認識しやすくしてみた。

で、Copilotに振り回され木曜夜は0時過ぎまで、昨夜はってか今朝方3時までやっても上手く動かず、今朝も朝からやって、いや、ほぼマジでCopilotに切れて文句言いながら修正させてたどり着いたのが15分ちょっとで2004年から2024年までの21年分出力が可能になった^^ まあ、先日もフルセットアップが改善して1時間掛からなくなったりしてたので期待はしてたけど、今朝やっとコンパイルエラーとか諸々なくなり走らせてみると終了予想が2,000分以上とかで、Copilotに「やっと走ってるっていうより、老人が歩いてるよ」って言いながらたどり着けた結果です。

自分自身はあまり理解してないけど、新たなC#の技法(いや、単に自分が知らないだけなんだが)は

// CK 用:列インデックス → SCSrc の PropertyInfo
private bool _ckMapInitialized;
private Action<SCSrc, int>[] _ckSetters;

を定義しておいて

    private string ColumnToProperty(string col)
    {
        // 例: "D2428C1" → "D2428Chaku1"
        //     "J01T3"   → "J01TChaku3"
        //     "KT5"     → "KTChaku5"

        // 数字部分を抽出(末尾の数字が着順)
        int len = col.Length;
        int pos = len - 1;

        // 末尾の数字を探す
        while (pos >= 0 && char.IsDigit(col[pos]))
            pos--;

        // col = prefix + number
        string prefix = col.Substring(0, pos + 1);   // 例: "D2428C"
        string numStr = col.Substring(pos + 1);      // 例: "1"

        // prefix の末尾が 'C' なら削除(D2428C → D2428)
        if (prefix.EndsWith("C"))
            prefix = prefix.Substring(0, prefix.Length - 1);

        // プロパティ名は prefix + "Chaku" + number
        return prefix + "Chaku" + numStr;
    }

これはまあ特になんじゃなく単に今回のASでの定義してる名前を処理しやすくする為とかでCopilotに言われて入れたけど、実際の使い方は

    private void ReadCkStats(DateTime kaisaibi, string jouCD, byte rno, long ketto, ref SCSrc scSrc)
    {
        _cmdSTCK.Parameters["@KAISAI"].Value = kaisaibi;
        _cmdSTCK.Parameters["@JOUCODE"].Value = jouCD;
        _cmdSTCK.Parameters["@RACENO"].Value = rno;
        _cmdSTCK.Parameters["@KETTO"].Value = ketto;

        using var rd = _cmdSTCK.ExecuteReader();
        if (!rd.Read())
            return;

        // ★ 最初の1回だけ setter delegate を作る
        if (!_ckMapInitialized)
        {
            int count = rd.FieldCount;
            _ckSetters = new Action<SCSrc, int>[count];

            var scType = typeof(SCSrc);

            for (int i = 4; i < count; i++)
            {
                string col = rd.GetName(i);
                string propName = ColumnToProperty(col);
                var prop = scType.GetProperty(propName);
                if (prop == null)
                    continue;

                // setter メソッドを取得
                var setMethod = prop.GetSetMethod();
                if (setMethod == null)
                    continue;

                // ★ setter をコンパイル済み delegate に変換
                var setter = (Action<SCSrc, int>)Delegate.CreateDelegate(
                    typeof(Action<SCSrc, int>),
                    null,
                    setMethod,
                    throwOnBindFailure: false
                );

                if (setter != null)
                {
                    _ckSetters[i] = setter;
                }
                else
                {
                    // short プロパティ用のラッパー
                    if (prop.PropertyType == typeof(short))
                    {
                        _ckSetters[i] = (sc, v) => prop.SetValue(sc, (short)v);
                    }
                    else
                    {
                        _ckSetters[i] = (sc, v) => prop.SetValue(sc, v);
                    }
                }
            }

            _ckMapInitialized = true;
        }

        // ★ 以降は delegate 呼び出しだけ(超高速)
        for (int i = 4; i < rd.FieldCount; i++)
        {
            var setter = _ckSetters[i];
            if (setter == null)
                continue;

            int value =
                rd.IsDBNull(i) ? 0 :
                rd.GetFieldType(i) == typeof(int) ? rd.GetInt32(i) :
                rd.GetInt16(i);

            setter(scSrc, value);
        }
    }

こんな感じらしい。これ見てもあまり理解してない自分が情けないけど^^;

2026/04/12

第86回桜花賞

ひたすらコード書いてる週末でした。今回はちょっと、まあ、Ubuntuで学習的な寄り道もありましたが、ここまで殆どノータッチだったAutoMLにメスを入れました(笑) で、先程24時間×5をスタートしたので金曜日の仕事から帰宅した時には終わっている筈です。ちょっと期待している反面、どうもML.NETが新しくなった事による攻めの甘さがあるとかなんとか^^; それが以前はRMSE 1.4未満が出たりしたのに最近出ない原因なのでは?って辺りもなんですが、Model Builderに負けてばかりも微妙だしなAutoMLって事も踏まえての挑戦かなぁ。

それ以外にもここまでほぼ放置状態だった、本来のさらだのレース詳細表示の標準モードで搭載済みなものを詳細モードにもって事で、その作業もしてます。しかし、ここで問題は詳細モード的には使うフォントを"MS Gothic UI 12"にすると想定通りの表示が出来るけど、実際にはバランス的にも微妙になるんですよ。ああっ、今回ちと触って分かったオプションでフォントを変える部分のバグってか、コーディングミス(?)的な部分にも手を加えたので、オプションで変えればしっかり反映はされます。でも、その為にトータル的にアプリの見栄えがってのがあるので、今後の課題として対処して行く事にはします。

前置きが長くなりましたが、今日のメインも独自に予想。当然学習モデルがもう一つだし、自力しかないのでね(笑)

当たり前に穴予想ですけど、
当たると嬉しいなぁ!

2026/04/05

Ubuntuで学習

ここの所挑んでいた学習なんですが、Ubuntu環境下でのWindowsとは違うメモリマネージメント下での学習でのメモリ不足問題の回避でしたが、やっと一旦検証とか出来るものが出たので検証してみました。

3,151R 1点 芝(1,486R) ダート(1,545R) 障害(120R) 8頭以下(188R) 9~12頭(720R) 13頭以上(2,243R) 多点
単勝 20.95%
(80.71%)
18.71%
(82.03%)
23.11%
(80.58%)
20.83%
(66.00%)
25.00%
(65.32%)
23.33%
(87.74%)
19.84%
(79.74%)
46.49%
(72.85%)
複勝 48.94%
(85.99%)
47.24%
(87.95%)
50.16%
(84.13%)
54.17%
(85.67%)
52.66%
(76.38%)
57.08%
(90.76%)
46.01%
(85.26%)
83.31%
(81.61%)
枠連 10.78%
(85.15%)
9.67%
(88.39%)
11.36%
(81.39%)
16.16%
(100.30%)
--
(--)
12.64%
(86.40%)
9.54%
(79.66%)
22.34%
(72.40%)
馬連 7.68%
(67.57%)
6.93%
(69.15%)
8.03%
(65.18%)
12.50%
(78.67%)
16.49%
(85.74%)
10.00%
(79.90%)
6.20%
(62.09%)
16.92%
(68.25%)
ワイド 18.15%
(77.88%)
16.89%
(76.44%)
19.16%
(80.88%)
20.83%
(57.08%)
31.91%
(73.62%)
23.19%
(83.11%)
15.38%
(76.56%)
35.67%
(78.09%)
馬単 4.32%
(72.10%)
3.84%
(78.01%)
4.72%
(67.37%)
5.00%
(59.75%)
9.04%
(71.33%)
5.00%
(94.58%)
3.70%
(64.94%)
16.92%
(65.51%)
三連複 4.00%
(76.14%)
3.97%
(68.48%)
3.88%
(84.87%)
5.83%
(58.50%)
14.36%
(76.86%)
5.00%
(65.65%)
2.81%
(79.44%)
11.08%
(72.28%)
三連単 0.95%
(58.76%)
0.87%
(32.33%)
0.97%
(85.77%)
1.67%
(38.33%)
4.79%
(96.44%)
0.97%
(86.32%)
0.62%
(46.75%)
11.08%
(66.05%)
総合 50.27%
(75.41%)
48.92%
(72.53%)
51.13%
(78.76%)
55.83%
(67.32%)
56.38%
(77.96%)
57.92%
(84.31%)
47.30%
(71.81%)
83.78%
(69.09%)

これはRMSE 1.4148なんですが、微妙なものですね。ただ、何故かは不明ですが、これまでのダート寄りってのが随分と改善されて芝も以前よりは良くなった気がします。

何にしても、まだまだ探究は必要な感じですね^^;

第70回 大阪杯

 相変わらずAIと戯れてます(笑) 行き詰まり感のある機械学習での改善策を模索してるんですが、これも当然簡単な話ではないです。 Windowsのだばだばなメモリー管理を避ける為にUbuntuに環境を移しての実現に挑んでるんですが、ここ数日色々とやらされてます。

最近の詐欺の手口じゃないけど、AIはもっともらしい話をして間違った事を案内します。それを人間が指摘して修正させるんです。

うわ~! Win5間に合わなかったorz これも仕方ないかとは思うが

独自に予想してたらWin5の時間過ぎてたのは自分のミスですね。
こんなんで行きました。

2026/04/04

AIとのやり取り

他の方達がどの程度AIを利用しているのかは知りませんが、自分はどうだろ? 最近PCに向かって動画視聴してる時は除いて8割程度の時間はAIとの会話だと思う。いや、別にボッチだとかそんな事ではなくてね、コード書く時にとか、まあ、色々とこれまで単にグーグル先生に質問的な話ではなくて、普通に「こんな感じに書いたコードを最適化するにはどうすれば良いの?」とか言いながら自分の書いたコードを貼り付けるとその改善案を示してくれる。

でもね、これがチョイチョイ罠で数時間嵌るのも日常茶飯事な訳です(笑) なので更に時間が掛かってるのってのが現状かもね。ただ、明らかにやり方、思考方法、色々と影響され変わってきてますね。それでも、常に正誤判定は人間である自分に責任はあるので大変です。

この所ってか、まあ既に昨年夏からだから9か月は路頭に迷ってます。自分の分かる範囲での最善方法の模索。結局無駄になりそうなここ最近のモデルの学習。抜け出せれば良いのですが、AIにチョイチョイ騙されて無駄な時間(?)をってか、まあ、全くの無駄ではないけど、この方法もダメだなと再確認させられたりですね。

2026/04/02

Microsoft Rewards 28回目

前回2月14日からなので48日目。ただ、既に数日前に交換可能だったけど、Microsoftが在庫切れとかで交換が出来なかった。にしても、今回はちょっと日数が掛かりました。ちょっとサボったからだと思うけど、別に焦らずに継続します。amazonギフトへの交換も5,425ptが600円と必要ポイントが増加してる気がします。まあ、amazonギフトも7千円超えて来たのでそろそろ何かに使おうかなぁとは思ってます😉