0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

判断特化AI「Jev」に来季の打撃成績を予想させたら、学習データ20〜50件ぶんくらいの力だった

0
Last updated at Posted at 2026-09-29

TypeSafe の Jev は、文章を書かずに「型の決まった答えと確率」だけを返す、判断に特化したモデルです。はい/いいえの確率(Noul)、選択肢の確率(Choice)、段階ごとの確率(Score)の形で答えが返ってきます。

確率つきで答えてくれるなら、野球の「来年どうなるか」の予想に使えるのではないか、と気になりました。どのくらい当たるのか、どこで外すのかを、公開されている MLB のデータで調べてみました。私は野球の現場の経験者ではなく、公開データを集計してみただけです。

Jev の呼び方

Jev は OpenRouter から呼べます。新規アカウントの無料枠(カード登録なし・残高 0 のまま)で、2 つの実験の評価に使った 697 回の呼び出しがすべて収まりました(返ってきた料金の合計で約 0.019 ドル=0.0107 + 0.0080)。

呼び出しは、状況を表す state と、聞きたいことを型つきで並べた questions を送るだけです。

body = {
    "model": "typesafe/jev-1.13",
    "state": {"context": "An anonymous MLB hitter's 2025 regular season. ...",
              "wOBA": 0.315, "xwOBA": 0.33, "strikeout_rate_pct": 19},   # 抜粋
    "questions": {
        "delta_bin": {"type": "score",
                      "instructions": "How will this hitter's wOBA in 2026 compare with his 2025 wOBA?",
                      "criteria": ["Big drop: ...", "Small drop: ...", "About the same: ...",
                                   "Small rise: ...", "Big rise: ..."]},
    },
}
req = urllib.request.Request("https://openrouter.ai/api/alpha/decisions",
                             data=json.dumps(body).encode(), method="POST",
                             headers={"Authorization": f"Bearer {key}",
                                      "Content-Type": "application/json"})
resp = json.load(urllib.request.urlopen(req, timeout=30))
probs = [resp["answers"]["delta_bin"]["probabilities"][str(k)] for k in range(5)]

返ってくるのは {"0": 0.02, "1": 0.32, ...} のような段階ごとの確率だけで、理由の文章はありません。

コード・事前登録・Jev の全回答は yasumorishima/jev-baseball に置いています。

最初の実験:ABS チャレンジが覆るか

最初に試したのは、ABS チャレンジ(ボール・ストライク判定への異議申し立て)が「覆るか」です。正解が 1 件ずつ付いていて、確率の当たり外れを測りやすいと思ったからです。

データの作り方

MLB の StatsAPI の試合データ(feed/live)には、チャレンジされた投球に reviewDetails が付いています。2026 年 8〜9 月の 777 試合から、投球判定へのチャレンジ(reviewType == "MJ")を 2,678 件取り出しました。

取り出すときに 2 つ気をつけることがありました。

  • 投球の details.call.description はチャレンジの後の判定です。そのまま使うと答えが漏れるので、元の判定は「どちらが申し立てたか」から出しています(打つ側が申し立てたなら元はストライク、守る側ならボール)
  • 投球に付いている count はその球の後のカウントです。直前のカウントは、1 つ前の投球から取ります

後から分かった取りこぼし:この記事を書いた後、別の記事のために 1 年分を集め直していて気づきました。チャレンジの結果で打席が終わるとき(見逃し三振・四球)は、reviewDetails が投球ではなく打席の側に付きます。この実験では投球の側しか見ていなかったので、集め直した 8 月 1 日〜9 月 27 日のチャレンジ 3,543 件のうち 893 件(25%)が抜けていました(拾えていた 2,650 件は、最初に集めた 2,678 件と集めた時期が違うため少しずれています)。抜けていた分は覆った割合が 48.6% で、拾えていた分(56.8%)より低めです。

Jev に聞いた 250 件は、すべて拾えていた側から選んでいます。そのため、この節の結果は「打席が続く場面のチャレンジ」についての結果です。距離だけの式を 8 月の全件で当て直し、9 月の全件(1,650 件)で測ると Brier は 0.102 でした。拾えていた 9 月分(1,238 件)では、元の式が 0.1121、当て直した式が 0.1123 でほぼ同じです。対象の集合が違うので 0.102 と 0.112 は直接は比べられませんが、全件にしても式が悪くなることはありませんでした。Jev には聞き直していない(無料枠を使い切った)ので、Jev の数字は拾えていた分だけのものです。

