機械学習で競馬予測をしたい

目的

私は競馬が好きである。しかし競馬はうまくない。そして私は機械学習を勉強したいと思っている。何かを勉強するには手を動かしながら学ぶのが一番である。つまり競馬の順位を機械学習で予測するアルゴリズムを組むことで, 私の抱える課題が一気に解決する。すばらしい。

というわけでクソアルゴリズムのうちはブログに公開しつつ勉強を進めていこうかと思います。そのうちアルゴリズムが改善され, 単勝回収率の期待値である80%を上回るようになってきたらアルゴリズムが公開されることはなくなるでしょう。

データをどこから集めてくるか?

先駆者さまのスライドを見る限りでは, JRAとnetkeibaなど有名サイトを含む4種類の方法があるようだ。netkeibaがpythonとの親和性が高く, しかも無料(大事)なのでまずはこれを使う。物足りなくなったらJRDBなどに拡張していこうと思う。

これからやることの計画

  1. 機械学習の手法をなんとなく知る(XGboostという手法を使っているサイトが多そうだったが他の手法に対する利点は?)
  2. なんとなく概観を掴んだらnetkeibaからデータをスクレイピングするソフトを書き, データを集める。
  3. データを元に何らかのアルゴリズムで予測。
  4. データ/アルゴリズムの組み合わせを色々変えてみて良さそうな手法を探る
  5. Courseraの適当な講座でアルゴの背景を理解する
    (これをここへ持ってきたのは私が「実践→理論」の順番で学ぶのが得意なタイプであるにも関わらず, まず沢山授業を取って頭でっかちになろうとする「悪癖」を持っており, それを戒めるためである)。
  6. アルゴの理解を元により応用的なプログラムの開発に取り組む

どうやって計画を達成するか?

機械学習のいかなるかをなんとなく知る

まず始めに私の現状は, 数理系の学科を卒業, Pythonは美しくはないが動くコードが書ける, そして機械学習の経験はほぼゼロ, といった感じである。前者2つはまあまあ有利な点と言えるのではないか。解決すべきは機械学習の経験がほぼゼロの現状である。

機械学習を学ぶ上で, 各手法ではどんな評価関数が使われていて, その最適化手法としてニュートン法が使われていて…といった手法の詳細にはこの段階では深入りしない。数式展開は時間をかけてやろうと思えばできる自身はある。しかし個々の手法に対してそれをやると僕の人生を全て費やしても終わらない。学ぶことは無限, 僕の人生は有限である。

ここで学ぶべきは「各手法のざっくりとしたイメージ」と「競馬予測に最も適した手法は何か」である。というわけでやさしい本を通読して理解を図る。良さそうかなと思ったのはこのあたり。

  • 見て試してわかる機械学習アルゴリズムの仕組み
  • データ分析のための数理モデル入門
  • Kaggleで勝つデータ分析の技術

「見て試してわかる機械学習アルゴリズムの仕組み」と「データ分析のための数理モデル入門」で概観を掴んだ後に「Kaggleで勝つデータ分析の技術」でデータ分析のより実践的なところを手を動かして学ぶ。

アルゴリズムの構築

うだうだと勉強を続けていても役に立たないことが多いので, 勉強は前述のあたりで一旦打ち切ってコーディングを開始する。この段階では既存の手法を既存の方法で組み合わせることで問題を解決する。

もし, この段階で既存のアルゴリズムを既存の方法で組み合わせる方針に限界が出てきた場合, 理論面の勉強を開始してもいいかなと考えている。この勉強は新規アルゴリズム開発のためではなく, 背景知識の理解によるよりアルゴリズム同士の効率的な組み合わせを施行することを目的とする。(新規アルゴの開発はスタンフォードあたりの天才に委ねることにする)

進捗状況

2021/04/27

忙しくて長いこと放置していたがぼちぼち進めていこうと思う。この日付時点で私は機械学習を使ったことがありません。今後の成長に乞うご期待

を読んだ。詳細な数式などには触れていないが概観を掴む一冊目としては良いのではないかと思う。

