何年もUFCのファンで、最近少し空いた時間を使って、学習プロジェクトとして、機械学習を使ってどのファイターが勝つかを予測するウェブアプリを作ってみました。
驚くことにかなり良い出来で、精度はおよそ71.6%です。アルゴリズムを調整して、各ディビジョンの支配的なファイティングスタイルを考慮し、それに合うファイターにわずかな優位を与えるようにしました。
興味のある方向けに、MLパイプライン:
モデル:XGBoostの二値分類器(binary:logistic)— ファイターAが勝つか(1)ファイターBが勝つか(0)を予測します。ドロー/ノーコンテストは学習から除外しています。
特徴量(合計26)
重要な設計上の選択は差分特徴量です。すべての統計を絶対値ではなく「fighter_A − fighter_B」で計算します。これにより、SHAP値を相対的な優位としてそのまま解釈できます:
- ストライキング:SLpM差、有意な有効打命中率差、被弾差、ストライクディフェンス差
- グラップリング:TD平均差、TD命中率/ディフェンス差、サブミッション平均差
- 身体面:身長差、リーチ差
- 戦績:勝率差、フィニッシュ率差、KO/TKO率差、サブ率差
- 最近の調子:wins_last_5差、losses_last_5差、そして(直近ほど重みが大きい)レシェンシー重み付けのモメンタムスコア(最も新しい試合=5×、最も古い=1×、[−1, +1]に正規化)
- 経験:総試合数差、平均ストライク/TD/コントロール時間差
- スタイル文脈:style_win_rate_in_division差 — そのウエイトクラスにおける各ファイターのスタイル(ストライカー/レスラー等)の歴史的な勝率
- 差分を取らないもの:両者のスタイルエンコーディング(マッチアップの相互作用を捉えるためペアのまま保持)、ウエイトクラスのデルタ(本来のディビジョンからカット/アップしているか)
リーケージ防止
各学習サンプルについて、両ファイターの統計は「その試合の日時より厳密に前に行われた試合だけ」を使って計算します。未来のデータが混入しません。すべての試合を日付順に並べます。試合Nでは、特徴ベクトルに寄与するのは試合1..N-1のみです。
学習
- XGBoost:n_estimators=500, max_depth=5, lr=0.05, subsample=0.8, colsample_bytree=0.8, min_child_weight=5, patience=50で早期終了
- 80/20の層化(stratified)train/test分割
- 一般化を検証するための5-fold層化CV
- 指標:accuracy、ROC-AUC、log-loss
TreeSHAPは、各予測ごとに特徴量ごとの重要度(importance)値を生成します。これらは、生の統計量とともにClaude(claude-sonnet-4-6)へ渡され、自然言語による説明を生成します— Claudeは計算はせず、ナレーションするだけです(すべての数値は決定論的なパイプラインから来ています)。
https://ufc-fight-predictor-v1.vercel.app/
免責事項:これは個人的な学習プロジェクトであり、金融や賭けの助言ではありません。予測は過去の統計に基づいており、たくさんの回数で外れることもあります。
[link] [comments]