ゾーンからの距離は、ボールの表面がゾーンに触れているかで決まるので、「ゾーンの長方形からボールの中心までの距離 − ボールの半径」で出しました(ゾーンの角は丸くなります)。

def edge_in(px, pz, top, bot):
    """ボールの表面からゾーンまでの距離(インチ)。+ は外れ、- は触れている"""
    x0, x1 = -17 / 24, 17 / 24                     # ホームベースの幅の半分(フィート)
    dx = max(x0 - px, 0.0, px - x1)
    dz = max(bot - pz, 0.0, pz - top)
    if dx > 0 or dz > 0:
        d0 = math.hypot(dx, dz)
    else:
        d0 = -min(px - x0, x1 - px, pz - bot, top - pz)
    return (d0 - 1.45 / 12) * 12                    # ボールの半径 1.45 インチを引く

9 月から選んだ 250 件を Jev に聞き、8 月の 1,431 件で「元の判定と逆側に何インチ外れているか」だけのロジスティック回帰を作って比べました。Jev には座標とゾーンの上下に加えて、この距離も計算して渡しています。

結果:距離だけの式の圧勝

Brier スコア(確率の予想と 0/1 の結果のずれの 2 乗の平均、低いほど良い)は 距離だけの式 0.113、Jev 0.180 でした。

はっきりした球ほど、Jev だけが確率を寄せきれない

250 件を、元の判定からどちら側に何インチ離れているかで 4 つに分けました。判定と逆側に 1 インチ以上外れた 82 球は実際には 99% 覆っていて、距離だけの式も 98% と出しています。Jev の確率の平均は 65% でした。判定どおりの側に 1 インチを超えて入っている 63 球も、実際に覆ったのは 0 球なのに、Jev は平均 18% を付けています。

境目の近く(1 インチ以内)では、式も Jev も迷っています。判定どおりの側に 1 インチ以内の球でも 58% が覆っていて、StatsAPI の座標とゾーンから計算した境目は、ABS が実際に使っているゾーンを端まで再現できていないようでした。

そもそも題材が合っていなかった

ただ、この結果は測る前から見えていたものでした。ABS は追跡した投球の座標を決まったゾーンと比べる仕組みなので、答えはルールで決まっています。判断の問題になっていませんでした。

そこで、結果がルールで決まらず、本当に不確かなものを題材にしました。

本題:来季の wOBA がどれくらい動くか

打者の翌年の成績は、平均への回帰・運・年齢・故障などが混ざって決まります。ルールでは決まりませんが、打撃の中身を表す指標(xwOBA や三振率など)は手元にあるので、判断の材料もそろっています。

使ったデータと、比べ方

  • データ:自作の MLB データセット(Hugging Face の yasumorishima/mlb-stats)の打者の年別成績。Baseball Savant と MLB StatsAPI から作っています
  • 対象:2025 年と 2026 年の両方で 250 打席以上の打者 227 人。2025 年に 250 打席以上あって 2026 年に届かなかった 82 人は入っていないので、翌年も出場できた打者に限った結果です
  • Jev に渡すもの:2025 年の打席数・wOBA・xwOBA・三振率・四球率・ISO・BABIP・打球の傾向(ゴロ・フライ・引っ張りのフライの割合)・走塁スピード、年齢と守備位置は 4 区分。名前と球団は渡さず、数字も丸めました
  • 聞くこと:2026 年の wOBA の変化が、5 段階のどれに入るか(Score)

5 段階の区切りは、過去の「ある年 → 翌年」の組の変化量を 5 等分する位置で決めました。過去の組は、2016→2017 年から 2024→2025 年までの、両方の年に 250 打席以上ある 1,620 組です(60 試合だった 2020 年を含む組は除いています)。区切りは −36、−14、+3、+25 ポイント(1 ポイント= wOBA 0.001)になりました。

予想の良さは RPS(Ranked Probability Score)で測りました。段階を順番に足した確率と、実際の段階との差の 2 乗を平均するもので、「少し上がる」を予想して「大きく上がる」だった場合より、「大きく下がる」だった場合のほうを重く罰します。低いほど良い値です。

def rps(probs, b):          # probs: 5 段階の確率、b: 実際の段階(0〜4)
    cp, tot = 0.0, 0.0
    for k in range(4):
        cp += probs[k]
        tot += (cp - (1.0 if b <= k else 0.0)) ** 2
    return tot / 4