さて、機械学習を進めていく上ではそれなりのPCが必要だ。現在は手元のM1 macしかない。そこでGoogle colabを使うことにした。タダなのにごついGPUとそこそこのCPUが使えるようだ。Google先生パネェ。普段Jupyer labを使っているので乗り換えが楽だったというのもある。

ざっと調べてみた所既に同じようなことをやっている人が何人もいるのでまずは文献調査。巨人の肩に乗ることは大事。

参考:ディープラーニングさえあれば、競馬で回収率100%を超えられる

環境

  1. keras on Google colarboratory

method

  1. データスクレイピング(馬情報・レース情報・過去走データ)
  2. keras.sequentialでdeep learning

特徴:

  1. 「3着内かどうか」を予想

参考:LightGBMを使って競馬予想で回収率100%を超えるコードを書いた(その1)

環境

  1. Google colab

method

  1. データスクレイピング(netkeiba, 独自の特徴量を作成。過去時点で未来のデータが入らないように留意)
  2. LightGBMで学習。目的変数は3着内率

特徴:

  1. 3着指数の高さを閾値にして馬券購入(複勝)。一定値以上で回収率100%越え

文献調査によりなんとなく見えてきたことを以下に雑多に記す

  1. データスクレイピング先はnetkeibaが主流
  2. ディープラーニングは特徴量エンジニアリングしなくてよいので楽
  3. LightGBMは精度こそでるが特徴量エンジニアリングしないといけない  
  4. 現時点では単複を使う手法が多く、複雑な券種を対象にしたものはない(単複の期待値さえきちんと予測できれば、そこから他の券種の期待値を推定することはできると思う。)

今後の方針

というわけでなんとなくやるべきことが見えてきた。

  1. 小規模サンプルデータをデータスクレイピング(血統ヲタなのでなんらかの形で血統データを含める)
  2. 小規模サンプルデータを元に学習(LightGBMおよびディープラーニングの両方をやってみる。手を動かさないと手法のメリット・デメリットは見えてこない)
  3. 学習結果を元にスクレイピングデータの見直し
  4. 大規模データをスクレイピング
  5. 大規模サンプルデータを元に学習
  6. 馬券で勝つ
  7. ウハウハ

データスクレイピング

以下はやったことをひたすらにずらずらと並べているだけの個人用メモです

  1. スクレイピングにはseleniumを使う
  2. Google colabにはseleniumが入っていないので導入する(参考

Seleniumメモ

起動オプションメモ
  • –disable-dev-shm-usage: メモリスペースを/tmpに変更してメモリクラッシュを防ぐ(参考
  • –headless: 画面表示処理を行わない(参考
  • –no-sandbox: headlessでchromeを使う時に必要らしい。ざっとググったが出てこなかった。

202104/30 

スクレイピングを進めている。しかしここで「どうやってデータを整形するのが良いのかわからない」という問題が浮上。例えばディープラーニングで学習する時にどんなデータ形式(pandas, numpy?)を使ってどんなデータ構造(一列にまとめる?レースIDで辞書にするのが良い?)というのが見えていない。

そこでまず簡単なディープラーニングの実装をしてみることにした。新参者はtensorflowのwrapperであるkerasが楽らしいと聞いたのでそれに唯々諾々と従う。

この本の評判が良いが, 翻訳に難があるらしいのでせっかくなので原著に当たることにした。英語の勉強にもなるしね。全部やる時間はないのでとりあえず基礎に相当するPart1だけ全部読む。Part2は実践編なので流し読みで十分だろう。

2021/05/01

前述の本をひたすらに進めている。最初はpart1だけでいいかな〜と思っていたけどどうも全部やったほうがよさそうな雰囲気を感じている。8時間で90p読めたので読破には35時間くらいかかるかも。ダラダラやってると進まないので集中して一気に終わらせたい。

2021/05/07

前述の本を読み進めている。現在はConvolutional Neural Network(CNN)のchapterを読んでいる。競馬予測では入力データが最大でも3DのtensorにしかならないのでCNNは不要だが, 本業で使う可能性があるため真面目に勉強中。来週中には終わらせる。

コメント

Copied title and URL