統計やAIで宝くじ(ミニロト)を予想してみたいと思う~AI作成とその有効性の判定編~

はじめに

前回までで、宝くじにもしかしたら、規則性があるかもしれないと思い、AIモデルの作成に着手するのでありましたが、残念ながらやはり宝くじ、正直なところ、私個人としては、まったく期待ができないのであります。AIや機械学習、統計においてですがガーベッジインガーベッジアウトという言葉があり、文字通りゴミを入れるとゴミが出てくるという言葉なのであります。今回の目標はそのようなゴミ?を入れて、AI自体が使えそうかどうかを判定することを目標として行こうかと思います。

結論

AI(RNNモデル)の予測値はあてずっぽうで10万回トライした場合の正解率上位5%を超えているため、AIにおける予測の優位性を示せたと思います。
入力されているデータはゴミではなかったということを結構ギリギリな感じで示せたと思います。また、別のAI(LSTMモデル)ではモデル自身がナンバーが出現しないほうに賭けるほうがいいという結果がでました。要は買わないほうがいいことを示しており、それはそれである意味では正しい結果になったと思います。宝くじモデルを作成に懐疑的な私でしたが、そうではないということで、ある意味素晴らしい結果になったと思います。また、この結果は経験で当てられる可能性を示していますで素晴らしい結果です。

今後の課題

ナンバー1が出現するかどうかのモデルをつくりましたので、ナンバー1から31までの出現するかどうかのモデルを作る必要があると思いました。正直これは簡単です。楽勝です。
加えてですが、そのモデルを作成して、その期待値を超えられるかどうかの検討も必要になるでしょう。最後にですが、ボーナス番号もモデルに組み込みたいというのも課題でしょう。

実はモデル作成に困ったぞ

宝くじのモデルをつくるにあたって、31のナンバーの中から5つのナンバーを選ぶということになります。学習モデルの作成にあたっては31次元のベクトルに要素1が5つ、そして要素0が26個あるベクトルとなるでしょう。一般的な機械学習では2値分類、多値分類が一般的ですので、これはn次元のone-hotベクトル(要素1が1つだけあり、要素0がn-1個のn次元のベクトルなお、2値問題の場合はn=2)を学習に使用します。今回宝くじの学習に使用するベクトルはone-hotベクトルではないのです。つまり、一般的な問題ではないので専門書などを適当にコピペでは絶対にできないということになります。これは非常に困ったさんです。

こうすればいいのでは?

要は、2値問題または多クラス分類をつくれば、いままでのやり方でもできるはず。ということで強引に2値問題に帰着させればいいのではないのかということを思いついた?というか調べました。要はナンバー1が現れる確率が高ければ1低ければ0のモデルを作る。次にナンバー2が現れる確率が高ければ1低ければ0のモデルを作る。ナンバー3が現れる確率が高ければ1低ければ0のモデルを作る。というのを繰り返し31個のモデルを作ってそれぞれ判定すればいけるはず。
この考え方は以下の多ラベル分類についての記事が参考になりました。
今回はナンバー1が出るかどうかを予測させることを目標とします。


モデルの作成

前処理

数字を1,0ベクトルに変更します。
例えば、[11,23,25,27,30]という数字が出た場合、という0と1のベクトルを作成します。
[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0]
このようにすることで、31次元の0と1のベクトルにすることで、コンピュータの計算をしやすくします。余談ですが、0~1の間にパラメータを正規化することにより、AIの計算の精度は上がるそうです。
訓練用のデータとテスト用のデータとしてして以下のように整理していきます
$${x(n)}$$をn回目に発表されたナンバーとします。例えばn回目に発表されたナンバーが[11,23,25,27,30]となったとき
$$
x(n)=[0,0,0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,1,0,1,0,1,0,0,1,0]
$$
となります。これを整理して以下のようにします。τはどこまで振り返って計算するかになります。今回τ=100としました。
$$
[x(1)・・・・・x(τ    )]→[x(τ+1)]
[x(2)・・・・・x(τ+1)]→[x(τ+2)]
・・・・・・・・・・・・・・・
[x(n-τ)・・・・・x(n)]→[x(τ+1)]
$$
→の左側がAIに入力するデータ、
→の右側がAIに教える出力側のデータになります。
今回出力側のデータはナンバー1が出現するかどうかの判定をしますので、0ならば出現なし、1ならば出現とします。

