はじめに
数値から将来の数値を予測するための入門として、AIで宝くじ(LOTO6)の当たり番号を予測してみました。
環境
| 環境 | version |
|---|---|
| Raspberry Pi 5 | Ubuntu 25.10 |
| Tensor Flow | 2.20.0 |
| Python3 | 3.13.7 |
| JupyterLab | 4.4.9 |
学習データの収集
学習データは当せん番号から取得しました。
第1回(2000年10月5日)から最新の当選番号まで取得しています。
抽選日は推論には使わないので削除しています。
学習データはCSVファイルとしています。
学習データの例
| 1 | 2 | 3 | 4 | 5 | 6 | bonus |
|---|---|---|---|---|---|---|
| 2 | 8 | 10 | 13 | 27 | 30 | 39 |
| 1 | 9 | 16 | 20 | 21 | 43 | 5 |
| 1 | 5 | 15 | 31 | 36 | 38 | 13 |
| 16 | 18 | 26 | 27 | 34 | 40 | 13 |
| 9 | 15 | 21 | 23 | 27 | 28 | 43 |
モデル
過去の抽選番号と今回の抽選番号に相関関係があると仮定してLSTMレイヤーを使用しました。
今回使用した学習環境です。
| layer | Output Shape |
|---|---|
| LSTM | (None, 64) |
| Dropout | (None, 64) |
| Dense | (None, 64) |
| Dense | (None, 32) |
| Dense | (None, 7) |
当選番号は1から43の範囲ですが、学習を効率的に行うために0から1にスケールしています。
X_{norm} = \frac{X - 1}{43 - 1}
重みの偏りを防ぎ、学習を安定(勾配消失・爆発の防止)させるためです。
モデルの出力にsigmoidを使用しているために出力結果は0から1の範囲となります。最後に1から43の数値に直す必要があります。
X = X_{pred}\times{(43.0 - 1.0)} + 1.0
時系列予測では、過去の一定期間のデータから次の値を予測するために、データを一定の幅で切り出すスライディングウィンドウという手法を使います。
- 最初のデータセット
第1回から第20回までを入力データ、第21回を正解ラベル(ターゲット)とします。 - ウィンドウを1つずらす
第2回から第21回までを入力データ、第22回を正解ラベル(ターゲット)とします。
これを最新の回まで、ウィンドウを1つずらしながら学習データを作成します。
このようにデータを分割することで、直近の20回分の流れと次に出る数字の関係性を学習することができます。
学習では、第1回から第20回までのデータをひとつにまとめ、第21回が正解となるようにデータを分割しています。

学習結果
学習の結果は
loss: 0.0312
val_loss: 0.0324
となりました。
学習データと検証データの誤差があまりなので、何かしらのパターンから推測してくれているのだと思います。
評価関数にはMSE(平均二乗誤差)を使用しているので、その平方根をとって元のスケールに戻すと
\sqrt{0.0312}\times{43}\approx7.59
となり、予想値から平均して±7.5程度の誤差があるという結果になりました。
編集後記
学習データからは抽選日は除きましたが、もしかしたらこの月にはこの数字が出やすいといった法則を見つけてくれるのかもしません。
次回はモデルを少しだけ変更して結果がどう変わるか確認してみたいと思います。
当選番号には相関関係がないのでAIでは当たり番号の予測はできないと思います。
念のために買いましたがハズレました。
