pythonで機械学習、深層学習によって宝くじ当選番号予測プログラム ロト7Versionを作っています。
参考資料はこちら
(実行時は時間短縮のためself.epochsを1にしています。)
整理整頓しました。
質問
個人的にパラメータの部分がよくわからないのですが、コメントのような理解でよろしいでしょうか?self.units = 6これについては何の意味があるのか 単位?単位が6?
ロト7のcsvはこちらからダウンロードしています。ボーナス数字以下については使わないため、削除しています。
python
1#各インポート宣言 2#numpy 数値計算を効率的に行うためのライブラリ 3#pandas データ分析を効率的に行うためのライブラリ 4#tflearn 深層学習ライブラリ 5#time 時刻に関するさまざまな関数を提供 6#itertools 効率的なループ実行のためのイテレータ生成関数 7#sklearn 機械学習ライブラリ 8#preprocessing 前処理用のライブラリ 9import numpy as np 10import pandas as pd 11import tflearn 12import time 13import itertools 14from sklearn import preprocessing 15 16#予測LSTMクラス 17class PredictionLSTM: 18 def __init__(self): 19 #LSTM訓練パラメータ 20 #steps_of_history いくつ前のデータまでを学習に用いるか 21 #steps_of_history いくつ先のデータを予測するか 22 #units よくわからない 23 #epochs 一つの訓練データを何回繰り返して学習させるか 24 #batch_size バッチサイズ 25 self.steps_of_history = 10 26 self.steps_of_future = 1 27 self.units = 6 28 self.epochs = 1 29 self.batch_size = 1 30 31 #データセット作成 32 def create_dataset(self,data): 33 x,y = [],[] 34 for i in range(0,len(data) - self.steps_of_history,self.steps_of_future): 35 a = i + self.steps_of_history 36 x.append(data[i:a]) 37 y.append(data[a]) 38 x = np.reshape(np.array(x),[-1,self.steps_of_history,1]) 39 y = np.reshape(np.array(y),[-1,1]) 40 return x,y 41 42 #予測データ作成 43 def create_predict_dataset(self,data): 44 latest_x = np.array([data[-self.steps_of_history:]]) 45 latest_x = np.reshape(latest_x,(-1,self.steps_of_history,1)) 46 return latest_x 47 48 #訓練評価データ分割 49 def split_dataset(self,x,y,test_size=0.1): 50 pos = round(len(x) * (1 - test_size)) 51 train_x,train_y = x[:pos],y[:pos] 52 test_x,test_y = x[pos:],y[pos:] 53 return train_x,train_y,test_x,test_y 54 55 #モデル作成 56 def _create_model_by_tflearn(self): 57 net = tflearn.input_data(shape=[None,self.steps_of_history,1]) 58 59 #LSTM 60 net = tflearn.lstm(net,n_units = self.units) 61 62 net = tflearn.fully_connected(net,1,activation = "linear") 63 net = tflearn.regression(net,optimizer = "adam",learning_rate = 0.001,loss = "mean_square") 64 65 model = tflearn.DNN(net,tensorboard_verbose = 0) 66 67 return model 68 69 #訓練 70 def train(self,train_x,train_y): 71 model = self._create_model_by_tflearn() 72 model.fit(train_x,train_y,validation_set = 0.1,batch_size = self.batch_size,n_epoch = self.epochs) 73 74 return model 75 76 #予測 77 def predict(self,model,data): 78 return model.predict(data) 79 80 #評価誤差アルゴリズム 81 def rmse(self,y_pred,y_true): 82 return np.sqrt(((y_true - y_pred) ** 2).mean()) 83 84 def rmsle(self,y_pred,y_true): 85 return np.sqrt(np.square(np.log(y_true + 1) - np.log(y_pred + 1)).mean()) 86 87 def mae(self,y_pred,y_true): 88 return np.mean(np.abs((y_true - y_pred))) 89 90 def mape(self,y_pred,y_true): 91 return np.mean(np.abs((y_true - y_pred) / y_true)) * 100 92 93#メイン処理 94if __name__ == "__main__": 95 96 #処理の速さを図る 97 START_TIME = time.time() 98 99 #1~37までの数字を用意 100 a = {m for m in range(1,38)} 101 d = {tuple(p): i for i, p in enumerate(itertools.combinations(a,7))} 102 e = {v: k for k, v in d.items()} 103 104 dataframe = pd.read_csv("./loto7.csv",encoding='cp932') 105 dataframe = dataframe[["第1数字","第2数字","第3数字","第4数字","第5数字","第6数字","第7数字"]] 106 data = dataframe.index.map( 107 lambda _:d[ tuple(sorted( 108 [(dataframe.第1数字[_]), 109 (dataframe.第2数字[_]), 110 (dataframe.第3数字[_]), 111 (dataframe.第4数字[_]), 112 (dataframe.第5数字[_]), 113 (dataframe.第6数字[_]), 114 (dataframe.第7数字[_]) 115 ] 116 )) 117 ] 118 ) 119 data = data.values.reshape(data.shape[0], 1).astype(dtype=np.float32) 120 121 #正規化 122 #データが0~1に入るよう変換 123 #fit_transform()について 124 #fit()を実施した後に、同じデータに対してtransform()を実施する 125 #fit()とは 126 #渡されたデータの最大値、最小値、平均、標準偏差、傾き...などの統計を取得して、内部メモリに保存する 127 #transform()とは 128 #fit()で取得した統計情報を使って、渡されたデータを実際に書き換える 129 scaler = preprocessing.MinMaxScaler() 130 data = scaler.fit_transform(data) 131 132 #LSTMインスタンス作成 133 lstm = PredictionLSTM() 134 135 #訓練,評価データ作成 136 #create_datasetの処理を正規化したデータを用いてx,yに代入 137 #split_datasetの処理をx,yを用いて訓練、評価データに代入 138 x,y = lstm.create_dataset(data) 139 train_x,train_y,test_x,test_y = lstm.split_dataset(x,y) 140 141 #訓練 142 #trainの処理を作成したtrain_x,train_yを使って行い、結果をmodelに代入 143 model = lstm.train(train_x,train_y) 144 145 #評価 146 #訓練予測にpredictの処理を訓練したデータとtrain_xを用いて行う 147 #評価予測にpredictの処理を訓練したデータとtest_xを用いて行う 148 train_predict = lstm.predict(model,train_x) 149 test_predict = lstm.predict(model,test_x) 150 151 #RMSE(Root Mean Squared Error) この値が小さければ小さいほど、誤差の小さいモデルである 152 #訓練誤差にrmseの処理をtrain_yと訓練予測データを用いて行う 153 #評価誤差にrmseの処理をtest_yと評価予測データを用いて行う 154 #Train ScoreとTest Scoreを出力 155 train_score = lstm.rmse(train_y,train_predict) 156 test_score = lstm.rmse(test_y,test_predict) 157 print("Train Score: {0:.3f} RMSE".format(train_score)) 158 print("Test Score: {0:.3f} RMSE".format(test_score)) 159 160 #予測 161 #latest_xにcreate_predict_datasetの処理を正規化したデータを用いて行う 162 #次の予測に訓練データをlatest_xを用いて行う 163 #予測に正規化のinverse_transformを”次の予測”を用いて行う 164 latest_x = lstm.create_predict_dataset(data) 165 next_prediction = model.predict(latest_x) 166 next_prediction = scaler.inverse_transform(next_prediction) 167 #予測結果を出力 168 print("次の当選番号の予測は: {}".format(e[np.round(next_prediction[0][0])])) 169 170 #測定時間を出力 171 print("時間: {0:.1f}sec".format(time.time() - START_TIME))
回答1件
あなたの回答
tips
プレビュー