【ai竞赛系列】新冠疫情预测--BiLSTM未来数值预测

相关链接:
【ai竞赛系列】新冠疫情预测–堆叠LSTM未来数值预测
【ai竞赛系列】新冠疫情预测–卷积LSTM未来数值预测
【ai竞赛系列】新冠疫情预测–时序数据预测模型

第一次参加竞赛,评测新冠疫情未来预测。
给该地区历史几个月的新冠新增数据,然后预测未来一周的新冠。
官方给的历史数据如下:
在这里插入图片描述

本次采用的是BiLSTM算法,采用Keras实现的

BiLSTM 代码:

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:]

''' 模型训练 '''

# BiLSTM 模型
def encoder_decoder_LSTM_train(n_input,n_out,n_features,epochs_num,train_data,train_label,vaild_data,vaild_label):
    model =keras.Sequential()
    # 设置BiLSTM模型(核心代码)
    model.add(Bidirectional(LSTM(3, activation='relu'), input_shape=(n_input, n_features)))
    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/109682097