![見出し画像](https://assets.st-note.com/production/uploads/images/49085368/rectangle_large_type_2_89a01baee9c8a386e872a33a00462f09.jpeg?width=1200)
[競馬予想AI] オリジナル指数をつくってみた
競馬予想AIの開発noteを始めて丁度1年が経ちました!
続けられているのはご覧いただいている皆様のおかげです。今後ともどうぞよろしくお願いします。
そして、本日からTwitterを開始しました。
こちらでは開発中のつぶやきやお知らせ、レースがあるときはピックアップ予想などつぶやけたらと思います。ぜひフォローをよろしくお願い致します。
指数とは?
本日のnoteはオリジナル指数をつくるお話です。
競馬で使用する指数では例えば「スピード指数」があります。この指数は馬の速さを表す指数で、指数が大きいほど速いことを表しています。また馬同士で指数を比べることができます。
指数が使い物になる条件としては値の大小に意味があり、それぞれ比較可能である必要がありそうです。
どうやって指数をつくる?
指数は一般的に数値の四則演算によって作られることが多いです。多項式で表すことができ、重回帰分析に近いイメージです。
機械学習やAIとの違いは指数を求める式を手動で作り出し分析するか、自動でするかの違いと言ってもいいでしょう。つまりAIの出力そのものが、ある種の指数と言えます。
オリジナルの指数の作り方
早速、オリジナルの指数を作ってみましょう。
作ってみようと言ったものの、実際には今まで開発してきたAIの出力を加工するだけになります。加工しなくても使えますが、やはり見やすい値の方がいいですよね。
オリジナルの指数の作成手順は簡単で、つぎの通りです。
1.AIの出力値の偏差値をとる
2.偏差値が高いほど強いのか(勝率は高いのか)を検証する
AIの出力値の偏差値をとる
AIは1着の馬を当てるように作ってあります。よって、出力値は馬の強さを表すような値であると仮定します。であれば、その偏差値をとればその馬がどれくらい強いか見やすい形に変形できるはずです。
#AI出力値から偏差値を計算する
pred_std = pred_df['pred'].std(ddof=0) #標準偏差の計算
pred_mean = pred_df['pred'].mean() #平均の計算
deviation_value = pred_df['pred'].map(lambda x: round((x - pred_mean) / pred_std * 10 + 50))
小数点以下の桁が多いと見づらいので整数に丸めています。指数の作成は実質これで完了です!
作った指数が機能するか検証する
指数が高いほど強い、つまり上位になってほしいので、作った指数が高ければ高いほど勝率が高くなるのかを調べてみます。
横軸に指数、縦軸に勝率をとってグラフ化してみます。
確かに偏差値が高いほど勝率が高くなっているように見えます。
◇
なぜ偏差値が約50以上の値しかとらない?
元々のAIの出力値が指数分布のように偏った形になっているからです。
偏差値50は平均値を示すのでこのような分布では0.0に限りなく近い値が偏差値50となってしまいます。なので、正規分布を前提とした偏差値とは違い偏差値の範囲で全体の何%を占めるかなどの計算には使えません。
なぜグラフが発散しているのか?
AIの出力値が大きいほどその数が少なくなるため勝率を計算する際の分母が小さくなり、勝率の値が安定しないからです。
◇
本当に偏差値が高いほど勝率は高くなるのか念のために、偏差値と勝率を回帰分析してみます。グラフが安定ている部分で回帰分析を実行します。
from sklearn import linear_model
clf = linear_model.LinearRegression()
X = np.array(x[50:101]).reshape(-1,1)
Y = y[50:101].reshape(-1,1)
# モデルを作成
clf.fit(X, Y)
# 回帰係数
print(clf.coef_)
# 切片
print(clf.intercept_)
# 決定係数
print(clf.score(X, Y))
回帰係数は0.00605498、切片は-0.17768689、決定係数は約0.754と求まりました。この区間においては決定係数約0.754なので相関を良く表してそうです。
回帰分析で求めた数式と先ほどの偏差値と勝率のグラフを重ねてみましょう。
こんな感じです。回帰分析なので係数と切片さえわかれば偏差値からおおよその勝率を求めることもできます。
このように、はじめ指数分布に従うような小数の値を整数で直線に近い形に変換することができました。これなら指数として使えそうです。
これを便宜上、とりまる指数と名付けることにします!
まとめ
今回はAIの出力をもとにオリジナルの指数を作ってみました。
AIの精度を高めるのは以降も課題となりますが、指数としては参考程度にはなるものが作れたのではないでしょうか。今後この指数を使ってた予想結果をこのnoteでお知らせできたらと思っています。
お知らせ
過去にサポート頂いた方でAI予想配信をご希望される方につきまして、2021年4月3日のレースから配信を開始する目途が立ちましたのでお知らせいたします。大変遅くなり申し訳ございません。
よろしければサポートをよろしくお願い致します。いただいたサポートは今後の技術向上のために書籍費用等に当てられ、このnoteで還元できればと思います。