基于LSTM的新型冠状病毒预测模型

LSTM的优势

长短期记忆网络(LSTM,Long Short-Term Memory)是一种时间循环神经网络,很好的解决了一般的RNN(循环神经网络)存在的长期依赖问题。具体的原理以及公式推导这里不做讲述,感兴趣的可以自行查阅相关资料,这里主要讲解使用tensorflow去搭建LSTM模型,以及模型的使用。

我们本次使用tensorflow搭建LSTM模型

  1. 数据来源 ,本次模型所要用到的数据来源于Github疫情数据;可自行下载使用

在这里插入图片描述

1.导入相应的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler
from tensorflow.keras import models,layers,losses,metrics,callbacks 
#from keras.models import Sequentialquential
#from keras.layers import Dense,LSTM ,Droupt
%matplotlib inline
%config InlineBackend.figure_format = 'svg'`
2.数据处理过程这里不做展示,主要是将原有的数据按地区进行整理以及只保留时间,确诊人数,累计确诊人数,死亡人数,治愈人数这四项。

在这里插入图片描述

3.处理好数据后读入数据,然后生成训练集和测试集数据,具体代码如下
###数据读取与处理
path = ''
filename = path +'Alabama.csv'
df = pd.read_csv(filename,names =['date','confirmed_num','dead_num','cured_num'],encoding='gbk')
df = df.set_index('date')#设置索引
df.index = pd.DatetimeIndex(df.index)#将索引转换为时间序列
#空缺值处理
df = df.fillna(value=0)
df.head()
train_set = df[:150].iloc[:,0:3] #训练集,获取第一列的数据
test_set = df[150:].iloc[:,0:3].values #训练集,获取第一列的数据
train_set.shape
4.搭建lstm模型
def lstm_Modle():
    tf.keras.backend.clear_session()
    x_input = layers.Input(shape=(None, 3), dtype=tf.float32)
    x = layers.LSTM(5, return_sequences=True, input_shape=(None, 3))(x_input)
    x = layers.LSTM(5, return_sequences=True, input_shape=(None, 3))(x)
    x = layers.LSTM(5, return_sequences=True, input_shape=(None, 3))(x)
    x = layers.LSTM(5, input_shape=(None, 3))(x)
    x = layers.Dense(3)(x)
    # 考虑到新增确诊,新增治愈,新增死亡人数数据不可能小于0,设计如下结构
    # x = tf.maximum((1+x)*x_input[:,-1,:],0.0)
    x = Block()(x_input, x)
    model = models.Model(inputs=[x_input], outputs=[x])
    model.summary()
    return model
5.模型的训练
#训练模型
def train_modle(model,x_train,y_train):
    import datetime
    optimizer = tf.keras.optimizers.Adam(learning_rate=0.002)
    model.compile(
        optimizer=optimizer,
        loss='mean_squared_logarithmic_error')  # loss=MSPE(name = "MSPE")
    logdir = r"D:\疫情Github数据" + datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
    tb_callback = tf.keras.callbacks.TensorBoard(logdir, histogram_freq=1)
    # 如果loss在100个epoch后没有提升,学习率减半。
    lr_callback = tf.keras.callbacks.ReduceLROnPlateau(monitor="loss", factor=0.5, patience=100)
    # 当loss在200个epoch后没有提升,则提前终止训练。
    stop_callback = tf.keras.callbacks.EarlyStopping(monitor="loss", patience=200)
    callbacks_list = [tb_callback, lr_callback, stop_callback]
    history = model.fit(x_train,y_train, epochs=300, callbacks=callbacks_list)
    return history
#开始训练
import datetime
model = lstm_Modle() 
history = train_modle(model,x_train,y_train)

模型结构
在这里插入图片描述

6.模型的预测以及结果
pre_nums = model.predict(x_test)
pre_nums
#反归一化
stand_pre = sc.inverse_transform(pre_nums)
#print(stand_pre)#预测每日新增确诊人数
stand_prelist = [i[0] for i in stand_pre ]
stand_prelist = stand_prelist[:-1]
print(stand_prelist)
print(sc.inverse_transform(x_test[-1]))
y_test_t = df['confirmed_num'][142:182].values
print(y_test_t)#实际每日新增确诊人数
#绘制测试结果与预测结果
plt.plot(y_test_t,label = "新冠真实确诊人数")
plt.plot(stand_prelist,label = "新冠预测确诊人数")
plt.legend(["true","predict"])
plt.show()

在这里插入图片描述

7.相关说明

最后的实验结果是经过多次反复的测试,其中包括数据的处理,数据的输入等不断地尝试,最后选择输入数据为三维数据,然后做差最后经过标准化等处理放入模型预测,由于测试版本较多,所以以上代码只是其中关键部分,供大家参考学习使用。

  • 13
    点赞
  • 146
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论
以下是一个基于LSTM的剩余寿命预测模型的代码示例: ```python import numpy as np import pandas as pd from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense, LSTM # 读取数据 data = pd.read_csv('data.csv') data = data.dropna() # 将数据缩放到0和1之间 scaler = MinMaxScaler(feature_range=(0, 1)) scaled_data = scaler.fit_transform(data) # 创建训练数据集 train_data = scaled_data[0:800, :] x_train = [] y_train = [] for i in range(60, len(train_data)): x_train.append(train_data[i-60:i, 0]) y_train.append(train_data[i, 0]) # 转换为NumPy数组 x_train, y_train = np.array(x_train), np.array(y_train) # 改变输入数据的形状 x_train = np.reshape(x_train, (x_train.shape[0], x_train.shape[1], 1)) # 创建和拟合LSTM模型 model = Sequential() model.add(LSTM(units=50, return_sequences=True, input_shape=(x_train.shape[1], 1))) model.add(LSTM(units=50)) model.add(Dense(1)) model.compile(loss='mean_squared_error', optimizer='adam') model.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2) # 创建测试数据集 test_data = scaled_data[800:, :] x_test = [] y_test = data[800:, :] for i in range(60, len(test_data)): x_test.append(test_data[i-60:i, 0]) # 转换为NumPy数组 x_test = np.array(x_test) # 改变输入数据的形状 x_test = np.reshape(x_test, (x_test.shape[0], x_test.shape[1], 1)) # 使用训练好的模型进行预测 predictions = model.predict(x_test) predictions = scaler.inverse_transform(predictions) # 计算均方根误差 rmse = np.sqrt(np.mean(((predictions - y_test) ** 2))) print(rmse) ``` 该代码假设您已经有一个名为“ data.csv”的数据文件,其中包含一列数据(剩余寿命)。首先,代码读取并缩放数据,然后将其拆分为训练和测试数据集。接下来,代码使用LSTM模型来对训练数据进行拟合。最后,模型被用来预测测试数据集,并计算预测结果的均方根误差。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

不要香菜哈

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值