【統計学AIでロト6の当たり数字を予想!?】Pythonを使ったロト6予想AIモデル

CG/AI雑学

Pythonを使ったロト6予想AIモデル

次のロト6の当たり数字はなんだろう?

皆さんはロト6という宝くじをご存じでしょうか?
ロト6は1~43の数字の中から6つの当たり数字を選ぶというシンプルなルールの宝くじです。
しかし、当選確率は非常に低く、理論上の1等当選確率は1/6,096,454です。

このような低確率にも関わらず、多くの人が購入を続けるのは、「当たるかもしれない」という期待やスリルが含まれているからです。

近年では、AI(人工知能)の進化により、ロト6の数字予想にAIを活用する試みが注目を集めています。
今回は簡単にロト6の数字を予想するAIモデルを作成したためご紹介したいと思います。
(コードは自由に使用頂いて問題ないですが、実行時に発生した問題に対して当サイトは一切責任を負いませんのでご了承ください)

AIモデルの概要

まずは今回ご紹介するAIモデルの概要について説明します。

このAIモデルは、ロト6の過去データを使用して特徴量を抽出し、ランダムフォレストモデルを用いて次回の当選番号を予測するプログラムです。

主な流れは以下の通りです。

  1. CSVファイルからロト6の過去データを読み込む。
  2. 各回の当選番号の特徴量(統計情報)を計算。
  3. ランダムフォレストモデルを用いて各列(当選番号)を個別に予測する。
  4. 訓練済みモデルを使用して次回の当選番号を予測する。

本記事のAIモデルで使用しているCSVファイルは以下のような仕様になっています。

スクリプト

続いて実際のAIモデル用スクリプトをご紹介します。(コピペ等ご自由にどうぞ!)

import pandas as pd
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from tqdm import tqdm
import gc

# 特徴量の抽出関数(NumPyを使用して高速化)
def extract_features(data):
    nums = data.to_numpy(dtype=np.float32)
    features = {
        "mean": np.mean(nums, axis=1),
        "std_dev": np.std(nums, axis=1),
        "median": np.median(nums, axis=1),
        "max_num": np.max(nums, axis=1),
        "min_num": np.min(nums, axis=1),
        "even_count": np.sum(nums % 2 == 0, axis=1),
        "odd_count": np.sum(nums % 2 != 0, axis=1),
        "range": np.ptp(nums, axis=1),  # 範囲(最大値 - 最小値)
    }
    return pd.DataFrame(features, dtype=np.float32)

# モデルをトレーニングする関数
def train_loto6_model(file_path):
    chunksize = 10000  # 小さなチャンクで処理
    models = []
    accuracies = []

    # チャンクごとに処理
    for chunk in tqdm(pd.read_csv(file_path, usecols=[0, 1, 2, 3, 4, 5], dtype=np.int32, chunksize=chunksize), desc="Processing chunks"):
        chunk.columns = ["num1", "num2", "num3", "num4", "num5", "num6"]

        # 特徴量を抽出
        X_chunk = extract_features(chunk)

        # 各列に対してモデルを訓練
        for col in chunk.columns:
            y_chunk = chunk[col].values

            # 訓練データとテストデータを分割
            X_train, X_test, y_train, y_test = train_test_split(X_chunk, y_chunk, test_size=0.2, random_state=42)

            # ランダムフォレストモデルを訓練
            model = RandomForestClassifier(
                n_estimators=25,  # 木の数を減らして省メモリ化
                max_depth=5,  # 深さを制限して過学習防止
                random_state=42,
                n_jobs=-1  # 並列処理を有効化
            )
            model.fit(X_train, y_train)
            models.append(model)

            # 精度を記録
            y_pred = model.predict(X_test)
            accuracy = accuracy_score(y_test, y_pred)
            accuracies.append(accuracy)

        # メモリ解放
        del chunk, X_chunk, X_train, X_test, y_train, y_test
        gc.collect()

    avg_accuracy = np.mean(accuracies)
    print(f"モデルの平均精度: {avg_accuracy:.4f}")
    return models