比べる相手は 3 つです。

  • 当て推量:5 段階すべて 20%
  • Marcel 法風のルール:打席数に応じてリーグ平均へ寄せ、年齢で少し補正するだけの式(学習なし)。変化の予想を中心に、過去の組で測った外れ方の幅で正規分布を置き、5 段階の確率にしています
  • 過去の例で学習したモデル:過去の 1,620 組から n 件だけ選んで学習したリッジ回帰
def marcel(u):
    lg = u["lg"]                                             # 2025 年のリーグ平均 wOBA
    proj = lg + u["pa"] / (u["pa"] + 600) * (u["woba"] - lg)
    age = u["age"]
    proj *= (1 + 0.006 * (29 - age)) if age < 29 else (1 - 0.003 * (age - 29))
    return proj - u["woba"]                                  # 予想した変化

全データで学習したモデルが Jev に勝つのは見えているので、知りたいのは「学習するモデルは、過去の例を何件もらえば Jev に追いつくか」です。この件数が、Jev が最初から持っている野球の知識の量の目安になります。新外国人や新人のように、データが少ない場面でこそ気になる量です。

結果を見てから都合のよい読み方をしないように、設計と「どういう結果ならどう読むか」を、Jev を呼ぶ前にリポジトリへ commit しました(PREREG.md)。

当て推量からの上積みは、Marcel 法風ルールの 3 分の 1

当て推量からの上積みは、Marcel 法風ルールの 3 分の 1

当て推量の RPS は 0.195 です。そこから何ポイント下げたかを並べました。

Jev は 0.015 下げていて、当て推量よりは良い結果でした。打者を選び直して 10,000 回計算した差の 95% 区間は [−0.029, −0.001] で、0 を含みません。

一方、Marcel 法風のルールは 0.046 下げていて、Jev はこれに届きませんでした(差 +0.031、95% 区間 [+0.017, +0.044])。事前に決めた読み方では「Jev は教科書的なルールより劣る」になります。

Jev の実力は、過去の例 20〜50 件で学習したモデルと同じくらい

Jev の実力は、過去の例 20〜50 件で学習したモデルと同じくらい

過去の 1,620 組から n 件(10、20、50、100、300 件)を選んでリッジ回帰を学習し、同じ 227 人で RPS を出しました。どの例を選ぶかで結果が変わるので、n ごとに 200 回選び直して平均しています。

200 回の平均で見ると、20 件で学習したモデルは Jev より悪く、50 件で学習したモデルは Jev より良くなりました。Jev は、1 件も学習させずに 20〜50 件ぶんくらいの予想を出していることになります。

ただし 20 件のときは選ぶ例しだいで大きくぶれ(95% の範囲 0.157〜0.242)、Jev の 0.180 はその中に入っています。また、測ったのは 20 件と 50 件の点だけなので、線が交わる位置は測った値ではありません。

Jev は「大きく動く」をほとんど想定していない

ここからは、結果を見た後に行った分析です。まず、Jev がどこで点を落としたのかを見ました。

Jev は「大きく動く」をほとんど想定していない

5 段階ごとに、実際にその段階に入った打者の割合(灰色)と、Jev がその段階に付けた確率の平均(橙)を並べました。5 等分で区切っているので、過去の組ならどの段階も 20% くらいになります。

2026 年も、227 人のうち 15% が大きく下がり、22% が大きく上がりました。Jev はそれぞれ 2% と 9% しか付けていません。「ほぼ同じ」と「少し上がる」に確率を寄せすぎていました。

1 人ずつ見ると、もっとはっきりします。Jev の 5 段階の確率に、過去の組で各段階に入ったときの変化の平均(−57、−24、−5、+14、+45 ポイント)を掛けて足し、「Jev が予想した変化」にしました。

Jev の予想は、ルールと比べても 6 割ほどしか動かない

横が実際の変化、縦が予想した変化です。点線の上に乗るほど当たっています。Jev の予想はほぼ ±30 ポイントの中に収まっていて、横に寝た帯になっています。

予想のばらつき(標準偏差)は Jev 13 ポイント、ルール 21 ポイント、実際の変化 36 ポイントでした。実際の変化には運も入っているので、よく当たる予想でも実際よりは小さく動きます。比べるならルールとで、Jev はルールの 6 割ほどしか動いていません。

なお、この「予想した変化」は 5 段階の平均から作っているので、Jev が「大きく下がる」に確率を 100% 置いても −57 ポイントより下にはなりません。図の左下の端は、この作り方の限界でもあります。

上がるか下がるかの向きは分かっています。予想と実際の変化の相関は Jev 0.57、ルール 0.62 で、それほど大きな差はありません。差がついたのは、動く大きさのほうでした。

