【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
import openpyxln_input = 7    # 输入的数据个数
n_output = 7    # 输出的数据个数
n_features = 1  # 每个数据含有的特征数量
step_lenth = 1  # 步长(时间序列的组合方式:若为1,表示1,2,3的方式组合;若为2,表示1,3,5的方式组合)
epochs_num=500   # 训练的迭代次数# 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()model.add(Bidirectional(LSTM(3, activation='relu'), input_shape=(n_input, n_features)))model.add(Dense(n_out))# 模型编译model.compile(optimizer='adam',loss='mse')model.fit(train_data,train_label,epochs=epochs_num,batch_size=None,shuffle=False,validation_data=(vaild_data,vaild_label))return model# 根据输入数据个数,输出数据个数,步长,特征数,将原始的时间序列数据制作成为训练数据和标签;
def to_supervised(data, n_input, n_out, n_features,step):X, y = list(), list()in_start = 0 # in_start:当前训练数据的首位数据的位置。for _ in range(len(data)): # 遍历原始数据in_end = in_start + (n_input-1)*step # inend:当前训练数据的最后一位数据的位置out_end =in_end + step*n_out # out_end:当前标签的最后一位数据的位置if (out_end) <= len(data): #若作为标签的最后一位数据在原始数据的范围内,则可以划分一组训练数据和标签tmp_x = list()for i in range(n_input):if n_features == 1: # 当特征数为1,即只有单特征时间序列数据element_x = list()element_x.append(data[in_start + i * step]) #根据开始和结束位置存入训练数据(例如:[3,3,2,4,1])tmp_x.append(element_x) # 再存入容器中,这样与多特征的格式统一(格式变为:[[3,3,2,4,1]])else:tmp_x.append(data[in_start+i*step,0:n_features]) # 多特征的时序数据,训练数据也存入多特征(例如3特征的时序数据:[[3,2,1],[4,7,5],[9,5,2]])X.append(tmp_x) # 再将该组时序数据的容器存入训练数据的容器y.append(data[in_end:in_end + step*n_out]) # 该组的标签存入标签容器中in_start += 1 # 更新起始位置return np.array(X),np.array(y)# 载入数据集
file_path = '测评四-测试数据_52109.xlsx' # 输入数据路径(存储数据的xlsx文件或者csv文件)
wb = openpyxl.load_workbook(file_path)# 利用openpyxl将文件存入内存
sheet_case = wb['样例数据 1-测试数据']# sheet_case表示xlsx左下角数据所在的分页
colA = sheet_case['A']# 提取‘Sheet1’分页上第A列的数据
colB = sheet_case['B']# 提取‘Sheet1’分页上第B列的数据# demo说明:案例中的xlsx文件中A列是日期,B列是新增的病例数。因此在预测未来数据的时候实际上只需要用到B列的病例数,并且时间先后有序排列。
org_case_count = [] # 存储原始病例数的容器
day_count = [] # 天数(从1开始累加)
date_record = []
count = 0
for data in colB:if count == 0:count += 1continueorg_case_count.append(data.value)  # 病例数day_count.append(count)  # 天数date_record.append(colA[count].value)count += 1# # 归一化
max_val = max(org_case_count) # 取最大值
# print(max_val)
case_count=list() # 存储归一化后病例数的容器
for data in org_case_count:tmp = data/max_val # 将所有病例数据都控制在0~1之间case_count.append(tmp)  # 添加归一化后病例数# 制作训练集序列
case_count = np.array(case_count) # 转换为numpy.array格式# 将数据制作成训练数据和标签
# 举例说明:
# 若n_input=7,n_output=3,则表示利用前7天的数据预测后3天的数据,训练数据是前7天的病例数,标签就是后3天的病例数
# 例如时序数据为:1,2,3,4,5,6,7,8,9,10,11,12,13~~
# 数据格式:
# 训练数据:case_data.shape = (分组的总数,每一组的元素数,特征数)
# 举例:case_data = [[[1],[2],[3],[4],[5],[6],[7]],[[2],[3],[4],[5],[6],[7],[8]] ~~~]
# 标签: case_label.shape = (分组的总数,每一组的元素数)
# 举例:case_label = [[8,9,10],[9,10,11] ~~]
case_data,case_label = to_supervised(case_count,n_input,n_output,n_features,step_lenth)
print(case_data.shape)
print(case_label.shape)# 划分训练集和验证集。这里表示将后三组的训练数据和标签划为验证集
train_data = case_data[:-3]
train_label = case_label[:-3]
valid_data = case_data[-3:]
valid_label = case_label[-3:]''' 模型训练 '''
model = encoder_decoder_LSTM_train(n_input, n_output, n_features, epochs_num,train_data, train_label, valid_data, valid_label)''' 模型保存 '''
#(可选)保存成json格式的文件,只保存模型结构,而不包含其权重或配置信息
# save as JSON
json_string = model.to_json() # json格式的模型结构
open('my_model_architecture.json','w').write(json_string) # 写入到指定路径#(可选)保存成yam格式的文件,只保存模型结构,而不包含其权重或配置信息
# save as YAML
yaml_string = model.to_yaml()
open('my_model_architectrue.yaml','w').write(yaml_string)# 保存模型的权重
model.save_weights('my_model_weights.h5')''' 模型预测 '''
# 取最后的n_input位作为
org_test_data = case_count[-n_input:] #
# print("org_test_data.shape =",org_test_data.shape)
test_data = list()
tmp = list()
for data in org_test_data:element_x = list()element_x.append(data)tmp.append(element_x)
test_data.append(tmp)
test_data = np.array(test_data)y_hat = model.predict(test_data).reshape((-1))
# print(y_hat.shape)
y_hat *= max_val
print("最终预测结果:",y_hat)# 图像展示
fig = plt.figure()
plt.plot(y_hat)
plt.show()

最终效果:

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
代码打包:
提供了单特征时序数据预测和多特征时序数据预测,
并提供对应的样例数据可供参考:
在这里插入图片描述
https://download.csdn.net/download/sazass/15483173


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部