Time-series-lstm-model

提供:Dev Guides
移動先:案内検索

時系列-LSTMモデル

現在、時系列の統計モデリングに精通していますが、現在、機械学習は大流行しています。そのため、いくつかの機械学習モデルにも精通することが不可欠です。 時系列領域で最も人気のあるモデル-長期短期記憶モデルから始めましょう。

LSTMは、リカレントニューラルネットワークのクラスです。 したがって、LSTMにジャンプする前に、ニューラルネットワークとリカレントニューラルネットワークを理解することが不可欠です。

ニューラルネットワーク

人工ニューラルネットワークは、生物学的なニューラルネットワークに触発された、接続されたニューロンの階層構造です。 1つのアルゴリズムではなく、さまざまなアルゴリズムの組み合わせにより、データに対して複雑な操作を行うことができます。

リカレントニューラルネットワーク

これは、時間データを処理するように調整されたニューラルネットワークのクラスです。 RNNのニューロンにはセル状態/メモリがあり、入力はこの内部状態に従って処理されます。これは、ニューラルネットワークのループの助けを借りて実現されます。 RNNには、情報を保持できる「tanh」レイヤーの繰り返しモジュールがあります。 ただし、長期間ではないため、LSTMモデルが必要です。

LSTM

これは、データの長期的な依存関係を学習できる特別な種類のリカレントニューラルネットワークです。 これは、モデルの繰り返しモジュールに相互作用する4つのレイヤーの組み合わせがあるために達成されます。

ニューラルネットワーク

上の図では、4つのニューラルネットワークレイヤーが黄色のボックスで、点ごとの演算子が緑色の円で、入力が黄色の円で、セルの状態が青色の円で示されています。 LSTMモジュールには、セル状態と3つのゲートがあり、各ユニットから情報を選択的に学習、学習解除、または保持するための電力を提供します。 LSTMのセル状態は、わずかな線形相互作用のみを許可することにより、情報が変更されることなくユニットを流れるのを助けます。 各ユニットには、セルの状態に情報を追加または削除できる入力、出力、および忘却ゲートがあります。 忘却ゲートは、シグモイド関数を使用するために、以前のセル状態からのどの情報を忘れるべきかを決定します。 入力ゲートは、それぞれ「シグモイド」と「tanh」の点ごとの乗算演算を使用して、現在のセル状態への情報の流れを制御します。 最後に、出力ゲートは次の非表示状態に渡す情報を決定します

LSTMモデルの内部動作を理解したので、それを実装しましょう。 LSTMの実装を理解するために、単純な例-直線から始めます。 LSTMが直線の関係を学習して予測できるかどうかを見てみましょう。

まず、直線を描いたデータセットを作成しましょう。

[402]で:

x = numpy.arange (1,500,1)
y = 0.4 * x + 30
plt.plot(x,y)

アウト[402]:

[<matplotlib.lines.Line2D at 0x1eab9d3ee10>]

コードスニペット19

[403]で:

trainx, testx = x[0:int(0.8*(len(x)))], x[int(0.8*(len(x))):]
trainy, testy = y[0:int(0.8*(len(y)))], y[int(0.8*(len(y))):]
train = numpy.array(list(zip(trainx,trainy)))
test = numpy.array(list(zip(trainx,trainy)))

データが作成され、トレーニングとテストに分割されました。 ルックバック期間の値に応じて、時系列データを教師あり学習データの形式に変換します。これは、本質的に、時間「t」で値を予測するために見られるラグの数です。

だからこのような時系列-

time variable_x
t1  x1
t2  x2
 :   :
 :   :
T   xT

ルックバック期間が1の場合は、に変換されます-

x1   x2
x2   x3
 :    :
 :    :
xT-1 xT

[404]で:

def create_dataset(n_X, look_back):
   dataX, dataY = [], []
   for i in range(len(n_X)-look_back):
      a = n_X[i:(i+look_back), ]
      dataX.append(a)
      dataY.append(n_X[i + look_back, ])
   return numpy.array(dataX), numpy.array(dataY)

[405]で:

look_back = 1
trainx,trainy = create_dataset(train, look_back)
testx,testy = create_dataset(test, look_back)

trainx = numpy.reshape(trainx, (trainx.shape[0], 1, 2))
testx = numpy.reshape(testx, (testx.shape[0], 1, 2))

次に、モデルをトレーニングします。

トレーニングデータの小さなバッチがネットワークに表示され、トレーニングデータ全体がバッチでモデルに表示され、エラーが計算される1回の実行はエポックと呼ばれます。 エポックは、エラーが減少するまで実行されます。

[]内:

from keras.models import Sequential
from keras.layers import LSTM, Dense

model = Sequential()
model.add(LSTM(256, return_sequences = True, input_shape = (trainx.shape[1], 2)))
model.add(LSTM(128,input_shape = (trainx.shape[1], 2)))
model.add(Dense(2))
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
model.fit(trainx, trainy, epochs = 2000, batch_size = 10, verbose = 2, shuffle = False)
model.save_weights('LSTMBasic1.h5')

[407]で:

model.load_weights('LSTMBasic1.h5')
predict = model.predict(testx)

それでは、予測がどのように見えるか見てみましょう。

[408]で:

plt.plot(testx.reshape(398,2)[:,0:1], testx.reshape(398,2)[:,1:2])
plt.plot(predict[:,0:1], predict[:,1:2])

アウト[408]:

[<matplotlib.lines.Line2D at 0x1eac792f048>]

コードスニペット22

次に、サイン波またはコサイン波を同様の方法でモデル化してみてください。 以下に示すコードを実行し、モデルパラメーターを操作して、結果がどのように変化するかを確認できます。

[409]で:

x = numpy.arange (1,500,1)
y = numpy.sin(x)
plt.plot(x,y)

アウト[409]:

[<matplotlib.lines.Line2D at 0x1eac7a0b3c8>]

コードスニペット23

[410]で:

trainx, testx = x[0:int(0.8*(len(x)))], x[int(0.8*(len(x))):]
trainy, testy = y[0:int(0.8*(len(y)))], y[int(0.8*(len(y))):]
train = numpy.array(list(zip(trainx,trainy)))
test = numpy.array(list(zip(trainx,trainy)))

[411]で:

look_back = 1
trainx,trainy = create_dataset(train, look_back)
testx,testy = create_dataset(test, look_back)
trainx = numpy.reshape(trainx, (trainx.shape[0], 1, 2))
testx = numpy.reshape(testx, (testx.shape[0], 1, 2))

[]内:

model = Sequential()
model.add(LSTM(512, return_sequences = True, input_shape = (trainx.shape[1], 2)))
model.add(LSTM(256,input_shape = (trainx.shape[1], 2)))
model.add(Dense(2))
model.compile(loss = 'mean_squared_error', optimizer = 'adam')
model.fit(trainx, trainy, epochs = 2000, batch_size = 10, verbose = 2, shuffle = False)
model.save_weights('LSTMBasic2.h5')

[413]で:

model.load_weights('LSTMBasic2.h5')
predict = model.predict(testx)

[415]で:

plt.plot(trainx.reshape(398,2)[:,0:1], trainx.reshape(398,2)[:,1:2])
plt.plot(predict[:,0:1], predict[:,1:2])

アウト[415]:

[<matplotlib.lines.Line2D at 0x1eac7a1f550>]

コードスニペット23

これで、任意のデータセットに進む準備ができました。