機械学習で競馬を勝つために必要なこと

AlphaImpact
NUKUI Shun
PyData.Tokyo #111

自己紹介
名前: 貫井 駿 (@heartz2001)
競⾺歴: 10年
好きな⾺: ハーツクライ
所属: 東京工業大学 情報理工学研究科
計算工学専攻専門: ソーシャルネットワーク・機械学習
サークル: 東工大競馬研究会 部長
競馬活動: AlphaKeiba開発
2

AlphaImpactプロジェクト• 第1回ウマナリティクスで出会った大元氏(@henry0312)と共同で最強の競馬AIを開発すべく発足• ディープラーニングを使っています(言いたかった)• 6月頃から開発をスタートし、10月より予測を毎週公開中
twitter: @alphaimpact̲ai
HP: h"ps://alphaimpact.jp/

3Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価

4

Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価5netkeiba.com[1]• 無料で使える (有料コンテンツもあり)• スクレイピングしやすいHTML• JRAが公式で公開している情報はだいたい網羅されている• 有料会員(月額500円)に入れば調教データも取得できる• 掲示板が馬ごとに掲示板があるのでNLPのアプローチでも？
[2]• 『競馬の予測をガチでやってみた』 のstockedge氏がnetkeiba-scraperを公開している
GitHub: h"ps://github.com/stockedge/netkeiba-scraper[1] http://www.netkeiba.com/[2] http://stockedge.hatenablog.com/entry/2016/01/03/103428

6

JRA-VAN (DataLab.)[3]• 公式なので信頼できる• 唯一リアルタイム投票数が取れる(単勝、複勝、馬連のみ)• 月額 2,052円• 固定長テキスト形式• APIがVisual Studio C++/C#にのみ対応(=Windows縛り)• Python使いとの相性は悪い[3] h"p://jra-van.jp/dlb

7

DataLab.の利用例 (AlphaKeibaの場合)
モデル(pkl)

JV-Dataロード

JV-Link
予測結果
(csv)
VC++
固定長テキスト

予測・馬券最適化
Python(py2exe)
データ成形

表示

集計
sqlite3

蓄積

レース選択

8

JRDB[4]• 古いlzh形式で配布されているが、URLを叩いて解凍すれば固定長テキストが取得できるので、どのOSでも使える• 99年からデータが提供されている(一部データ除く)• パドックの生の情報(馬体状態)などの独自コンテンツが豊富• IDMや基準オッズを始めとする様々な指数を提供しているのでテクニカル分析もできる• 馬券裁判でおなじみの卍氏も使っている[4] h"p://www.jrdb.com/

9データソースまとめ

データソース

月額料金

取得方法

メリット

デメリット

JRA HP

無料

スクレイピング

リアルタイムにオッズが取得できる

クローリングしずらい

JRA-VAN (DataLab.)

2,052円

固定長テキスト

リアルタイムの投票数や坂路調教が取れる.

Visual Studio(Windows)でないと動かせないAPI

netkeiba.com

無料(500円)

スクレイピング

基本的な情報をお手軽に取得できる

情報量はそんなに多くない

JRDB

1,980円

固定長テキスト

公式に無い馬場差やパドックなど+αの情報が豊富.
lzh形式で配布されているのでLinux/OSXでも使える

お金がかかるh"p://www.jra.go.jp/h"p://jra-van.jp/dlbh"p://www.netkeiba.com/h"p://www.jrdb.com/

10

Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価

11

馬柱

12

馬柱(レース情報)
競⾺場

クラス、年齢条件、重量条件、本賞⾦距離、芝ダート、内外、右左回り

13馬柱 (馬の属性)
性別・年齢・⽑⾊
所有⾺主
所属厩舎
⾎統

14

馬柱 (馬毎レース情報)
オッズ・⼈気レース間隔

⽄量
枠番・⾺番

騎⼿

15

馬柱 (過去戦績)(過去レースごとに)
年⽉⽇、コース、芝ダート、距離、条件、頭数、⾺番、⼈気、⾺体重、騎⼿、⽄量、
⾺場状態、着順、タイム、コーナー通過順
位、上がり３Fタイム、着差 etc.

過去戦績の⻑さは⾺ごとに異なる→ 固定⻑に区切る→ RNNで時系列データとして扱う
16

馬柱から特徴ベクトルにHorseTable
Race

Horse1.特徴ベクトル
特徴量選択・
データ成形

Horse2.特徴ベクトル

・・・

Horse1
属性
レース毎情報
過去戦績
過去戦績
過去戦績

HorseN.特徴ベクトル
情報量の多さは精度に直結する⇛独⾃の⾺柱を作ることが他者との差になる

17

Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価18単純な分類問題
入力:– レースRにおける出走馬Xiの特徴量 x i ∈ ℜ– レースRにおける出走馬Xiの成績 ti ∈ {0,1}出力:ti = 1 になる確率 pi (勝つ確率/スコア)

m・1着以内 or not
・着差0.1秒以内 or not• scikit-learnのモデルで簡単にできる• 確率が出るので馬券最適化がしやすい• AlphaKeiba (RandomForest)ではこの問題を解いている• 出走馬を独立に扱うので相性などの相互作用が考慮されない19

相互作用を考慮したモデル

相互作⽤を表す
特徴ベクトル

20

Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価21

学習データの分割• トラックの種類(芝・ダート・障害)や距離が違えば別の競技• 特徴量として区別するか学習データを分割するかはノイズと訓練データ量のトレードオフ

22

競馬場
異なる競⾺場には異なる傾向がある

23

AlphaImpactの概略図
JRDB

データ成形
モジュール

レースセレクタ

データ読込

ダウンロード

レース選択
JRDB
インターフェース
パース・挿入モデル

HorseTable
HorseTableHorseTable

読み込み

sqlite3

学習・予測
24

Contents
1. データの収集
2. 特徴量の作成
3. モデルの設計
4. 学習データの分割
5. 性能評価25

的中率・回収率

モデル性能(東京ダ短距離)

複勝・ワイドの正解数に対するリコール

ベースライン(単勝人気)

26

nDCG: Normalized Discounted Cumulative Gain
• ランキング学習の評価でよく使われる指標0以上で⼤きいほど強いことを表すスコア(指数を取る必要はない)⇛ 着順逆数下位になるほどスコアの加点が⼩さくなる

理想的なランキングのときのDCGで割る
27

まとめ• データの取得
Ø Python使いはJRDBかnetkeibaがおすすめ• 特徴量の作り方
Ø 独自の馬柱を作ることを意識する• モデルの設計
Ø scikit-learnでお手軽に遊ぶなら単純な分類問題
Ø さらに精度を目指すなら出走馬の相互作用も入れる• 学習データの分割
Ø ノイズと学習データ量のトレードオフで最良の分割を見つける• 性能評価Ø 的中率・回収率だけでなくnDCGなど多角的な評価をする

28