前提・実現したいこと
pythonでlstmを用いて、新型コロナウイルスの感染者数の予測を行っています。
ある程度予測はできたのですが、グラフにプロットしてみると、日付と感染者数がうまく適用されていません。どのような方法で解決すればよいですか。
該当のソースコード
基本のライブラリを読み込む
from keras.layers.core import Dropout
import numpy as np
import pandas as pd
グラフ描画
from matplotlib import pylab as plt
グラフを横長にする
from matplotlib.pylab import rcParams
rcParams['figure.figsize'] = 15, 6
データの読み込み
filepath = 'covid-19.csv'
data = pd.read_csv(filepath,index_col=0,parse_dates=['Date'])
型変換
input_data = data['Newly confirmed cases'].values.astype(float)
print("input_data : " , input_data.shape ,type(input_data))
スケールの正規化
norm_scale = input_data.max()
input_data /= norm_scale
print(input_data[0:5])
入力データと教師データの作成
def make_dataset(low_data, maxlen):
data, target = [], [] for i in range(len(low_data)-maxlen): data.append(low_data[i:i + maxlen]) target.append(low_data[i + maxlen]) re_data = np.array(data).reshape(len(data), maxlen, 1) re_target = np.array(target).reshape(len(data), 1) return re_data, re_target
RNNへの入力データ数
window_size = 12
入力データと教師データへの分割
X, y = make_dataset(input_data, window_size)
学習データ / 検証データ分割
split_rate = 0.7 # 学習データの割合
train_size = int(len(X) * split_rate)
X_train = X[:train_size]
X_test = X[train_size:]
y_train = y[:train_size]
y_test = y[train_size:]
ライブラリのインポート
import keras
from keras.models import Sequential
from keras.layers import Dense, Activation, LSTM
from keras.optimizers import Adam
import tensorflow as tf
from keras.layers import RepeatVector
from keras.layers import TimeDistributed
ネットワークの構築
m= Sequential() # Sequentialモデル
m.add(LSTM(500, activation='tanh',batch_input_shape=(None, window_size, 1))) # LSTM 50層
m.add(Dense(1))
#コンパイル
m.compile(loss='mean_squared_error', optimizer='rmsprop' , metrics = ['accuracy'])
#m.summary()
学習用パラメータ
batch_size = 20
n_epoch = 150
学習
hist = m.fit(X_train, y_train,
epochs=n_epoch,
validation_data=(X_test, y_test),
verbose=0,
batch_size=batch_size)
損失値(Loss)の遷移のプロット
plt.plot(hist.history['loss'],label="train set")
plt.plot(hist.history['val_loss'],label="test set")
plt.title('model loss')
plt.xlabel('epoch')
plt.ylabel('loss')
plt.legend()
plt.show()
#pred_train = m.predict(X_train)
y_pred_test = m.predict(X_test)
RMSEで評価
def rmse(y_pred, y_true):
return np.sqrt(((y_true - y_pred) ** 2).mean())
print("RMSE Score")
print(" train : " , rmse(y_pred_train, y_train))
print(" test : " , rmse(y_pred_test, y_test))
推定結果のプロット
plt.plot(X[:,0], color='blue', label="observed") # 元データ
plt.plot(y_pred_train, color='red', label="train") # 予測値(学習)
plt.plot(range(len(X_train),len(X_test)+len(X_train)),y_pred_test, color='green', label="test") # 予測値(検証)
plt.legend()
plt.grid()
plt.show()
試したこと
dfをdatetime型に変換したのですが(df=pd.date_range('2020/01/16','2021/11/14',freq='D'))、適用されませんでした。
補足情報(FW/ツールのバージョンなど)
Newly confirmed casesは日ごとの全国の感染者数の合計のカラム名です。
あなたの回答
tips
プレビュー