競馬AIサイトを作って見つけた、データ処理の落とし穴6つ
AIが出す数字は、データの渡し方を間違えても、エラーにならず、「それらしい数字」が出てきます。だから、間違いに気づきにくいのです。この記事では、Tabnet競馬を作る中で、実際に見つけて直した6つの間違いを、見つけ方と一緒に紹介します。
1. モデルに渡す数字の順番を取り違える
オッズモデルは、「頭数」と「単勝オッズ」の2つだけを入力に使います。この2つを、学習したときと逆の順番で渡してしまうと、エラーは出ません。それらしい確率が出てくるだけです。
開発の途中で、この順番を取り違えていたことがありました。対策は、学習に使ったノートブックで列の順番を確認し、渡す側でも同じ順番に固定することです。出てきた確率が、オッズから見た目安(計算のしかた)から大きく外れていないかを見るのも、有効です。
2. 略称の取りこぼし
元のデータでは、馬場状態が「良・稍・重・不」の1文字で入っています。画面からは「稍重」「不良」と入力するので、両方に対応する変換が必要でした。
「不」の変換が抜けていたために、前走が不良馬場だった馬が、「良」として計算されていました。確認したデータでは、約2.4%の馬が該当しました。対策は、変換できなかった値を黙って通さずに警告を出すことと、全頭ぶんの変換結果を数えて確かめることです。
3. 「出走数」が1つずれる
前走の行にある「出走数」を、そのまま次走の出走数として使っていました。ところが、元データの出走数は「そのレースの前に、何走したか」を表しています。次走に使う値は、前走の値に1を足したものが正しいのです。
これに気づけたのは、レース前の出走表の値と突き合わせたからです。前走時点の値+1の関係が、約96%で成り立っていました。自分の計算結果を、別の経路で作られたデータと突き合わせると、こうしたずれが見つかります。
4. 日付から計算する値は、元データの数え方に合わせる
- 年齢:前走が前の年だった馬(休み明けの馬)は、年が変わったぶん、年齢を足す必要があります。現役馬の約5%が該当しました
- 間隔:日数を7で割るのではなく、JRAの開催週(土曜始まり)で数えるほうが、出走表の値とよく合いました(一致率は、日数÷7で95%、開催週で99.6%)。連休の平日開催をはさむと、1ずれてしまうのです
5. ある週から、ある列だけが空欄になる
ある週のデータから、「出走数」の列だけが、すべて空欄になっていました。最新のレースの行にこの空欄がある馬は、現役馬の約43%にのぼりました。
対策として、同じ馬の直前の値に、その後の出走数を足して、補うことにしました。あとから本物の値が入ったデータと比べると、約97%で一致しました。ここで役に立ったのは、欠損の「件数」と「いつから」「どの列が」を数えたことです。範囲と割合が分かると、対処が決まります。
6. 欠損を、黙って埋めない
欠損が1つでもモデルに入ると、内部でエラーになり、画面には「Failed to fetch」としか出ませんでした。原因が分かるように、事前に欠損を検出して、メッセージを出すようにしました。
さらに、以前の予想用ノートブックにあった既定値で補えるものは補い、「補った」ことを、結果の画面に表示するようにしました。補った値で出した予想は、信頼度が下がります。それを、利用者に隠さないためです。
まとめ
- 間違っても、それらしい数字が出る。だから、別の経路のデータと突き合わせて確かめる
- 影響を、「何頭中、何頭」「何%」と数える
- 欠損や補完は、利用者に見える形で示す
こうした確認を経た予想が、Tabnet競馬の次走予想で見られます。
あわせて読みたい
AIの予想は、次走予想で試せます。