大きく下がった強打者は外し、運の悪かった打者は当てた

大きく下がった強打者は外し、運の悪かった打者は当てた

名前の横は 2025 年の wOBA です。Jev には名前を渡していないので、Jev から見た Judge は「wOBA .465(0.005 刻みに丸めた値)、30〜33 歳の外野手」です。

Aaron Judge は 2025 年に wOBA .463 で、2026 年は 91 ポイント下がりました。ルールは「これだけ高いと平均へ戻る」として 75 ポイントの下げを予想しましたが、Jev は 20 ポイントの下げでした。Cal Raleigh(.392)や George Springer(.408)も同じ形で、実際は 90 ポイント前後下がったのに、Jev の予想は 15〜23 ポイントの下げです。ただ、ここまで大きな下げは、ルールも含めてどの予想も当てきれていません。

逆に、Jev のほうが当たった打者もいます。Henry Davis は 2025 年の wOBA が .229 と低く、xwOBA(.293)より 64 ポイントも低い「運の悪い」年でした。実際は 34 ポイント上がり、Jev の予想は +35 でほぼぴったりでした。ルールは +64 と上げすぎています。

Michael Conforto も、実際の +55 に対して Jev +34、ルール +11 で、Jev のほうが近い値でした。Conforto は wOBA が xwOBA より 43 ポイント低く、ここでは運の戻りを見ているかどうかで差が出ています(次の節)。

Jev は運を見ているが、平均への回帰をあまり見ていない

この 5 人の違いは、Jev が何を手がかりにしているかで説明できそうです。そこで、Jev が予想した変化を、次の 2 つの数字で説明する回帰を当てはめました。

  • 平均への回帰:2025 年の wOBA がリーグ平均よりどれだけ高いか
  • 運:2025 年の wOBA − xwOBA(打球の速さと角度から見込まれる wOBA との差)

同じ回帰を、過去の 1,620 組の実際の変化にも当てはめて比べています。

X = np.c_[np.ones(n), woba_minus_league, woba_minus_xwoba]
w_actual, *_ = np.linalg.lstsq(X_train, actual_delta_train, rcond=None)   # 過去の 1,620 組
w_jev, *_    = np.linalg.lstsq(X_test, jev_expected_delta, rcond=None)     # Jev の予想(227 人)

Jev は運を見ているが、平均への回帰をあまり見ていない

過去の組では、リーグ平均より 1 ポイント高かった打者は翌年に 0.43 ポイント、wOBA が xwOBA より 1 ポイント高かった打者も 0.43 ポイント戻っていました。Jev の予想では、運の戻りは 0.32 で実際より弱めですが、平均への回帰は 0.20 と半分以下です。

Marcel 法風のルールは逆で、平均への回帰は 0.57 と強めに見ていますが、式に xwOBA が入っていないので運の戻りは 0.01 とほぼ見ていません。Conforto でルールが +11 と小さく出たのはこのためで、過去の組の重みで計算すると +30 になります。

Judge のような「運ではなく本当に打っていた強打者」は、xwOBA も高いので運の戻りはほとんどありません。残るのは平均への回帰で、過去の組の重みで計算すると −66 ポイントですが、Jev はそこを弱くしか見ていないので −20 で止まっていました(実際は −91 で、重みの式でも届いていません)。

一方の Henry Davis は、過去の組の重みで計算しても +64 で、ルールと同じ値になります。Davis で Jev が当たったのは、この 2 つの手がかりでは説明できない、1 人の打者の結果です。

幅と平均への回帰を補った予想は、ルールと区別がつかない

Jev の予想の幅が狭すぎるなら、幅だけ直せばルールに追いつくのかも試しました。Jev に追加で聞き直すことはせず、手元の回答から計算しています。

  • Jev の予想の中心 + ルールと同じ幅:Jev が予想した変化を中心に、ルールと同じ幅(過去の組でルールが外れた大きさの標準偏差 32 ポイント)の正規分布を置いて、5 段階の確率にしました
  • 確率をならす:Jev の 5 段階の確率を p ** (1 / T) で平らにし、当て推量(各 20%)と w の割合で混ぜました。T と w は、227 人を 10 組に分け、9 組で一番良い組み合わせを選んで残りの 1 組で測る形で決めています(どの組でも T は 2.7〜3.2、w は 0 が選ばれました)
  • さらに、足りない平均への回帰を足す:1 つ目の中心に「(過去の組の重み 0.43 − Jev の重み 0.20)×(リーグ平均との差)」を足しました。どちらの重みも 2026 年の結果を使わずに決まる値です

