1. データ収集
BOAT RACE公式が提供するデータファイル (mbrace.or.jp) から、 B (番組表) ファイルとK (競走成績) ファイルを取得しています。
| ファイル | 内容 | 取得タイミング |
|---|---|---|
| B{YYMMDD}.TXT | 出走表 (選手情報, 機材, 成績) | レース前日 |
| K{YYMMDD}.TXT | 競走成績 (着順, ST, 配当, 気象) | レース終了後 |
データは Shift_JIS 固定長フォーマットで、バイト位置ベースのパーサーで解析しています。 2021年1月から2026年2月までの約5年分、計61か月を処理済みです。
2. データベース設計
PostgreSQL (Neon) 上に正規化された3層構造で構築しています。
- raw層 — 取得元データの保存 (アーカイブ用)
- normalized層 — 正規化済み業務データ (race, race_entry, race_result 等)
- analytics層 — 特徴量テーブル, 予測結果, モデル管理
全テーブルの INSERT は UPSERT ベースで冪等設計。 同じデータを再投入しても重複や破壊が起きません。
3. 特徴量設計
features_race_entryテーブルとして、1,650,480行 x 43列で生成しています。
公開モデル (v2) で使用する22特徴量はすべてレース前に取得可能な情報のみです。
使用する特徴量 (22列)
lane_nonational_win_ratenational_place2_ratelocal_win_ratelocal_place2_ratemotor_place2_rateboat_place2_rateageweightclass_gradestadium_idrace_nowind_speedwave_heightnational_win_rate_ranklocal_win_rate_rankmotor_rate_rankboat_rate_rankweight_ranknational_win_rate_difflocal_win_rate_diffmotor_rate_diff
除外した特徴量 (リーク防止)
course_nostart_timingfinish_position
これらはレース後にしか確定しない情報であり、事前予測に使用すると情報リークになります。
4. モデル設計
| アルゴリズム | LightGBM (Gradient Boosting Decision Tree) |
| 目的関数 | binary_crossentropy (is_top1) |
| 評価指標 | binary_logloss |
| num_leaves | 64 |
| learning_rate | 0.05 |
| feature_fraction | 0.8 |
| bagging_fraction | 0.8 |
| min_data_in_leaf | 200 |
| early_stopping | 100 rounds |
| best_iteration | 284 |
モデルの出力は各艇の独立確率ですが、1レース6艇の制約があるためSoftmax正規化をレース単位で適用しています。
P(i) = exp(score_i) / sum(exp(score_j)) for j in 1..6
5. 評価方法
データは時系列分割で分けています。 ランダム分割は未来情報リークを引き起こすため採用しません。
| 用途 | 期間 | サンプル数 |
|---|---|---|
| Train (学習) | 2021-01 ~ 2024-12 | 約 125万 |
| Valid (検証) | 2025-01 ~ 2025-12 | 約 32万 |
| Test (テスト) | 2026-01 ~ | 約 5.5万 |
評価指標
- Top1 Accuracy: AIの1着予測が当たる確率。ランダム=16.7%。
- LogLoss: 確率予測の対数損失。確率の正確さを測る基本指標。
- Brier Score: 確率のキャリブレーション精度。0が完璧。
- Calibration Curve: 予測確率と実際の的中率の対応関係。
6. データ出典
本サイトで使用するデータは、BOAT RACE公式 (mbrace.or.jp) が 一般公開しているデータファイルから取得しています。
予測結果や統計分析はBR-STAT独自のものであり、 公式の見解を代表するものではありません。