[Aiコンペティションシリーズ]新しいクラウンエピデミック予測-スタックLSTMの将来の数値予測

関連リンク:
[aiコンペティションシリーズ]新しいクラウン流行予測–畳み込みLSTM将来数値予測
[aiコンペティションシリーズ]新しいクラウン流行予測– BiLSTM将来数値予測
[aiコンペティションシリーズ]新しいクラウン流行予測–時系列データ予測モデル

新しい王冠の流行の将来の予測を評価するための競争に参加するのは初めてです。
地域の新しい王冠の数か月間の履歴に新しいデータを追加してから、次の週の新しい王冠を予測します。
公式の履歴データは次のとおりです。
ここに画像の説明を挿入
今回は、Kerasによって実装されたスタックLSTMアルゴリズムが使用されます。

スタックされたLSTMコード:

import numpy as np
import keras
from keras.layers import *
import matplotlib.pyplot as plt

''' 载入数据集 '''

# 载入数据集 (注:载入数据的函数自行写,这边提供函数实现没有意义)
# 返回list类型,病例的新增数量按日期排列
org_case_count  = get_data.get_xldata(xl_index)



''' 处理数据 '''

# 制作时间序列和标签
def to_supervised(train, n_input, n_out, n_features,step):
    data = train
    # X存放时间序列,y存放标签
    # X的shape是3维,(序列数,序列内元素数,元素的特征值)
    # 举例,我代码的X.shape就是(210, 10, 1),总共有210个序列,每个序列一个元素(连续10天),每个元素一个特征值(新增病例数)
    # y的shape是2维,(序列数,标签值)
    # 举例,我代码的y.shape就是(210, 1),210个时间序列所推导的标签
    X, y = list(), list()
    in_start = 0
    for _ in range(len(data)):
    	#in_end:时间序列最后一位;out_end:标签最后一位
        in_end = in_start + (n_input-1)*step
        out_end =in_end + step*n_out
        if out_end < len(data):
            tmp_x = list()
            for i in range(n_input):
                if n_features == 1:
                    element_x = list()
                    element_x.append(data[in_start + i * step])
                    tmp_x.append(element_x)
                else:
                    tmp_x.append(data[in_start+i*step,0:n_features])
            X.append(tmp_x)
            tmp_y=list()
            tmp_y.append(data[in_start + (n_input*step)])
            y.append(tmp_y)
        in_start += 1
    return np.array(X),np.array(y)

# 归一化(除以最大值)
max_val = max(org_case_count)
case_count=list()
for data in org_case_count:
    tmp = data/max_val
    case_count.append(tmp)
case_count = np.array(case_count)
n_input = 10 # 时间序列元素数量(输入size),时间序列定义为连续10天;
n_output = 1 # 输出size,我们推导时间序列后的一天;
n_features = 1 # 特征数量
step_lenth = 1 #序列步长
#制作总时间序列
case_data,case_label = to_supervised(case_count,n_input,n_output,n_features,step_lenth)
# 制作训练集数据
train_data = case_data[:-14]
train_label = case_label[:-14]
# 制作验证集数据
valid_data = case_data[-14:-7]
valid_label = case_label[-14:-7]
# 制作测试集数据
test_data =  case_data[-7:]
test_label =  case_label[-7:]

''' 模型训练 '''

# 堆叠LSTM 模型
def encoder_decoder_LSTM_train(n_input,n_out,n_features,epochs_num,train_data,train_label,vaild_data,vaild_label):
    model =keras.Sequential()
    # 设置堆叠LSTM模型(核心代码)
    model.add(LSTM(3, activation='tanh', return_sequences=True, input_shape=(n_input, n_features)))
    model.add(LSTM(3, activation='tanh', return_sequences=True, dropout=0.2, recurrent_dropout=0.2))
    model.add(LSTM(3, activation='tanh', dropout=0.2, recurrent_dropout=0.2))
    model.add(Dense(n_out))
    
    # 模型编译
    model.compile(optimizer='adam',loss='mse')
    print(len(train_data),len(train_label),len(vaild_data),len(vaild_label))
    print(train_data.shape,train_label.shape)
    model.fit(train_data,train_label,epochs=epochs_num,batch_size=None,shuffle=False,validation_data=(vaild_data,vaild_label))
    return model

epochs_num=1000
# 模型开始训练
model = encoder_decoder_LSTM_train(n_input, n_output, n_features, epochs_num,
                          train_data, train_label, valid_data, valid_label)


''' 模型测试 '''

# 模型开始推理测试集
y_hat = model.predict(test_data).reshape((-1))
# 还原数据
test_label *= max_val
y_hat *= max_val
# 评测公式 
s = 0.0
for i in range(len(test_label)):
    s += abs(y_hat[i]-test_label[i]) / test_label[i]
print("s=",s)
# 图像展示
fig = plt.figure()
plt.plot(test_label)
plt.plot(y_hat)
plt.show()

最終効果:
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/sazass/article/details/109682939