LSTM实战:基于PyTorch的新冠疫情确诊人数预测

目录

引言

一、探索数据集

1、导入相关库文件

2、导入每日确诊人数数据集

3、清洗每日确诊人数数据集

4、每日累计确诊的人数及其数据集可视化

5、每日撤消累计后的确诊人数及其数据集可视化

6、查看总共有多少数据量

二、数据预处理

1、训练和测试数据集

2、数据放缩

三、建立模型

1、封装训练模型

2、辅助训练模型

四、训练模型

五、预测模型 

1、局部数据预测

 2、全部数据预测


引言

在 Python 中使用 LSTM 预测新型冠状病毒每日确诊病例。参考原文


一、探索数据集

确诊人数数据网址下载该文件 time_series_covid19_confirmed_global.csv

1、导入相关库文件

import torch  # 导入PyTorch库,用于构建和训练深度学习模型
import os  # 导入os库,用于与操作系统交互
import numpy as np  # 导入NumPy库,用于数值计算
import pandas as pd  # 导入Pandas库,用于数据处理和分析
from tqdm import tqdm  # 导入tqdm库,用于显示进度条
import seaborn as sns  # 导入Seaborn库,用于数据可视化
from pylab import rcParams  # 导入rcParams对象,用于设置图形参数
import matplotlib.pyplot as plt  # 导入Matplotlib库,用于绘图
from matplotlib import rc  # 导入rc对象,用于自定义Matplotlib的默认配置
from sklearn.preprocessing import MinMaxScaler  # 导入MinMaxScaler,用于数据标准化
from pandas.plotting import register_matplotlib_converters  # 导入register_matplotlib_converters,用于处理时间序列数据
from torch import nn, optim  # 导入神经网络和优化器模块# 设置Matplotlib使用的后端为TkAgg
import matplotlib
matplotlib.use('TkAgg')# 设置Seaborn的样式和调色板
sns.set(style='whitegrid', palette='muted', font_scale=1.2)# 自定义颜色调色板
HAPPY_COLORS_PALETTE = ["#01BEFE", "#FFDD00", "#FF7D00", "#FF006D", "#93D30C", "#8F00FF"]# 设置Seaborn的调色板
sns.set_palette(sns.color_palette(HAPPY_COLORS_PALETTE))# 设置Matplotlib图形的大小
rcParams['figure.figsize'] = 14, 10# 注册Matplotlib转换器
register_matplotlib_converters()# 设置随机种子,以确保结果可复现
RANDOM_SEED = 42
np.random.seed(RANDOM_SEED)
torch.manual_seed(RANDOM_SEED)

2、导入每日确诊人数数据集

读取COVID-19全球累计确诊病例数据集

# 数据集包含省、国家/地区、纬度和经度以及病例数是累积的。
df = pd.read_csv('./data/time_series_covid19_confirmed_global.csv')
print(df.head())

3、清洗每日确诊人数数据集

去除前四列无用数据,保留每日累计确诊病例数据 

# 去掉前四列我们不需要的数据,通过切片直接获取第五列之后的数据
df = df.iloc[:, 4:]
print(df.head())

4、每日累计确诊的人数及其数据集可视化

对每日累计确诊病例进行求和,转换索引为日期时间格式 

# 我们对所有行求和,这样就得到了每日累计案例
daily_cases = df.sum(axis=0)
daily_cases.index = pd.to_datetime(daily_cases.index)
print(daily_cases.head())

plt.plot(daily_cases)
plt.title("Cumulative daily cases")
plt.show()

5、每日撤消累计后的确诊人数及其数据集可视化

计算每日新增确诊病例数

# 我们通过当前值减去前一个值来撤消累加并保留序列的第一个值。
daily_cases = daily_cases.diff().fillna(daily_cases[0]).astype(np.int64)
print(daily_cases.head())

plt.plot(daily_cases)
plt.title("Daily cases")
plt.show()

下图中有一个巨大的峰值主要是由于中国患者检测标准的变化。

6、查看总共有多少数据量

# 查看一下我们拥有的数据量。
print(daily_cases.shape)


