LOTO6予想 AI vs 人間 獲得賞金で勝負!勝つのはどっちだ!? (AI部分スクリプト付)

スポンサーリンク
Python/DeepLearning

こんにちは!サラリーマンブロガーのみやしんです!

以前、LOTO6をAIで予想してみたい!!!みたいなブログを書きました。

↓↓↓↓↓↓↓↓こちらです↓↓↓↓↓↓↓↓

そして、ついに!実際に実装してみましたのでご紹介します!!!笑

スポンサーリンク

LOTO6 予想AI実装

スクレピングで過去の当選結果を入手

過去の当選番号はみずほ銀行のHPから閲覧・入手できます。

当せん番号案内(ロト6) | みずほ銀行
宝くじ「ロト6」の当せん番号情報についてご案内しています。

スクレイピングの実装はこちらのサイトを見本にしています。

今更Webスクレイピングを試してロト6のデータを取得 (Qiita)

今更Webスクレイピングを試してロト6のデータを取得 - Qiita
サーバーいらずで無料でWebスクレイピングが出来ると聞いて試してみた。題材が無いとどうしてもやる気が出ないので、少しでもやる気の出るように今回はロト6のデータを取得して本当にランダムなの?って検…

直近のデータは手でコピーぺしました。笑

LOTO6予想AIを実装

実装は下記のブログを参考にしています。

AI技術で宝くじ当選番号を予測、億万長者の夢を実現する? | MicroStone
概要本稿はある数学教授の宝くじ当選の物語を紹介してから、Pythonを使ってNUMBERS3過去25年分の当選番号を取得するクローラーを実現した上、LSTMアルゴリズムで次回の当選番号を予測するプログラムを実現します。1. 数学教授の宝くじ...

LSTMで当選データを時系列データとして解析しています。

これを少しだけいじって作り変えています。当選数字1つ1つを予想する感じにして使いやすくしました。

一応、スクリプトを載せておきます。

なお、LSTMという手法を使いますが、結構難しいのでLSTMについてもう少し良く知りたい方は事前学習、もしくは事後学習をすると良いと思います。


事前準備として、スクレイピングで収集した当選番号をcsvで保存しておき、ヘッダーを

['main1', 'main2', 'main3', 'main4', 'main5', 'main6', 'bonus']

として、dataframeとして読み込みます。詳細は下記のような感じです。

import numpy as np
import pandas as pd
import tflearn
import time
from sklearn import preprocessing
import tensorflow as tf


class PredictionLSTM:

    def __init__(self):
        # LSTM訓練パラメータ設定
        self.steps_of_history = 10
        self.steps_of_furture = 1
        self.units = 6
        self.epochs = 100
        self.batch_size = 1

    # データセット作成
    def create_dataset(self, data):
        x, y = [], []
        for i in range(0, len(data) - self.steps_of_history, self.steps_of_furture):
            a = i + self.steps_of_history
            x.append(data[i:a])
            y.append(data[a])
        x = np.reshape(np.array(x), [-1, self.steps_of_history, 1])
        y = np.reshape(np.array(y), [-1, 1])
        return x, y

    # 予測用データ作成
    def create_predict_dataset(self, data):
        latest_x = np.array([data[-self.steps_of_history:]])
        latest_x = np.reshape(latest_x, (-1, self.steps_of_history, 1))
        return latest_x

    # 訓練、評価データ分割
    def split_dataset(self, x, y, test_size=0.1):
        pos = round(len(x) * (1 - test_size))
        train_x, train_y = x[:pos], y[:pos]
        test_x, test_y = x[pos:], y[pos:]
        return train_x, train_y, test_x, test_y

    # モデル作成
    def _create_model_by_tflearn(self):
        net = tflearn.input_data(shape=[None, self.steps_of_history, 1])

        # LSTM
        net = tflearn.lstm(net, n_units=self.units)

        # GRU
        # net = tflearn.gru(net, n_units=self.units)

        # GRU 複数層
        # net = tflearn.gru(net, n_units=self.units, return_seq=True)
        # net = tflearn.gru(net, n_units=self.units)
        net = tflearn.fully_connected(net, 1, activation='linear')
        net = tflearn.regression(net, optimizer='Adam', learning_rate=0.01, loss='mean_square')

        model = tflearn.DNN(net, tensorboard_verbose=0)

        return model

    # 訓練
    def train(self, train_x, train_y):
        model = self._create_model_by_tflearn()
        model.fit(train_x, train_y, validation_set=0.1, batch_size=self.batch_size, n_epoch=self.epochs)

        return model

    # 予測
    def predict(self, model, data):
        return model.predict(data)

    # 評価誤差アルゴリズム
    # RMSE(Root Mean Squared Error)
    def rmse(self, y_pred, y_true):
        return np.sqrt(((y_true - y_pred) ** 2).mean())

    # RMSLE(Root Mean Squared Logarithmic Error)
    def rmsle(self, y_pred, y_true):
        return np.sqrt(np.square(np.log(y_true + 1) - np.log(y_pred + 1)).mean())

    # MAE(Mean Absolute Error)
    def mae(self, y_pred, y_true):
        return np.mean(np.abs((y_true - y_pred)))

    # MAPE(Mean Absolute Percentage Error)
    def mape(self, y_pred, y_true):
        return np.mean(np.abs((y_true - y_pred) / y_true)) * 100