# 次回の数字を予測する関数
def predict_loto6_numbers(models, past_data):
    features = extract_features(past_data.tail(1))  # 最新の1行から特徴量を抽出
    predicted_numbers = set()  # 重複を防ぐためにセットを使用

    # 各モデルに対して予測
    for model in models:
        predicted_number = model.predict(features)[0]
        if 1 <= predicted_number <= 43:  # 範囲をチェック
            predicted_numbers.add(predicted_number)

        if len(predicted_numbers) >= 6:  # 6つの数字を予測
            break

    return sorted(list(predicted_numbers))

if __name__ == "__main__":
    file_path = "C:/work/Python/loto6_results.csv"  # ロト6の過去データ

    try:
        models = train_loto6_model(file_path)
        past_data = pd.read_csv(file_path)
        predicted_numbers = predict_loto6_numbers(models, past_data)
        print("次回予測されるロト6の番号:", predicted_numbers)

    except FileNotFoundError:
        print("エラー: 過去の当選データCSVファイルが見つかりません。")

実行結果例
1~43の間で6つの値が出力される。

結果
06 13 15 22 35 41
(完敗です)

処理の詳細説明

上記でご紹介したスクリプトの処理について説明していきます。

1.必要なライブラリのインポート
  • pandas: CSVファイルの読み込みとデータ操作。
  • numpy: 数値計算の効率化(特徴量計算)。
  • scikit-learn: モデルの構築、訓練、評価。
  • tqdm: チャンク処理時の進捗バー表示。
  • gc: メモリ管理のためのガベージコレクション。
2.特徴量の抽出 (extract_features)

この関数では、各回のロト6の当選番号データ(1行)に対して以下の統計的特徴量を計算します
特徴量はNumPyのベクトル計算を活用して効率的に計算され、pandas.DataFrame として返されます。

  • mean: 平均
  • std_dev: 標準偏差
  • median: 中央値
  • max_num: 最大値
  • min_num: 最小値
  • even_count: 偶数の個数
  • odd_count: 奇数の個数
  • range: 範囲(最大値 – 最小値)
3.モデルのトレーニング (train_loto6_model)

CSVファイルを分割して小さなチャンク(データの部分)ごとに処理し、メモリ使用量を最小限に抑えながらモデルを訓練します。

  1. チャンクの読み込み:指定した列(当選番号のみ)を少量ずつ(デフォルトで10,000行)読み込む。
  2. 特徴量の抽出:各チャンクから特徴量を計算。
  3. モデルの訓練:各列(num1num6)をターゲット変数とし、ランダムフォレストモデルを訓練。訓練データとテストデータに分割(train_test_split)。モデルを学習し、テストデータで精度(正確性)を評価。
  4. 結果の記録:訓練したモデルと精度を記録。
  5. メモリ解放:不要になったデータを削除し、ガベージコレクションを実行。
4.次回の当選番号予測 (predict_loto6_numbers)

訓練済みモデルを用いて、次回予測される当選番号を6つ生成します。

  1. 過去データの最新行(直近の当選番号)から特徴量を計算。
  2. 各モデルを用いて予測を行い、1~43の範囲に含まれる予測結果をセットに格納。
  3. 予測された番号が6つに達した時点で終了。
  4. セットをリストに変換し、ソートして返却。
4.メイン処理

スクリプトのエントリポイントで、以下の処理を行います:

  1. train_loto6_model を呼び出して、訓練済みモデルを取得。
  2. 過去データを読み込み。
  3. predict_loto6_numbers を呼び出して、次回予測される当選番号を出力。
  4. エラー処理:データファイルが見つからない場合には、FileNotFoundError をキャッチして適切なメッセージを表示。

このAIモデルの特徴

  1. 効率的なメモリ使用:
    • チャンク処理と適切なガベージコレクションで、大規模データにも対応。
  2. 高速な計算:
    • NumPyと並列処理(n_jobs=-1)を活用して計算速度を向上。
  3. 柔軟な設計:
    • 汎用的な特徴量抽出とランダムフォレストを組み合わせ、精度と速度のバランスを確保。
  4. 予測の再現性:
    • 訓練と予測のランダム性を抑制するため、random_state を固定。

まとめ

今回はロト6の数字予想にAIを活用してみましたがいかがでしたでしょうか?
宝くじの数字を自分で選んで楽しむこともいいですが、AIなど最新技術を活用してみるのもとても楽しいと思います。

ぜひ宝くじだけでなく、普段の身の回りのことにAIを活用してみてください!

コメント

タイトルとURLをコピーしました