こんにちは!サラリーマンブロガーのみやしんです!
以前、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が人の予想を上回ったらおもしろいなぁ~と期待しています。
結果は随時お知らせしていきたいと思いますので、ご期待くださいね^^
最後まで読んで頂きありがとうございました!!!







コメント