タイトルのテキスト
タイトルのテキスト
タイトルのテキスト
タイトルのテキスト

KerasとLSTMを用いた時系列予測の実装と解説

Python

t f B! P L

 時系列予測

時系列予測は、過去のデータをもとに未来の動きを予測する手法で、金融市場の価格予測、天気の変動、需要の推移分析など、非常に多くの分野で利用されています。特にLSTMLong Short-Term Memory)は、RNNの一種として長期依存関係を学習できるため、時系列データの変動パターンを捉えるのに優れています。本記事では、KerasLSTM機能を用いて、正弦波(sin波)を予測する簡単なモデルを構築し、時系列予測の基本を解説していきます。

 〇ライブラリのインポートとデータの前処理

まず、必要なライブラリをインポートします。NumPyPandasはデータ処理に使用し、TensorFlowからはKerasのモデル構築用モジュールを呼び出します。さらに、データのスケーリングにはMinMaxScalerを使います。LSTMモデルでは、データのスケールが適切でないと学習が難しくなるため、01の範囲に正規化することが重要です。

 

import numpy as np

import pandas as pd

from tensorflow.keras.models import Sequential

from tensorflow.keras.layers import LSTM, Dense

from sklearn.preprocessing import MinMaxScaler

次に、sin波を1000点生成して、1次元データとして準備します。これをreshapeして2次元配列にした上で、スケーラーで正規化します。

 

data = np.sin(np.linspace(0, 100, 1000))

data = data.reshape(-1, 1)

scaler = MinMaxScaler()

scaled_data = scaler.fit_transform(data)

 

〇データの整形:時系列入力形式への変換

LSTMは時系列データのパターンを学習するため、一定の過去データ(例えば20ステップ)を入力し、それに対応する未来の1ステップを出力する形でデータを整形します。このようなスライディングウィンドウ形式の変換を行う関数を作成し、モデルに適した入力フォーマットを生成します。

 def create_dataset(data, look_back=20):

    X, y = [], []

    for i in range(len(data) - look_back):

        X.append(data[i:i + look_back])

        y.append(data[i + look_back])

    return np.array(X), np.array(y)

 

look_back = 20

X, y = create_dataset(scaled_data, look_back)

X = X.reshape((X.shape[0], X.shape[1], 1))

ここでは入力データの形をLSTMが求める3次元の形(サンプル数、時系列長、特徴量数)に合わせています。

 〇モデルの構築:LSTMネットワークの設計

モデルはKerasSequentialを使って構築します。LSTM層を1層追加し、50のユニットを指定しています。これは、各時系列の変動パターンを内部状態に保持しながら学習する層です。その後、1つの出力ノードを持つDense層を追加して、次の1ステップの値を出力します。

 model = Sequential()

model.add(LSTM(50, input_shape=(look_back, 1)))

model.add(Dense(1))

model.compile(loss='mean_squared_error', optimizer='adam')

損失関数には平均二乗誤差(MSE)を使用しており、これは回帰問題で一般的に使われる指標です。最適化手法としては、収束が早く精度も高いAdamを採用しています。

 〇モデルの学習:データへの適合

構築したモデルをfit()関数で学習させます。学習回数(エポック)は201回の更新で使うサンプル数(バッチサイズ)は32と設定しています。verbose=1とすることで、学習の進行状況がコンソールに出力されます。

 

model.fit(X, y, epochs=20, batch_size=32, verbose=1)

〇予測とスケールの復元

学習が完了したら、訓練データに対してモデルがどのような予測をしているのかを確認します。predict()関数で予測を行い、その結果をスケーラーの逆変換で元のスケールに戻します。正解の値も同様に逆変換しておくことで、比較可能な状態になります。

 predicted = model.predict(X)

predicted = scaler.inverse_transform(predicted)

y_true = scaler.inverse_transform(y)

結果の可視化:予測と実データの比較

最後に、Matplotlibを用いて、実際の正解データとモデルによる予測結果をプロットします。これにより、LSTMが時系列のパターンをどれだけ正確に再現できているかを視覚的に評価できます。正解の曲線と予測結果の曲線が近いほど、モデルがうまく機能していることになります。

 import matplotlib.pyplot as plt

 plt.plot(y_true, label='True')

plt.plot(predicted, label='Predicted')

plt.legend()

plt.show()

 〇おわりに:LSTMの応用可能性と今後の展開

以上のように、KerasLSTMを使って時系列予測モデルを構築し、sin波の予測を行う基本的な流れを解説しました。LSTMは時系列データの時間的依存関係を学習できる強力なモデルであり、今回のような単純なデータだけでなく、株価、気温、センサーデータなど複雑な実世界データにも応用可能です。さらに、複数の変数を同時に扱う多変量時系列への拡張、予測結果の誤差分析、未知データへの汎化性能の評価など、より実践的な応用にも発展させることができます。まずはこの基本的な構造をしっかり理解し、実データへの応用に繋げていくことが時系列予測のスキルを高める第一歩となるでしょう。

koneka1208

koneka1208

自己紹介

自分の写真
エクセル好きの窓際会社員です。 エクセルの操作法や日々の会社で得た知見などを発信していきます。 よろしくお願いします。

ブログ アーカイブ

連絡フォーム

名前

メール *

メッセージ *

QooQ