競艇の結果予測
はじめに
さて、次は "競艇の結果予測" をするAIを作成します。
今回は、SIGNATEやKaggleの課題ではなく純粋にギャンブルの結果を予想するAIを作成するというものです。これで毎日少しずつ儲けたい...
参考サイト
○競艇公式サイト
○競艇AI予測サイト
https://www.madopro.net/entry/niceboat1#ボートレースの基礎知識
→多分これはワンホットの仕方をミスってる気がする
https://qiita.com/Gambler_AI/items/9c819525177fe73b986d
→回収率100%を超えるコードらしいが、データの取得もとのリンクが切れてる...
→みずはのめ。多分、競艇AIのなかでは一番良いAIな気がする。
○インプットデータとして役立ちそうなもの
http://www1.mbrace.or.jp/od2/K/dindex.html
→一応 "一般財団法人 BOATRACE振興会" のものだけど、今後もこの情報を取得し続けられるかは不安。
https://www.boatrace.jp/owpc/pc/extra/data/download.html
→レーサー期別成績がダウンロードできます。
https://docs.mizuhanome.net/#cecb4aa39f
→みずはのめのインプットデータのカラム一覧。実データを取得するには、月額5万くらい必要みたい。まあカラムが分かればよいかといった感じ。
出てくる単語メモ
コスト関数:
モデルがどれだけ悪いかを測定する関数。
線形回帰でいうと予測と結果の距離。
モデルを訓練するために使用する。
損失関数:
めんどくさいから、コスト関数と同じ意味だと捉えよう。
活性化関数:
ReLU関数など
その層が活性化するかどうかを決定する関数
(入力値に対してどれくらいの出力値を後続に流すかを決定する関数)
バッチサイズ、イテレーション数、エポック数:
https://qiita.com/kenta1984/items/bad75a37d552510e4682
競艇の例外コード:
F フライング
L0 選手責任外の出遅れ
L1 選手責任の出遅れ
K0 選手責任外の事前欠場
K1 選手責任の事前欠場
S0 選手責任外の失格
S1 選手責任の失格
S2 他艇を妨害・失格
機械学習チェックリスト
A.問題の枠組みを明らかにし、全体の構図をつかむ
1.ビジネスの用語で目標を定義する
目標は2段階。
①競艇の結果を予想するAIを作成し、毎日500円以上の利益をあげる仕組みをつくる。
②すべての処理を自動化し、人の手を介さず、毎日上記の利益をあげる。
2.ソリューションはどのようにして使われるか。
koniko自身が予想結果を知るために使用する。
3.現在のソリューション/代替ソリューションはなにか。
人の経験に従って予想というのが主流。
4.この問題はどのような枠組みで処理すべきか。
・オンライン学習
(※ただし、単純にするために、一旦はオフライン学習にてAIを作成する)
5.性能をどのようにして測定すべきか
予想タイムに対して、平均二乗誤差を算出。
--
RMSE(X, h) = √1/m mΣi=1 (h(x(i)) - y(i))2
--
6.その性能測定手段はビジネス目標に一致しているか
一致している。
7.ビジネス目標に到達するために必要最低限の性能はどのようなものか。
上述の通り、①予想機能のみを備え、②オフライン学習を行うものでOK。
8.類似問題はなにか。経験やツールは再利用できるか。
同一問題に関してすでに予想しているサイトがいくつかあるので、それを確認すれば類似は不要。その情報をなるべくぱくる (再利用する)。
9.専門知識を持つ人はいるか。
近くにはいない。現状のkonikoの競艇の知識でとりあえず進み、上手くいかなかったらネットで探してみるのもありかも。
10.手作業で問題をどのように解決するか。
エクセルで平均とか出すしかないかな。
11.いままでに立ててきた前提条件をリストにまとめる。
特になし
12.前提条件をチェックする
なし
B.データを手に入れる
1.必要なデータと必要度をリストにまとめる
以下重要度高とする。
--
○人関係
・レーサー番号
○環境関係
・場所
・コース
○船関係
・展示タイム
--
以下は参考情報。
--
・レース日
--
2.そのデータを集取できるドキュメントを見つける
以下から取得可能。
http://www1.mbrace.or.jp/od2/K/dindex.html
3.どれだけのスペースが必要になるかをチェックする
txtデータのみなので、スペースは問題なし。
4.法的な義務をチェックし必要なら権限を獲得する
法的な義務はなし。
5.アクセス権限を獲得する
獲得せずともアクセス可能。
6.作業空間を作る
7.データを入手する
データ入手済。
RaceResultsクラスを作成した。downloadメソッドとloadメソッドを備えた。
8.簡単に操作できる形式にデータを変換する
キャッシュに持つようにした。
9.機密情報を確実に削除または保護する
機密情報なし。
10.データのサイズとタイプをチェックする
以下は、月別の平均気温の標準偏差。1月は気温差が少ない。
http://www.astron.pref.gunma.jp/guidance/temperature.html
以下は、月別の雨の日数。やっぱり1月が良さそう。
http://www.niwakouiki.jp/PDF/13kisyotokei.pdf
データは何年分も取れるが、1月のデータをもとに予想をする。
なお、レーサー番号毎にカウントをし、カウントが19以下を棄却している。
--
期間:"2016-01-01" ~ "2016-1-31"
レースタイム数:13,196
--
サイズは気にするほどではない。
タイプって多分こんなデータって意味だと思うので上記の通り。
11.テストセットを抽出して別に保管し、決して中を見ない。
ソース上で分けるのでここでは対応しない。
C.データを探る
1.探索のためにデータのコピーを作る
webからいつでも自動で取れるので不要。
2.データ探索の記録を残すためにJupyter ノートブックを作る
作成済。
3.データの属性とその特徴を調べる
--
タイプ:全部文字列
欠損値の割合:タイムという観点でいうと、6挺中2挺くらのタイムはでないみたい。
ノイズの有無とタイプ:不明。外れ値とかはあるかも。
分布のタイプ:???
--
4.教師あり学習の場合、ターゲット属性を明らかにする
???。タイムでいいの?
5.データを可視化する
雑だけどこんな感じ。
6.属性の相関関係を調べる。
確かにやっても良いかもね。
7.マニュアルで問題を解決する方法を調べる
エクセル分析をするくらい。そしたらAIで良いよね。
8.適用すると良さそうな変換を明らかにする
ワンホットエンコード:コース、場所
スタンダードスケーラ:展示タイム
9.役に立ちそうな他のデータを明らかにする
あるとしたら以下かな。
・レーサー期別成績ダウンロード(LZH形式)
・番組表 (レース予定が載ってる)
・オッズ情報 (ある時点でのオッズが載ってる)
10.学んだことをドキュメントにまとめる
ここで書いているのでOK