AI競馬で回収率100%越えを目指して

はなむけ競馬場

python プログラム 競馬

モデルを改造したら回収率が500%を超えた

更新日:

先日書いた記事の【テスト開始】回収率170%超えのAI開発に成功【解説】で回収率が170%と書いたが、いろいろ試している間に、何か回収率が変動するなぁということに陥った。

勘違いかと思ったが、毎回数値が変動していて、回収率170%の再現性がないじゃないかということになりました。

今回やったことを書いていきます。

モデルの再現性を取り戻す

基本的に使っているコードは下記のとおりです。


import json
import lightgbm as lgb
#パラメータの読み込み
json_open = open('lightbgm_binary_parameter.json', 'r')
regression_param = json.load(json_open)
# 特徴量と目的変数をlightgbmのデータ構造に変換する
lgb_train = lgb.Dataset(df_tra_x, df_tra_y)
#モデルの学習と予測
model = lgb.train(regression_param, lgb_train)
pred_label = model.predict(df_pred_x)

これで毎回予測結果が変動するために、回収率を計算するときに、数値が変動していました。

確かにLightgbmの乱数(random_state)についてはネットを調べていても、あいまいな記述しかなく、ほったらかしになっていました。

乱数を指定すれば変動もなくなるだろうと、random_state=71みたいにして計算・予測しましたが、何か全然うまくいきませんでした。

だれか詳しい人教えてください。

結局、作成したモデルを保存しておいて、それを毎度呼び出す形に変更しました。

import pickle
import lightgbm as lgb

# 特徴量と目的変数をlightgbmのデータ構造に変換する
lgb_train = lgb.Dataset(df_tra_x, df_tra_y)
#モデルの学習と予測
model = lgb.train(regression_param, lgb_train)
# モデルを保存する
filename = 'finalized_model.sav'
pickle.dump(model, open(filename, 'wb'))
#モデルの読み出し
model = pickle.load(open('finalized_model.sav', 'rb'))
pred_label = model.predict(df_pred_x)

この状態のモデルなら何度予測しても、同じ結果が返ってきたので一安心でした。

 

高い回収率のモデルを選択する

こうやって一定の回収率を常に出せるモデルが作れるようになりましたが、ここで一つ疑問が出てきました。

「回収率に結構な幅があるが、僕にとって都合のいいモデルを選んでいいのか?」ということです。

つまり、的中率・回収率の良いモデルを何度も何度も動かし模索して、高い数字のモデルを実際に動かそうということです(使っているデータは同じなのに、なんでこんなに差が出る?)。

逆に言えば同じデータ使っているなら、何してもいいということだろうか? わからない。教えて詳しい人。

別にこの辺りは過学習とかは関係ない、よね??? バイアスがかかる??

明確な答えが出るまでは、自分の都合のいいモデルを模索していこうと思います。

さしあたり、回収率が変動しました!!

3連複 3連単
ダート 508.9%  455.3%

や、や、や、やばすぎる……!!

どっかで計算をミスっている気しかしないが、今のところ変な計算ミスは発見できていないので、テストデータで予測したところ、これだけの数字が出た。

3連単とか2歳未勝利 結果・払戻 | 2019年11月16日 東京3Rをばっちり当てて、60万円を当てるという笑いが止まらない結果です。

実際の着順 人気 馬名 確率
1 4 テンサイドカップ 0.537
5 1 ピシュマニエ 0.507
2 11 ダイシンウィット 0.466
3 7 バルドダンサー 0.414

何より素晴らしいのが、人気が低い7人気と11人気を上位にもってきてくれたという事実です。

1~3人気を常に選ぶようなモデルなら、まったく回収率に期待できないので、これは望外の結果です。

最初のほうに作ったモデルは、1~5人気ばっか選んでくるアホモデルだったので。そんなの誰でもできる。むしろ機械学習する意味がない。

偶々かもしれませんが、実際にこういう結果を出してくれるということであれば、今後も期待できるモデルです。

60万円を予測できたのは120レースあって、一つだけでした。

他に目立った成績は14万円と16万円の馬券を的中させているようです。

100円が60万円に化けるなら、もはやいうことは一切ありません。この調子で頑張ってほしい。

 

油断は禁物

60万円が当たったことで回収率が大幅に上がったが、これが当たっていないと仮定すると、回収率は130~200%に一気に下がる。

それでもプラスになっていることに変わりはないが、変に期待すると大目玉を食らうだろう。

この馬券は買わない、みたいな独自の閾値を設定したことでムダ金が減ったことで回収率が上昇している。

見捨てた馬券の中に100万馬券があれば死ぬほど後悔することは請け合いだ。

安月給の中で種銭は限られているので、ほそぼそと実証実験をしていこうと思う。

 

まとめ

  • 再現性がなかったモデルだったが、モデル自体を保存・呼び出しをしたことで解決できた!
  • 回収率が高いモデルを意図的に選択して、ガッポリ稼げるぞ!(機械学習の運用として正しいかは知らない!!)
  • あんまり期待すると裏切られるので、金をどぶに捨てる意気込みでやれ!

-python, プログラム, 競馬

Copyright© はなむけ競馬場 , 2021 All Rights Reserved Powered by AFFINGER5.