競馬AIの作り方 part1
はじめに
お!競馬AI作ってみようかなっていう声がTwitter、Instagramで頂けたので、
そういった方の力に少しでもなれればと書いてみます。
予想させるAIってどう作るの?どう精度を向上させていくの?というのを書いていきます。
私が持っているノウハウを公開していくので、参考にしてください。
ゆっくり書いていこうかなと思いますので、
気長にお待ちいただけますようお願いします。
競馬予想AIをつくる流れ
目標付け
大事です。これがないと続きません。
・競馬が好きだから
・もっと当てたいから
・これで億万長者になるぞ!
・機械学習に興味がある
・勉強のため
・競馬で当たらなさ過ぎて、せっかく夫婦で競馬はじめてみたのにつまらなくてやめそう、、、、
なんでもいいです。
不純な動機でもなんでもいいので、自分が楽しめるものをやりましょう。(競馬予想AIじゃなくても株でもなんでもいいです。)
データ収集
データがなければ始まりません。
・無料でスクレイピングする
・有料のデータを使う
・自分で日々コツコツつけていたデータを使う
等があるとおもいます。
基本的にはなんでもいいですが、
他との差別化を考えると、
「無料でスクレイピングする」だけでは物足りないのではないか?と思います。
理由は、それをみんなやってるからです。
スクレイピングしたデータを学習させて、はい終わり!できた!!というQiita等の記事がやたら多い気がします。
ただ、初めてやるのであれば、それでよいと思います。
実際に手を動かして、初めてわかることがたくさんありますし、
やっていくなかでこうしたらどう!?というのもわいてきます。
スクレイピングには気をつけてください。
誰かのコードをコピペして、それにバグがあったら?
スクレイピングするサイトに負荷をかけすぎて、サーバを落としてしまったら?
他人のサーバにアクセスしていることを理解した上で、迷惑をかけないようにしましょう。
データクレンジング
データ収集と一緒にしても良かったのですが、
大事なことなので、分けました。
データって以外と汚いんです。
無料でも有料でもほとんど汚いことが多いです。
なので、自分が使いやすいように綺麗にする作業が必要です。
空白とか変な文字が入っていたら綺麗に取り除いてあげるイメージです。
学習させるときにも、シンプルできれいなものを教えたほうが当然精度があがります。
人間と同じです。
機械学習とかAIとかってすごいことに見えるし聞こえますが、魔法が使えるわけではありません。
データ加工(前処理)
データクレンジングと似たようなところはあるのですが、
少し掘り下げたことだと思ってください。
一番重要だと思っています。
テーブルデータの理解
上り3Fとか、脚質がどうとか、、、、
競馬の知識がいります。(ドメイン知識とか言います。)
理解した上で使わないと、良いデータがあっても宝の持ち腐れになります。
欠損値処理
値がない場合があります。
レースが中止になった、初めてのレースでデータがない(新馬)等が該当するかと思います。
そこを埋めてあげるorレコードを削除する(新馬戦は予想対象外にする)等を考慮しなければなりません。
埋め方は一般的には、中央値で埋めることが多いと思います。
他には平均値、最頻値で埋めるということがあります。それもどういった意図で埋めるのかを考える必要があります。
カテゴリ変数処理
機械学習では、学習データは全て数値にしなければなりません。
ここで言う数値とは、整数か小数です。
機械学習では、数値は、「順序のあるもの」と学習されます。
例えば[1、2、3]とあれば、3が一番強いんだ!と学習してしまいます。
では、馬番データを考えてみます。
馬番[1,2,3,4,5,6,7,8,9,10]があったとして、
10が強いんだ!と学習してしまいます。
たしかに外枠が強いレースもありますが、一般的には内枠が有利のことが多いと思います。
よって、
順序性をつけたデータとして学習させたいか、順序はないただのカテゴリとして学習させたいか?
を考える必要があります。
カテゴリ変数にするやり方は学習器によって違います。
また、様々な種類があります。
categoryとしてpandasに指定するやり方もありますし、
ワンホットエンコーディングというものもあります。
要するに、馬番1であるか、馬番1ではないかということを示してあげます。
(true or false、0 or 1みたいなイメージです)
上り3Fは数値で~~~、馬番と枠番はカテゴリ変数で~~~
ということも考慮、判断が必要です。
データスケーリング
データの単位をそろえてあげることです。
上り3Fの単位と、レースタイムの単位は違うデータがあるとします。
それぞれの単位を統一してあげることで、機械はわかりやすいデータで学習することができます。
その他
・データ変換(対数変換とか)
・次元削減(特徴をみながらデータを削減して、学習速度を上げる)
、、、などがあります。
必要に応じて使用しましょう。
ここでは割愛させていただきます。
特徴量追加、特徴量選択
前処理というところに書くべきなのかもしれませんが、
特に重要と思いますので、別として書かせて頂きます。
特徴量というのはパラメータのことです。
特徴量選択というのは、どのパラメータを学習データにいれるかということです。
「特徴量」が重要な理由は、
ここで他のAIと大きな差別化ができると考えているからです。
特徴量とは具体的に書くと、
「短距離」のレースなら「ロードカナロア産駒」が強いでしょ!
これです!!!
距離のデータと、血統データを用いて新たなパラメータを追加しています。(短距離かつロードカナロア産駒の場合は1、それ以外は0とパラメータで持つイメージ)
ここで、競馬の知識、データ解析して得た知識、その他独自のノウハウが試されるところです。
おそらく、やってみた系の記事、Youtube動画は、データをそのまま突っ込むことしかしてないのではないかと思います。(違ったらすみません)
重要ではありますが、一番難しいところでもあります。
何十年も競馬をやってきた知識を特徴量として追加して、結果の精度が下がっていた、、、、なんてことも全然ありえるからです。
最高結果を100点とすると、
前処理では、0.1や0.01しか変わらないというのはざらです。(前処理をきちんとした上で、技術のある方が調整しても)
ですが、特徴量選択で大きく違いがでてきます。
様々な観点から競馬を分析する必要があり、
特徴量追加、特徴量選択をする、結果をみる、、、、試行錯誤する必要があります。
ここが一番難しいところでもあり、一番楽しいところでもあります。
学習
ようやく学習です。
といっても、学習の仕方は、学習器のチュートリアル通りやるだけです。
多少の違いはあれど、ここは差別化できるようなところもあまりありません。
(データにあった学習器を選択する、分類させるのか回帰させるのか、目的変数を変えてみる、ハイパーパラメータを調整する、というのは違いがでてきますが、そこまで違いはありません。)
一応ざっくり書いておきます。
学習器とは、機械学習の学習システムのことです。
厳密には違いますが、よく聞くLightGBMを使うのか、Deeplearningでやってみるのかとかそんなところです。
目的変数とは、予測させるパラメータのことです。
着順を目的変数にすれば、着順を予測するモデルをつくれる。
また、レースタイムを目的変数にすれば、レースタイムを予測するモデルをつくれる。
といったようにどの観点から予測させるか、というのも重要になります。
結果をみる
ここも重要ですね。
学習曲線をみて、過学習していないか等をみます。
過学習とは、学習データについて学習しすぎて、実際のデータで予想させたときにあれ??予想精度全然悪いじゃんってなっちゃうことです。
[特徴量追加、選択→学習→結果をみる]を試行錯誤することが多いです。
学習面の結果をみるのはもちろんですが、
競馬の場合、回収率、的中率、はたまた独自のポイントを考えて結果をみてあげる必要があります。
独自のポイントとは例えば、予測上位5頭の中に1着がいれば10ポイント、2着がいれば5ポイント、、、等で平均何ポイントとれているか?みたいな感じで精度をはかることができたりします。
最後に
長くなってしまいましたが、
競馬AI作成手順をざっくり書きました。
細かい話は、次パートでゆっくり書ければなと思っております。
間違っていたりしたらコメントください。
指摘があることで、精度もあがります。
よろしくお願いいたします。
この記事が参考になれば幸いです。
ありがとうございました!
0 件のコメント:
コメントを投稿