学習用と検証用にデータを分割します
学習用に使用するデータ 792個の31次元ベクトルのデータ
検証用に使用するデータ 199個の31列のデータの中から最初の一つ目の要素(ナンバー1の出現に関する情報のみを取り扱います。)

モデルの選択

時系列データ処理を扱いますので、その中でも基本となるモデルであるRNN(Recurrent Neural Network)とLSTM(Long Term Short Memory)を使用してみます。RNNの弱点として、過去内容を記憶できない欠点があります。その欠点を解決のしたのがLSTM(Long Term Short Memory)で過去の内容を記憶しておける点に優位性があります。ただしRNNに比べて計算に時間がかかるというデメリットもあります。

予測値モデルの目標精度

検証用のデータは結果として以下のことがわかっています
・199回中1のナンバーを出現したのは32回
・199回中1のナンバーが出現しなかったのは167回

正解率の定義


ところで、一般的には宝くじのナンバーは正直あてずっぽうで決めるのが普通だと思います。

そのあてずっぽうでどのくらいの期待を持てるかを一度検証します。あてずっぽうで適当にナンバー1が出るか出ないかと実際の宝くじにナンバー1が出るか出ないかを比較します。
以下のような組み合わせがあると思います。
(あてずっぽうで、1が出ると予想、実際の宝くじでも1が出る)
(あてずっぽうで、1が出ると予想、実際の宝くじで1がでない)
(あてずっぽうで、1が出ないと予想、実際の宝くじで1が出る)
(あてずっぽうで、1が出ないと予想、実際の宝くじでも1がでない)
正解率を以下のように定義します。
TP=あてずっぽうで、1が出ると予想、実際の宝くじでも1が出る回数
TN=あてずっぽうで、1が出ないと予想、実際の宝くじでも1がでない回数
これの回数の和を取り、全体数Nである199で割ります
これが正解率と定義します
$$正解率=(TP+TN)/N$$

ちなみにあてずっぽうでナンバー1がでるかそうでないか決める際はくじ引きで決めると思っていただけると差し違いないです。例としては、あたりくじ5枚、外れくじ26枚の計31枚のくじを考えます。

目標精度(統計的基準)


あてずっぽうをとりあえず10万人の方にしてもらった仮定します、以下に正解率の分布を作成しました。

ぱっと見、きれいな正規分布となっています。10万回繰り返したので、さすがに、標本標準偏差と標本平均は母標準偏差と母平均にそれぞれかなり近い値であると考えられます。
母標準偏差=標本標準偏差=0.026
母平均=標本平均=0.73
あてずっぽうの場合の上位5%は以下のような正解率になるはずです。
正解率上位5%=0.73+1.64*0.026=0.77
となり、上位5%は0.77の正解率です。この正解率0.77を基準とおいて、この正解率を超えたら、自分の作ったAIは有効であると判定することにします。ちなみに5%とした理由ですが、統計の世界では5%を基準とすることが多いので基準とさせていただきました。こういうあてずっぽうの考え方、ランダムを使った考え方はたしかモンテカルロ法といわれています。

目標精度(理論値)

理論的には検証用のデータは結果として以下のことがわかっています
・199回中1のナンバーを出現したのは32回
・199回中1のナンバーが出現しなかったのは167回
199回すべてを出現しないと予想すれば、正解率は167/199=0.84となりますので、本当はこれを超えたいということになります。

結果

以下の表はAIの手法ごとの正解率をRNN、LSTMの予測値を表にしてみました

RNNの予測値は統計的基準値であるあてずっぽうで10万回トライした場合の正解率上位5%を超えていることがわかります。実際には上位3%ほどの場所に位置していました。すなわちRNNは誕生日のようなものでランダムに予測するよりは有意性を示しています。次にLSTMの予測値は0.84となっています。つまりこれは理論的基準値と同値、すなわち、すべて、ナンバー1が出現しないと予測した結果であります。ある意味、ナンバーが出ないことと予測したわけで、理論的基準値と一致したことは、ある意味で作成したLSTMがあれこれ考えるより、ナンバー1が出ないと考えるほうが確率的に高いと判断しました。これは作ったモデルが正しいものであることを示しています。





この記事が気に入ったらサポートをしてみませんか?