【AI】時系列csvデータをLSTM用の入力データに加工する方法

こんにちは、ヒガシです。前回に引き続きLSTMのデータ加工のお話です。

 

前回紹介した記事では、Python上で適当な時系列データを作成し、それをLSTM用に加工していましたが、実業務においてそんなデータを使うことはまずありません。

というわけで今回は実際の業務適用をイメージして、csvファイルにまとめられている時系列データをLSTM用に加工⇒学習⇒評価という流れを実演してみようと思います。

 

今回も前回同様に入力、出力ともに複数個あるパターンで実施していきます。

 

それではさっそくやっていきましょう!

 

スポンサーリンク

使用するサンプル時系列データの紹介

今回は以下のような時系列データを使用していきます。

 

一般的によくあるように、一番左の列に時刻、それより右に各時刻のデータがならんでいるものですね。

 

データの中身は以下のように入力(X)がSIN波、COS波、出力(Y)がそれらの合成波になっているものです。

〇入力(X)データ

LSTMに入れる時系列データ

〇出力(Y)データ

予測対象となる出力データ

今回はこの入力データ4つから出力データ2つを予測する、という流れで実演していきます。

 

スポンサーリンク

時系列csvデータの読み込み方法

それではさっそく実際の作業に入っていきましょう。

 

まずは先ほどのcsvファイルを読み込んでいきます。

今回はプログラム実行場所にあるdata_set.csvというファイルを読み込んでみます。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
data_file='data_set.csv'
#csvファイルの読み込み
data=pd.read_csv(data_file).values
#時刻データ(一番左側)は使わないので除去する
data=data[:,1:]

 

これで先ほど紹介したX1~Y2までの時系列データが、変数dataに格納されています。

 

スポンサーリンク

読み込んだcsvファイルデータをLSTM用に加工する

次は先ほど読み込んだデータをLSTM用に加工していきましょう。

 

以下がそのサンプルコードです。

#データを入力(X)4つ、出力(Y)2つに分ける
input_data=data[:,0:4]
output_data=data[:,4:6]
Xdata=[]
Ydata=[]
#LSTM用にデータ加工
look_back=5
for i in range(data.shape[0]-look_back):
    Xtimedata=[]
    for j in range(input_data.shape[1]):
        Xtimedata.append(input_data[i:i+look_back,j])
    Xtimedata=np.array(Xtimedata)
    Xtimedata=Xtimedata.transpose()
    Xdata.append(Xtimedata)
    Ytimedata=[]
    for j in range(output_data.shape[1]):
        Ytimedata.append(output_data[i+look_back,j])
    Ydata.append(Ytimedata)
Xdata=np.array(Xdata)
Ydata=np.array(Ydata)

 

これでXdata、Ydataという変数にLSTM用の入力データ、出力データが格納されています。

LSTM用のデータは(データの総組み合わせ個数, 過去分のデータ数,1つのデータの次元)という構成になっている必要がありますので、

print(Xdata.shape)⇒(1436, 5, 4)
print(Ydata.shape)⇒(1436, 2)
となっていればOKです。

 

スポンサーリンク

実際に加工したデータをLSTMに入れてみる

ここまでくるともうこの記事の趣旨とは外れますが、学習⇒テストまでやってみましょう。

 

まずは学習です。

#ライブラリインポート
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.layers import LSTM
from tensorflow.keras.optimizers import Adam
#学習用の情報指定
Xdim=Xdata.shape[2]
Ydim=Ydata.shape[1]
validation_split_rate=0.2
#モデル構築
model = Sequential()
model.add(LSTM(4, input_shape=(look_back,Xdim)))
model.add(Dense(Ydim))
model.compile(loss="mean_squared_error", optimizer=Adam(lr=0.001))
model.summary()
#学習開始
history=model.fit(Xdata,Ydata,batch_size=16,epochs=200,validation_split=validation_split_rate)
#学習履歴のグラフ化
plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('Model loss')
plt.ylabel('Loss')
plt.xlabel('Epoch')
plt.legend(['Train', 'Test'], loc='upper left')
plt.show()

 

こいつを実行すると以下のグラフが出力されました。

学習時の損失履歴

Lossが問題なく減り、学習データとテストデータの損失がほぼ一致していますね。

 

スポンサーリンク

学習したモデルの精度を確認してみる

それでは先ほど学習させたモデルをテストしてみましょう。

#学習データから学習時にテストデータとして用いた部分を取り出す
Xdata_validation=Xdata[-int(len(Xdata)*(validation_split_rate)):]
Ydata_validation=Ydata[-int(len(Ydata)*(validation_split_rate)):]
#テスト
Predictdata = model.predict(Xdata_validation)
#テスト結果のグラフ化
plt.plot(range(0, len(Predictdata)),Predictdata[:,0], color="b", label="predict")
plt.plot(range(0, len(Ydata_validation)),Ydata_validation[:,0], color="r", label="row_data")
plt.legend()
plt.show()

 

kerasのvalidation_splitは指定した割合でデータの前半を学習、後半はテスト用に分割してくれていますので、同じ操作でまずは学習用、テスト用に分割します。

そしてテスト用データだけをモデルに投入し、出てきた結果をもともとのデータと比較するという流れですね。

 

こいつを実行すると以下の結果が得られました。

学習したモデルをテストした結果

(精度が良すぎて重ねってしまいわかりにくかったので、あえてちょっと数値をずらしています。)

 

というわけで問題なく予測できていそうですね。

 

スポンサーリンク

おわりに

というわけで今回は時系列データがはいっているcsvファイルからLSTM用のデータを作成⇒学習⇒テストという流れを実演してみました。

データ分析の際などにぜひご活用ください。

 

このように、私のブログでは様々なスキルを紹介しています。

過去記事一覧

 

今は仕事中で時間がないかもしれませんが、ぜひ通勤時間中などに他の記事も読んでいただけると嬉しいです。
⇒興味をもった方は【ヒガサラ】で検索してみてください。

確実にスキルアップできるはずです。

 

最後に、この記事が役に立ったという方は、ぜひ応援よろしくお願いします。
↓ 応援ボタン
にほんブログ村 IT技術ブログへ
にほんブログ村

それではまた!

コメント

タイトルとURLをコピーしました