Myu
2020年1月6日月曜日
LSTMで時系列データの予想してみた
時系列データの場合、複数特徴量から予想するパターンはあまり見かけなかったので、試しに作ってみた。あまり、よい予想ができるというわけではなかった。
モデルの作成部分と結果表示の部分のみです。
maxlen = 50 # 入力系列数 n_in = pd.DataFrame(x_data).shape[1]# 学習データ(=入力)の列数 n_out = pd.DataFrame(x_data).shape[1] # ラベルデータ(=出力)の列数 len_seq = pd.DataFrame(x_data).shape[0] - maxlen data = [] target = [] for i in range(0, len_seq): data.append(x_data.iloc[i:i+maxlen, :].values) target.append(x_data.iloc[i+maxlen,:].values) x = np.array(data).reshape(len(data), maxlen, n_in) t = np.array(target).reshape(len(data), n_out) n_train = int(len(data)*0.9) # 訓練データ長 x_train,x_test = np.vsplit(x, [n_train]) # 学習データを訓練用とテスト用に分割 t_train,t_test = np.vsplit(t, [n_train]) # ラベルデータを訓練用とテスト用に分割 class Prediction : def __init__(self, maxlen, n_hidden, n_in, n_out): self.maxlen = maxlen self.n_hidden = n_hidden self.n_in = n_in self.n_out = n_out def create_model(self): model = Sequential() model.add(LSTM(self.n_hidden, batch_input_shape = (None, self.maxlen, self.n_in),return_sequences=False)) model.add(Dropout(0.5)) model.add(Dense(self.n_out)) model.add(Activation("linear")) return model # 学習 def train(self, x_train, t_train, batch_size, epochs) : early_stopping = EarlyStopping(patience=0, verbose=1) model = self.create_model()
model.compile(loss="mean_squared_error", optimizer="adam")
model.fit(x_train, t_train, batch_size = batch_size, epochs = epochs, verbose = 1, shuffle = True, callbacks = [early_stopping], validation_split = 0.1) #model.fit(x_train, t_train, batch_size = batch_size, epochs = epochs) return model ################ n_hidden = 50# 出力次元 epochs = 5# エポック数 batch_size = 10# ミニバッチサイズ # モデル定義 prediction = Prediction(maxlen, n_hidden, n_in, n_out) with np.errstate(invalid='ignore'): # 学習 model = prediction.train(x_train, t_train, batch_size, epochs) # テスト score = model.evaluate(x_test, t_test, batch_size = batch_size, verbose = 1) print("score:", score) #### 例えば、複数特徴量の場合、最後から2番目なら -1を-2に修正する必要がある ##div:先頭を削除して、計算開始位置を変える div=0 t_test2=t_test[div:] x_test2=x_test[div:] n_test = int(len(t_test2)) Z=x_test2[0:1] original = [t_test2[i][-1] for i in range(n_test)] predicted = [] for i in range(n_test): z_ = Z[-1:] y_ = model.predict(z_) sequence_ = np.concatenate((z_.reshape(maxlen, n_in)[1:], y_),axis=0).reshape(1, maxlen, n_in)
Z = np.append(Z, sequence_, axis=0)
predicted.append(y_[0][-1])
plt.rc('font', family='serif') plt.figure() plt.plot(np.array(original), linestyle='dashed', color='black') plt.plot(predicted, color='black') plt.show()
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