幅と平均への回帰を補った予想は、ルールと区別がつかない

中心を Jev のまま幅だけルールにそろえると、RPS は 0.180 から 0.162 になり、ルールとの差(0.031)の半分以上が縮まりました。確率をならすほうは 0.168 です。それでもどちらもルール(0.149)には届かず、差の 95% 区間は 0 を含みませんでした(幅をそろえたもの +0.014 [+0.004, +0.023])。

そこに足りない平均への回帰を足すと 0.1505 になり、ルールとの差は +0.002(95% 区間 [−0.005, +0.008])で、区別がつかなくなりました。残っていた差は、ほぼ「平均への回帰を弱くしか見ていない」ぶんだったと考えています。ただし、これは結果を見た後に思いついて試した直し方です。

まとめ

今回のデータでは、次のような結果になりました。

  • ABS チャレンジのように答えがルールで決まる問題では、距離だけの式に大きく負けた(Brier 0.113 対 0.180)
  • 名前を伏せた打撃成績から来季の wOBA の変化を聞くと、当て推量よりは良く、過去の例 20〜50 件で学習したモデルくらいの力があった。ただ、Marcel 法風のルールには届かなかった
  • 上がるか下がるかの向きは分かっていて、運(wOBA − xwOBA)の戻りも実際よりやや弱いが見ている
  • 一方で、動く大きさを小さく見積もり、特に平均への回帰を弱くしか見ていない。結果を見た後で幅と平均への回帰を補った予想は、ルールと区別がつかなかった(もう Jev だけの予想ではない)

2 つの実験に共通していたのは、向きは分かっているが、確率が真ん中に寄りすぎることでした。個人的には、データが少ない場面で Jev の答えを出発点にするなら、平均への回帰と幅を少ないデータで補う形を次に試してみたいと思っています。

試したのは 1 つのモデルの版(jev-1.13-20260917)、1 つの聞き方、2025→2026 年の MLB 打者だけです。別の聞き方や別の題材では結果が変わる可能性があります。

付録

用語

  • wOBA:打席の結果(四球、単打、本塁打など)を得点への価値で重みづけした出塁の指標。リーグ平均は 2025 年で .313
  • xwOBA:打球を、実際にヒットになったかではなく、打球の速さと角度から見込まれる値に置き換えた wOBA
  • RPS:段階の予想の良さ。段階を順番に足した確率と実際との差の 2 乗の平均。低いほど良い
  • Brier スコア:はい/いいえの確率の予想の良さ。確率と 0/1 の結果の差の 2 乗の平均。低いほど良い

事前に決めたこと、後から見たこと

  • 事前に登録したのは、対象の選び方、5 段階の区切り、比べる相手、学習曲線(n 件で学習したモデルとの比較)、主な読み方です
  • 登録した読み方には「追いつく件数が 50 件なら〜」という規則もありましたが、先に「Marcel 法風のルールに劣る」の規則に当てはまったため、件数は記述として載せています
  • 5 段階ごとの割合、散布図、選手の例、回帰の重み、幅と平均への回帰の直し方、ABS の距離別の集計は、結果を見た後に行った分析です

注意点

  • 成績が外れ値に近い 17 人(どれかの指標が平均から標準偏差の 2.5 倍を超えて離れている選手)を除くと、当て推量との差は区間が 0 をまたぎます([−0.024, +0.005])
  • 数字を丸めても、Judge のような有名選手は成績から特定できるので、Jev が選手を知っていた可能性は残ります。成績を似た選手と混ぜて身元を消す検査もしましたが、混ぜると実際の変化の幅も狭まり(標準偏差 0.036→0.029)、予想の幅が狭い Jev に有利に働きます。記憶があれば混ぜた行で Jev は悪くなるはずですが、その分と有利に働く分が足し合わさって見えるので、この検査からは記憶の有無は言えません
  • 「Jev が予想した変化」は、5 段階の確率に過去の組の段階ごとの平均を掛けて出したもので、Jev が直接答えた値ではありません
  • 回帰の重みの比較は、Jev の予想(227 人)と過去の実際の変化(1,620 組)で対象が違います。2026 年の 227 人の実際の変化で当てはめても、平均への回帰 0.52、運 0.41 で、傾向は同じでした
  • ABS の比べる相手は StatsAPI の座標から計算したゾーンで、ABS 本体のゾーンを端まで再現してはいません

データと再現

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?