二、数据预处理

1、训练和测试数据集

设置训练集和测试集的大小 

# 我们将保留前 889 天用于训练,其余的 254 天用于测试。
test_data_size = 889
train_data = daily_cases[:-test_data_size]
test_data = daily_cases[-test_data_size:]
print(train_data.shape)
print(test_data.shape)

2、数据放缩

对数据进行标准化,将数值缩放到0到1之间

# 为了提高模型的训练速度和性能,我们必须缩放数据(值将在 0 和 1 之间)。
scaler = MinMaxScaler()
scaler = scaler.fit(np.expand_dims(train_data, axis=1))train_data = scaler.transform(np.expand_dims(train_data, axis=1))
test_data = scaler.transform(np.expand_dims(test_data, axis=1))

定义创建序列的函数 

def create_sequences(data, seq_length):xs = []ys = []for i in range(len(data) - seq_length - 1):x = data[i:(i + seq_length)]y = data[i + seq_length]xs.append(x)ys.append(y)return np.array(xs), np.array(ys)# 设置序列长度
seq_length = 9# 创建训练集和测试集的序列数据
X_train, y_train = create_sequences(train_data, seq_length)
X_test, y_test = create_sequences(test_data, seq_length)# 将数据转换为PyTorch张量
X_train = torch.from_numpy(X_train).float()
y_train = torch.from_numpy(y_train).float()
X_test = torch.from_numpy(X_test).float()
y_test = torch.from_numpy(y_test).float()print(X_train.shape)
print(X_train[:2])
print(y_train.shape)
print(y_train[:2])

每个训练示例包含 9 个历史数据点序列和 1 个标签,该标签表示我们的模型需要预测的真实值。接下来看看我们转换后的数据的样貌。

三、建立模型

1、封装训练模型

定义 COVID-19 预测模型

