こんにちは!サラリーマンブロガーのみやしんです!
以前、LOTO6をAIで予想してみたい!!!みたいなブログを書きました。
↓↓↓↓↓↓↓↓こちらです↓↓↓↓↓↓↓↓
そして、ついに!実際に実装してみましたのでご紹介します!!!笑
LOTO6 予想AI実装
スクレピングで過去の当選結果を入手
過去の当選番号はみずほ銀行のHPから閲覧・入手できます。
スクレイピングの実装はこちらのサイトを見本にしています。
今更Webスクレイピングを試してロト6のデータを取得 (Qiita)

直近のデータは手でコピーぺしました。笑
LOTO6予想AIを実装
実装は下記のブログを参考にしています。
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が人の予想を上回ったらおもしろいなぁ~と期待しています。
結果は随時お知らせしていきたいと思いますので、ご期待くださいね^^
最後まで読んで頂きありがとうございました!!!
コメント