if __name__ == "__main__":
    START_TIME = time.time()
    # csvファイルのヘッダーをリスト化
    header_name_list = ['main1', 'main2', 'main3', 'main4', 'main5', 'main6', 'bonus'] 
    # 予測結果を最後にリストで表すための準備
    prediction_results = {}

    for header in header_name_list:

        # データを読み込む
        # print(header)
        dataframe = pd.read_csv('./loto6.csv')
        dataframe = dataframe[[header]] #, 'main2', 'main3','main4','main5','main6','bonus'

        # csvから読み込んだデータをint型に変換
        data = dataframe[header].astype(int)
        #data = dataframe.index.map(lambda _:int(str(dataframe.main1[_]))) # + str(dataframe.main2[_]) + str(dataframe.main3[_]) + str(dataframe.main4[_]) + str(dataframe.main5[_]) + str(dataframe.main6[_]) + str(dataframe.bonus[_])
        data = data.values.reshape(data.shape[0], 1).astype(dtype=np.float32)
        #print(data)

        #data = dataframe.index.map(lambda _:int(str(dataframe.num_1[_]) + str(dataframe.num_2[_]) + str(dataframe.num_3[_])))
        #data = data.values.reshape(data.shape[0], 1).astype(dtype=np.float32)

        # 正規化
        scaler = preprocessing.MinMaxScaler()
        data = scaler.fit_transform(data)

        # LSTMインスタンス作成
        lstm = PredictionLSTM()

        # 訓練、評価データ作成
        x, y = lstm.create_dataset(data)
        train_x, train_y, test_x, test_y = lstm.split_dataset(x, y)

        model = lstm.train(train_x, train_y)

        # 評価
        train_predict = lstm.predict(model, train_x)
        test_predict = lstm.predict(model, test_x)

        # RMSE(Root Mean Squared Error)
        train_score = lstm.rmse(train_y, train_predict)
        test_score = lstm.rmse(test_y, test_predict)
        print("Train Score: {0:.3f} RMSE".format(train_score))
        print("Test  Score: {0:.3f} RMSE".format(test_score))

        # 予測
        latest_x = lstm.create_predict_dataset(data)
        next_prediction = model.predict(latest_x)
        next_prediction = scaler.inverse_transform(next_prediction)
        print(header, '=', "Next prediction: {0:.0f}".format(list(next_prediction)[0][0]))
        #print(next_prediction)

        print("Time: {0:.1f}sec".format(time.time() - START_TIME))

        # 予測値を四捨五入して辞書に格納
        prediction_results[header] = int(round(next_prediction[0][0]))

        # モデルをリセット
        tf.reset_default_graph()

print(prediction_results)

tensorflowのバージョンアップの影響でエラーが出る場合があります。

もし、エラーが出た場合は最後から3行目を、tf.reset_default_graph() → tf.compat.v1.reset_default_graph() に変えてみてください。

更に!プログラム改良版も作りましたので、こちらも参考にしてみてください!

Python、AI、機械学習について、初心者の方、プログラミングスクールに興味のある方、E資格を取得したい方、更に実践的なスキルを磨きたい方は下記の記事もご参考ください。

こちらのブログもご参考にしてみてください。

AI予想と人間予想で当選金額対決

何年もロト6を買い続けていますが、予想番号を家族の誕生日にしているため、変えたことがありません。いつも、

人間予想(誕生日) 2 7 9 19 26 28

で買っています。この数字とAI予想数字のどちらが獲得賞金が大きくなるか、勝負していきたいと思います。

もちろんAIは少しずつ改良してバージョンアップもしたいと思っています。

ちなみに、AIの次回(1535回 2020年11月16日)予想数字は、

AI予想 6 11 20 25 31 39

です。AIが人の予想を上回ったらおもしろいなぁ~と期待しています。

結果は随時お知らせしていきたいと思いますので、ご期待くださいね^^

最後まで読んで頂きありがとうございました!!!

Python/DeepLearning
スポンサーリンク
記事が良かったらSNSでシェアを宜しくお願いします!
みやしんをフォローすると役立つ情報がいっぱいにゃ!
スポンサーリンク

コメント

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