# 把模型封装到一个自torch.nn.Module的类中
class CoronaVirusPredictor(nn.Module):def __init__(self, n_features, n_hidden, seq_len, n_layers=2):super(CoronaVirusPredictor, self).__init__()self.n_hidden = n_hiddenself.seq_len = seq_lenself.n_layers = n_layersself.lstm = nn.LSTM( input_size=n_features,  # 输入特征维数:特征向量的长度,如 889# hidden_size 只是指定从LSTM输出的向量的维度,并不是最后的维度,因为LSTM层之后可能还会接其他层,如全连接层(FC),因此hidden_size对应的维度也就是FC层的输入维度。hidden_size=n_hidden,  # 隐层状态的维数:每个 LSTM 单元或者时间步的输出的 h(t) 的维度,单元内部有权重与偏差计算# num_layers 为隐藏层的层数,官方的例程里面建议一般设置为1或者2。num_layers=n_layers,  # RNN 层的个数:在竖直方向堆叠的多个相同个数单元的层数dropout=0.5  # 是否在除最后一个 LSTM 层外的 LSTM 层后面加 dropout 层)self.linear = nn.Linear(in_features=n_hidden, out_features=1)# 重置隐藏状态: 使用无状态 LSTM,需要在每个示例之后重置状态。def reset_hidden_state(self):self.hidden = (torch.zeros(self.n_layers, self.seq_len, self.n_hidden),torch.zeros(self.n_layers, self.seq_len, self.n_hidden))# 前向传播: 获取序列,一次将所有序列通过 LSTM 层。采用最后一个时间步的输出并将其传递给我们的线性层以获得预测。def forward(self, sequences):lstm_out, self.hidden = self.lstm(sequences.view(len(sequences), self.seq_len, -1),self.hidden)last_time_step = \lstm_out.view(self.seq_len, len(sequences), self.n_hidden)[-1]y_pred = self.linear(last_time_step)return y_pred

2、辅助训练模型

定义训练模型的辅助函数 

# 构建一个用于训练模型的辅助函数
def train_model(model,train_data,train_labels,test_data=None,test_labels=None
):loss_fn = torch.nn.MSELoss(reduction='sum')optimiser = torch.optim.Adam(model.parameters(), lr=1e-3)num_epochs = 100train_hist = np.zeros(num_epochs)test_hist = np.zeros(num_epochs)for t in range(num_epochs):model.reset_hidden_state()y_pred = model(X_train)loss = loss_fn(y_pred.float(), y_train)if test_data is not None:with torch.no_grad():y_test_pred = model(X_test)test_loss = loss_fn(y_test_pred.float(), y_test)test_hist[t] = test_loss.item()if t % 10 == 0:print(f'Epoch {t} train loss: {loss.item()} test loss: {test_loss.item()}')elif t % 10 == 0:print(f'Epoch {t} train loss: {loss.item()}')train_hist[t] = loss.item()optimiser.zero_grad()loss.backward()optimiser.step()return model.eval(), train_hist, test_hist

四、训练模型

创建并训练COVID-19预测模型 

model = CoronaVirusPredictor(n_features=1,n_hidden=512,seq_len=seq_length,n_layers=2
)
model, train_hist, test_hist = train_model(model,X_train,y_train,X_test,y_test
)
plt.plot(train_hist, label="Training loss")
plt.plot(test_hist, label="Test loss")
plt.ylim((0, 100))
plt.legend()
plt.show()

查看训练和测试损失过程可视化:

五、预测模型 

1、局部数据预测

将训练数据、测试数据及预测数据绘制在同一张画布上,一起比较下预测结果。 

with torch.no_grad():test_seq = X_test[:1]preds = []for _ in range(len(X_test)):y_test_pred = model(test_seq)pred = torch.flatten(y_test_pred).item()preds.append(pred)new_seq = test_seq.numpy().flatten()new_seq = np.append(new_seq, [pred])new_seq = new_seq[1:]test_seq = torch.as_tensor(new_seq).view(1, seq_length, 1).float()true_cases = scaler.inverse_transform(np.expand_dims(y_test.flatten().numpy(), axis=0)
).flatten()predicted_cases = scaler.inverse_transform(np.expand_dims(preds, axis=0)
).flatten()plt.plot(daily_cases.index[:len(train_data)],scaler.inverse_transform(train_data).flatten(),label='Historical Daily Cases')plt.plot(daily_cases.index[len(train_data):len(train_data) + len(true_cases)],true_cases,label='Real Daily Cases')plt.plot(daily_cases.index[len(train_data):len(train_data) + len(true_cases)],predicted_cases,label='Predicted Daily Cases')plt.legend()
plt.show()

正如预期的那样,我们的模型效果表现不佳。 

 2、全部数据预测

使用所有数据来训练相同的模型,预测未来 30 天的确诊病例。

# 现将使用所有可用数据来训练相同的模型。
scaler = MinMaxScaler()scaler = scaler.fit(np.expand_dims(daily_cases, axis=1))
all_data = scaler.transform(np.expand_dims(daily_cases, axis=1))
print(all_data.shape)# 预处理和训练步骤相同。
X_all, y_all = create_sequences(all_data, seq_length)X_all = torch.from_numpy(X_all).float()
y_all = torch.from_numpy(y_all).float()model = CoronaVirusPredictor(n_features=1, n_hidden=512, seq_len=seq_length, n_layers=2
)
model, train_hist, _ = train_model(model, X_all, y_all)# 定义预测天数:使用“完全训练”的模型来预测未来 60 天的确诊病例
DAYS_TO_PREDICT = 60# 使用训练好的模型进行预测
with torch.no_grad():test_seq = X_all[:1]preds = []for _ in range(DAYS_TO_PREDICT):y_test_pred = model(test_seq)pred = torch.flatten(y_test_pred).item()preds.append(pred)new_seq = test_seq.numpy().flatten()new_seq = np.append(new_seq, [pred])new_seq = new_seq[1:]test_seq = torch.as_tensor(new_seq).view(1, seq_length, 1).float()# 将预测结果反向转换为原始数据范围
predicted_cases = scaler.inverse_transform(np.expand_dims(preds, axis=0)
).flatten()# 构建预测日期范围:要使用历史和预测案例创建一个很酷的图表,我们需要扩展数据框的日期索引。
predicted_index = pd.date_range(start=daily_cases.index[-1],periods=DAYS_TO_PREDICT + 1,inclusive="right"
)# 创建预测结果Series对象
predicted_cases = pd.Series(data=predicted_cases,index=predicted_index
)# 绘制预测结果图表
fig1 = plt.figure('Figure1')
plt.plot(predicted_cases, label='Predicted Daily Cases')fig2 = plt.figure('Figure2')
plt.plot(daily_cases, label='Historical Daily Cases')
plt.plot(predicted_cases, label='Predicted Daily Cases')
plt.legend()
plt.show()

参与训练的全部数据。

预测未来 30 天确诊病例的数据

将历史和预测的确诊人数在一个图表中显示

模型性能不是很好,但考虑到数据量很少,这是可以预期的。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/725732.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

STM32用标准库做定时器定时1秒更新OLED的计数值(Proteus仿真)

首先新建proteus工程,绘制电路图: 然后赋值我之前文章中提到的文件夹OLED屏幕显示:(没有的自己去那篇文章下载去) 然后进入文件夹: 新建两个文件在Mycode文件夹中: 文件关系如下: 新…

CogCaliperTool卡尺工具

CogCaliperTool(卡尺工具) CogCaliperTool(卡尺工具)是一种用于测量直线特征的工具。该工具通常用于检测图像中的边缘、轮廓或其他直线特征,并提供精确的测量数据,如长度、角度和位置信息。 比如说我们需要测量下图工具的边缘对…

【深度学习笔记】计算机视觉——FCN(全卷积网络

全卷积网络 sec_fcn 如 :numref:sec_semantic_segmentation中所介绍的那样,语义分割是对图像中的每个像素分类。 全卷积网络(fully convolutional network,FCN)采用卷积神经网络实现了从图像像素到像素类别的变换 :cite:Long.Sh…

校招中的“熟悉linux操作系统”一般是指达到什么程度?

校招中的“熟悉linux操作系统”一般是指达到什么程度? 在开始前我有一些资料,是我根据网友给的问题精心整理了一份「Linux的资料从专业入门到高级教程」, 点个关注在评论区回复“888”之后私信回复“888”,全部无偿共享给大家&am…

归并排序总结

1.归并排序 归并排序的步骤如下: ①枚举中点,将区间分为左右两段; ②对左右两段区间分别排序; 这个过程以递归的方式进行。 ③合并两段区间。 是一个模拟的过程。用两个指针分别指向左右区间,判断当前哪个数小&…

基于机器学习的垃圾分类

1绪论 1.1问题背景 垃圾分类有减少环境污染、节省土地资源、再生资源的利用、提高民众价值观念等的好处,在倡导绿色生活,注重环境保护的今天,正确的垃圾分类和处理对我们的生态环境显得尤为重要。 在国外很多国家,经过了几十年…

VTK的编译和部署,配合c++和visual studio2022,VTK开发环境的配置

1.下载 在官网选择最新的版本 Download | VTK 下载之后进行解压,然后再里面创建build目录,方便后面使用cmake进行编译 2.对源码进行编译 打卡Cmake,如图操作 可以看到点击configure之后,cmake对我们的代码在进行处理 处理完成之…

基于SpringBoot+Vue+ElementUI+Mybatis前后端分离管理系统超详细教程(二)

学习后端CRUD操作 书接上文,我们学习了前后端分离项目的基础环境配置和用户管理模块的前后端基础搭建,以下链接是上一节教程内容详细步骤,友友们可以跟着步骤实操。本节课程我们在前面项目的基础上接着学习后端CRUD操作,真正打通数…

阿里云一键登录(号码认证服务)

前言 用户登录原来的登录方式如下 1. 手机号验证码 2. 账号密码 运营觉得操作过于复杂, 因此想引入阿里自动登录的逻辑, 也就是号码认证服务,所以才有了这篇问文章 注: 本文只是记录Java端的实现, app端的请自行查询文档实现 官方资料 文档 : 什么是号码认证服务_号码认证服务(…

SpringBoot中集成LiteFlow(轻量、快速、稳定可编排的组件式规则引擎)实现复杂业务解耦、动态编排、高可扩展

场景 在业务开发中,经常遇到一些串行或者并行的业务流程问题,而业务之间不必存在相关性。 使用策略和模板模式的结合可以解决这个问题,但是使用编码的方式会使得文件太多, 在业务的部分环节可以这样操作,在项目角度就无法一眼洞…

【洛谷 P9240】[蓝桥杯 2023 省 B] 冶炼金属 题解(二分答案)

[蓝桥杯 2023 省 B] 冶炼金属 题目描述 小蓝有一个神奇的炉子用于将普通金属 O 冶炼成为一种特殊金属 X。这个炉子有一个称作转换率的属性 V V V, V V V 是一个正整数,这意味着消耗 V V V 个普通金属 O 恰好可以冶炼出一个特殊金属 X,当普…

产业园区如何实现数字化运营管理?

​在数字化浪潮席卷全球的今天,产业园区正经历着前所未有的变革,数字化运营管理成为各个园区转型升级的发力方向,它不仅能够提升园区的运营管理效率,还能够帮助园区提高服务效能、实现精准招商、增强决策效率,从而全面…

Redis实战—商户查询缓存

本博客为个人学习笔记,学习网站:黑马程序员Redis入门到实战 实战篇之商户查询缓存 目录 什么是缓存 添加Redis缓存 缓存更新策略 数据库缓存不一致解决方案 案例:给查询商铺的缓存添加超时剔除和主动更新策略 缓存穿透 案例&#xff1…

奇富科技:大数据任务从诊断到自愈的实践之路

一、为什么要做诊断引擎 毓数平台是奇富科技公司自主研发的一站式大数据管理、开发、分析平台,覆盖大数据资产管理、数据开发及任务调度、自助分析及可视化、统一指标管理等多个数据生命周期流程,让用户使用数据的同时,挖掘数据最大的价值。…

打造高效、安全的交易平台:开发流程与关键要素解析

在数字化时代,大宗商品交易平台开发/搭建已成为连接买家与卖家的桥梁,为无数企业和个人提供了便捷、高效的交易机会。然而,随着市场的竞争日益激烈,如何打造一个既符合用户需求又具备竞争力的交易平台,成为了众多开发者…

文件上传{session文件包含以及条件竞争、图片文件渲染绕过(gif、png、jpg)}

session文件包含以及条件竞争 条件: 知道session文件存储在哪里 一般的默认位置: /var/lib/php/sess_PHPSESSID /var/lib/php/sessions/sess_PHPSESSID /tmp/sess_PHPSESSID /tmp/sessions/sess_PHPSESSID ####在没做过设置的情况下一般都是存储在/var…

解决WordPress更新插件或者更新版本报WordPress 需要访问您网页服务器的权限的问题

文章目录 前言一、原因二、解决步骤总结 前言 当对WordPress的插件或者版本进行更新时报错:要执行请求的操作,WordPress 需要访问您网页服务器的权限。 请输入您的 FTP 登录凭据以继续。 如果您忘记了您的登录凭据(如用户名、密码&#xff09…

光线追踪7 - 抗锯齿(Antialiasing)

目前为止,如果你放大渲染出的图像,可能会注意到图像边缘的明显“阶梯状”效果。这种阶梯效果通常被称为“走样”或“锯齿”。当真实相机拍摄图片时,边缘通常没有锯齿,因为边缘像素是一些前景和一些背景的混合。请考虑,…

5. 链接和加载(linker and loader)

链接和加载(linker and loader): linker即链接器,它负责将多个.c编译生成的.o文件,链接成一个可执行文件或者是库文件; loader即加载器,它原本的功能很单一只是将可执行文件的段拷贝到编译确定的内存地址即可&#x…

英福康INFICON残余气体RGA General Chinese中文培训PPT课件

英福康INFICON残余气体RGA General Chinese中文培训PPT课件