时间序列预测(十五)——有关Python项目框架的实例分析

#1024程序员节|征文#

在之前的学习中,已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解,并能够将所学知识应用于实际中,我决定找一个完整的Python框架来进行深入学习。经过寻找,我终于找到了一篇非常具有参考价值的源代码,非常感激。

接下来,我将详细记录自己的学习过程和心得,以便更好地掌握和应用时间序列预测技术。

这个项目的目录结构如下,展示了一个使用不同深度学习框架(Keras、PyTorch 和 TensorFlow)来进行股票价格预测的 Python 框架,包含多个模型文件和预测图像。

stock_predict_with_LSTM-master
│
├── data                                  # 存放数据集
│   └── stock_data.csv
│
├── figure                                # 存放预测结果的图像
│   ├── continue_predict_high_with_pytorch.png
│   ├── continue_predict_low_with_pytorch.png
│   ├── predict_high_with_pytorch.png
│   └── predict_low_with_pytorch.png
│
├── model                                 # 存放不同框架下的模型文件
│   ├── __pycache__                       # Python 缓存目录
│   │    ├── __init__.cpython-38.pyc
│   │    └── model_pytorch.cpython-38.pyc
│   ├── __init__.py                       # 包声明文件
│   └── model_pytorch.py                  # PyTorch 模型实现
│
├── .gitignore                            # Git忽略文件,列出不提交到仓库的文件类型
├── LICENSE                               # 项目的许可证
├── main.py                               # 项目的主入口,通常是执行的主程序
├── README.md                             # 项目说明文档,介绍如何运行和使用该项目
├── requirements.txt                      # 列出项目依赖的 Python 包

一、data文件

该文件夹主要用于存放数据集,这里只有一个数据集,是.csv文件,部分数据如下图所示。

index_codedateopencloselowhighvolumemoneychange
sh0000011990/12/20104.3104.3999.98104.39197000850000.044109
sh0000011990/12/21109.07109.13103.73109.1328000161000.045407
sh0000011990/12/24113.57114.55109.13114.5532000311000.049666
sh0000011990/12/25120.09120.25114.55120.251500065000.04976
sh0000011990/12/26125.27125.27120.25125.27100000537000.041746
sh0000011990/12/27125.27125.28125.27125.28660001046007.98E-05
sh0000011990/12/28126.39126.45125.28126.45108000880000.009339

二、figure文件夹

该文件夹主要用于存放不同框架(如 PyTorch、Keras、TensorFlow)进行股票高价和低价预测的结果图像。

、model文件夹

1、__pycache__文件夹

 __pycache__ 目录是 Python 自动生成的,用于存储已编译的字节码文件(.pyc 文件)。这些文件通常不需要手动编辑或提交到版本控制系统中,但 .gitignore 文件(后面介绍)通常会包含规则来忽略这些文件。

2、__init__.py文件

主要是用于声明 model是一个 Python 包,可以被导入到其他模块中。文件夹里为空。

主要展示使用Keras的深度学习框架来构建 LSTM 模型进行股票预测

3、model_pytorch.py文件(主要学习)

主要展示使用PyTorch的深度学习框架来构建 LSTM 模型进行股票预测

(1)定义模型类

定义一个名为Net的类,包含了LSTM(长短期记忆)层和全连接层。这个模型通过LSTM层处理时间序列数据,捕获数据中的长期依赖关系,然后通过全连接层将LSTM的输出(形状是 [batch_size, sequence_length, hidden_size])映射到期望的输出大小(形状是[batch_size, hidden_size])。

# 定义模型类  
class Net(Module):  
    '''  
     定义包含LSTM和全连接层的PyTorch模型,用于时间序列预测。
    '''  
    # 其中,Config 是一个用于配置模型训练、验证和预测过程的参数集合,
    # 通常定义在一个单独的配置文件或类中(这里定义在main.py)。它包含关于模型结构、训练设置、数据路径等的关键参数。
    def __init__(self, config):  
        super(Net, self).__init__()  
        # 初始化LSTM层:输入为config.input_size,隐藏单元为config.hidden_size,层数为config.lstm_layers  
        # batch_first=True表示输入张量的第一个维度是批次大小,dropout=config.dropout_rate指定在LSTM层之间应用的dropout率,以防止过拟合。 
        self.lstm = LSTM(input_size=config.input_size, hidden_size=config.hidden_size,  
                         num_layers=config.lstm_layers, batch_first=True, dropout=config.dropout_rate)  
        # 初始化全连接层 :用于将LSTM的最后输出映射为期望的输出大小 
        self.linear = Linear(in_features=config.hidden_size, out_features=config.output_size)  
  
    def forward(self, x, hidden=None):  
        # 前向传播  
        lstm_out, hidden = self.lstm(x, hidden)  
        # 提取LSTM的最后时间步输出,输入到全连接层  
        linear_out = self.linear(lstm_out[:, -1, :])  
        return linear_out, hidden  

lstm_out[:, -1, :] 仅提取了 LSTM 输出的最后一个时间步的数据。其中 : 表示选择所有样本(在第一个维度上);-1 表示选择最后一个时间步(在第二个维度上),这并不是说第二个维度“消失了”,而是说它在这个特定的索引操作中不再以原来的大小存在,被“压缩”了; : 表示选择该时间步的所有隐藏状态特征(在第三个维度上)。因此,这个操作的结果是一个形状为 [batch_size, hidden_size] 的张量。 属于单步预测。

(2)定义训练函数  
def train(config, logger, train_and_valid_data):  

这里的输入有三个:

Config 是用于配置模型的参数集合,logger 用于输出训练日志,train_and_valid_data 是包含训练和验证数据的元组或列表(train_X, train_Y, valid_X, valid_Y)

a、首先要分离数据,并创建数据加载器

分离成训练和验证两个数据集,这里使用DataLoaderTensorDataset创建数据加载器,可以分批次输入数据并计算损失,降低对计算资源的需求

  # 创建DataLoader  
    train_loader = DataLoader(TensorDataset(train_X, train_Y), batch_size=config.batch_size)  
    valid_loader = DataLoader(TensorDataset(valid_X, valid_Y), batch_size=config.batch_size) 
  • TensorDataset(train_X, train_Y) 将训练集特征和目标打包到一起,使得 DataLoader 能够一次性处理对应的输入和目标
  • DataLoader 用于将 TensorDataset 生成的小批次数据集,用 config.batch_size 指定每个批次的样本数量。

b、设置设备,并将模型移动到指定设备

device = torch.device("cuda:0" if config.use_cuda and torch.cuda.is_available() else "cpu") 

这段代码用于检测用户配置和系统是否满足 GPU 的使用条件。如果满足(即use_cuda=True 且系统检测到 GPU),则选择 cuda:0(第一个 GPU)作为训练设备;否则,选择 cpu

之后将模型移动到指定设备

    # 初始化模型并移动到指定设备  

    model = Net(config).to(device)  

这里还涉及到 “增量训练”,

 # 增量训练(如果配置中启用了增量训练)  ,加载已保存的模型参数 
    if config.add_train:  
        model.load_state_dict(torch.load(config.model_save_path + config.model_name))  

具体介绍可参考这篇文章介绍:

时间序列预测(十三)——增量训练(Incremental Learning)-CSDN博客

c、初始化优化器和损失函数

使用Adam优化器来更新模型参数。使用均方误差(MSE)作为损失函数。

d、 训练循环

在所有的训练周期(epoch)内都要进行俩个模式:训练模式和评估模式。

        model.train()  # 设置模型为训练模式  

在训练模式下,遍历训练数据加载器,进行前向传播、计算损失、反向传播和参数更新。根据配置决定是否清除隐藏状态的梯度。如果启用了可视化,则绘制训练损失。

这里损失计算时会有问题,需要将_train_Y 的形状与pred_Y 形状(二维)匹配,以便能够正确计算损失

            _train_Y = _train_Y[:, -1, :]  # 选择最后一个时间步的输出,形状为 [64, 2]

结束后,设置模型为评估模式。

        model.eval()  # 设置模型为评估模式  

遍历验证数据加载器,计算验证损失。计算并输出当前轮次的训练和验证损失。如果启用了可视化,则绘制每个轮次的训练和验证损失。

这里也有问题,需要将_valid_Y 的形状与pred_Y 形状(二维)匹配,以便能够正确计算损失

            _valid_Y = _valid_Y[:, -1, :]  # 选择最后一个时间步的输出,形状 [64, 2]

最后还设置了早停机制。

if valid_loss_cur < valid_loss_min:  
            valid_loss_min = valid_loss_cur  
            bad_epoch = 0  
            # 保存最优模型  
            torch.save(model.state_dict(), config.model_save_path + config.model_name)  
        else:  
            bad_epoch += 1  
            if bad_epoch >= config.patience:   # 若验证集损失未减小,则提前终止训练 
                logger.info(" The training stops early in epoch {}".format(epoch))  
                break  

根据早停机制,如果验证损失达到新低(即当前验证损失小于之前记录的最小验证损失),则保存模型并重置早停计数器;否则(即,验证损失没有改善),则增加早停计数器,如果早停计数器超过了配置的耐心值(patience),则提前终止训练。

有关训练模式和评估模式的区别可以参考下面这篇文章:

时间序列预测(十二)——训练模式、评估模式和预测模式的区别-CSDN博客

(3)定义预测函数  
def predict(config, test_X):  

这里的输入有两个:

Config 是用于配置模型的参数集合,test_X:是测试数据集。

之后和训练函数有些相似

a、创建数据加载器

# 转换测试数据为Tensor  
    test_X = torch.from_numpy(test_X).float()  
    test_set = TensorDataset(test_X)  
    test_loader = DataLoader(test_set, batch_size=1)  
  

 b、设置设备,并将模型移动到指定设备

device = torch.device("cuda:0" if config.use_cuda and torch.cuda.is_available() else "cpu")  
    model = Net(config).to(device)  
    model.load_state_dict(torch.load(config.model_save_path + config.model_name))  

c、进行预测

首先,将模型设置为评估模式

 model.eval()  

之后,遍历测试数据加载器,对于每个批次的数据:将数据移动到指定的设备上,使用模型进行预测,并更新隐藏状态。

这里还会使用 torch.squeeze(pred_X, dim=0) 移除预测结果中多余的维度(这是由于数据加载器 DataLoader 的批次大小设为1(batch_size=1),那么预测结果 pred_X 的形状会是 [1, sequence_length, features],其中第一个维度(批次维度)仅包含单个元素。为简化后续处理,可移除该批次维度,使 pred_X 形状变为 [sequence_length, features]。)。

也使用 torch.cat((result, cur_pred), dim=0) ,将每次预测的结果cur_pred在指定的维度(这里是维度0,即行的方向)上与result进行拼接,添加到result中,从而汇总所有的预测结果。

        data_X = _data[0].to(device)  
        pred_X, hidden_predict = model(data_X, hidden_predict)  
        cur_pred = torch.squeeze(pred_X, dim=0)  # 移除多余的维度  
        result = torch.cat((result, cur_pred), dim=0)  # 拼接预测结果  

最后使用 detach() 方法将 result从计算图中分离,并移动到CPU上,使用 .numpy() 方法将Tensor转换为NumPy数组,以便后续处理。

    return result.detach().cpu().numpy() 

四、剩下的文件

1、.gitignore:

用于告诉 Git 哪些文件或文件夹不应该提交到版本控制系统中。通常包含 .pyc 缓存文件、虚拟环境文件等。

2、LICENSE:

项目的开源许可证,指明项目的使用权利和限制。这里是一个宽松的开源许可证Apache许可证2.0

3、main.py:

该文件是项目的主入口,应该包含整个项目的运行逻辑。通常从这里加载数据、构建模型并进行训练和预测。

(1)配置类 (Config)

a、数据参数

定义特征列和目标列的索引,设置预测的天数。

b、网络参数

包括输入输出大小、LSTM层数、隐藏层大小、dropout概率和时间步长。

c、训练参数

训练和验证的设置(如批量大小、学习率、训练周期等),并配置随机种子以确保结果可复现。

d、路径参数

定义数据、模型、图形和日志文件的保存路径,并创建必要的目录。

(2)数据处理类 (Data)

a、数据读取

    def read_data(self):

读取CSV文件,如果处于调试模式 (debug_mode),则只读取部分数据(debug_num 行)。否则,读取的数据包含特定的特征列 (feature_columns)。最后返回数据值和列名

b、获取训练和验证数据

    def get_train_and_valid_data(self):

从归一化后的数据中提取特征数据和标签数据,根据是否连续训练 (do_continue_train),采用不同的方式(非连续训练模式和连续训练模式,都是滑动窗口)生成训练样本 (train_x 和 train_y),使用 train_test_split 方法划分训练集和验证集。

c、获取测试数据

    def get_test_data(self, return_label_data=False) -> np.ndarray:

这里取训练数据之后的所有数据作为测试特征数据,根据时间步长 (sample_interval) 生成测试样本 (test_x)。这里的样本之间是不重叠的,具体采样方式如下图所示。

如果 return_label_data 为 True,则同时返回测试样本和标签数据,否则只返回测试样本。

(3) 日志记录函数 (load_logger)
def load_logger(config: Config) -> logging.Logger:

创建和配置日志记录器,根据配置决定将日志输出到屏幕 (此时do_log_print_to_screen为True) 和文件 (此时do_log_save_to_file为True)。

(4)绘图函数 (draw)
def draw(config: Config, origin_data: Data, logger, predict_norm_data: np.ndarray):

用于绘制真实值和预测值的函数,便于可视化模型的预测效果。

可能是前面形状的修改,导致这里predict_datalabel_data也出现了形状问题,做了一些修改的。

这里还有问题,在修改中,,,,,

(5)主函数(main)
def main(config):
(6if __name__ == "__main__"(最重要、必不可少)

这部分代码是Python脚本的标准做法,用于确保当脚本被直接运行时才执行某些代码。

a、导入 argparse库,

b、创建并配置 argparse 解析器

parser = argparse.ArgumentParser()  
# 可以根据需要添加更多参数  
args = parser.parse_args()

创建一个 ArgumentParser 实例,并调用 parse_args 方法来解析命令行参数

c、创建配置实例并设置属性

con = Config()  # 创建配置实例  
for key in dir(args):  # 遍历 args 的所有属性  
    if not key.startswith("_"):  # 排除内部属性  
        setattr(con, key, getattr(args, key))  # 将属性值赋给配置

创建了一个 Config 类的实例,用于存储配置信息。然后,遍历 args 对象的所有属性,将这些属性的值复制到 con 配置对象中。这里使用一个条件来排除以 _ 开头的属性,这些属性通常是 argparse 内部使用的。

d、运行主函数

main(con)  # 运行主函数

最后,这行代码调用 main 函数,并将配置对象 con 作为参数传递给它。

4、README.md:

这个文件通常提供项目的介绍和使用说明,帮助用户理解如何设置和运行项目。

5、requirements.txt:

该文件主要是列出项目的依赖包。本项目的依赖包如下:

pandas>=1.0.0
argparse
tensorflow>=2.5.0
matplotlib>=3.0.2
numpy>=1.14.6
scipy>=1.1.0
torch>=1.8.0
scikit-learn>=0.20.0
visdom

要安装 requirements.txt 文件中列出的所有依赖,可以使用 Python 的包管理工具 pip

在命令行中,导航到包含 requirements.txt 文件的目录,并运行以下命令:

pip install -r requirements.txt

这里的 -r 选项告诉 pip 从一个文件中读取依赖包列表,并进行安装。

到此就完全讲解结束了,以下是运行结果

五、运行结果

总结:

经过学习,可以做以下几点拓展:

  • 多步预测:可以尝试为多步预测的时间序列预测模型。
  • 更多模型:可以尝试加入更多的时间序列预测模型,如 GRU(Gated Recurrent Unit)或双向 LSTM,并观察它们与现有模型的表现对比。
  • 新的数据集:可以尝试将该框架应用到其他时间序列数据集上,如温度预测、电力负荷预测等,以扩展其应用场景。

参考文章:

hichenway/stock_predict_with_LSTM: Predict stock with LSTM supporting pytorch, keras and tensorflow (github.com)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

业务流程顺畅度为何受制于数据失真

在当今数字化驱动的商业环境中&#xff0c;企业的业务流程高度依赖于数据的准确性和完整性。然而&#xff0c;数据失真问题却如同隐匿在流程中的“暗礁”&#xff0c;频繁地给企业的业务流程顺畅度带来严重挑战&#xff0c;进而影响企业的整体运营效率和竞争力。 数据失真的表…

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目

基于hive分析Flask为后端框架echarts为前端框架的招聘网站可视化大屏项目 1. 项目概述 项目目标是构建一个大数据分析系统&#xff0c;包含以下核心模块&#xff1a; 1、数据爬取&#xff1a;通过request请求获取猎聘网的就业数据。 2、数据存储和分析&#xff1a;使用 Hive …

GB/T 28046.1-2011 道路车辆 电气及电子设备的环境条件和试验 第1部分:一般规定(2)

写在前面 本系列文章主要讲解道路车辆电气及电子设备的环境条件和试验GB/T 28046标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解GB/T 28046标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 第1部分&#xff1a;一般规定 7. 试验和要…

GetMaterialApp组件的用法

文章目录 1. 知识回顾2. 使用方法2.1 源码分析2.2 常用属性3. 示例代码4. 内容总结我们在上一章回中介绍了"Get包简介"相关的内容,本章回中将介绍GetMaterialApp组件.闲话休提,让我们一起Talk Flutter吧。 1. 知识回顾 我们在上一章回中已经介绍过GetMaterialApp组…

自适应阻抗案例分析(上)

案例分析一 Duchaine,V.,Gosselin,C.(2009).Safe,stable and intuitive control for physical human-robot interaction.In IEEE international conference on robotics and automation,2009.ICRA09(pp.3383-3388).IEEE. 主要贡献 1.利用外力反馈调整阻尼系数&#xff0c;同…

(三)行为模式:11、模板模式(Template Pattern)(C++示例)

目录 1、模板模式含义 2、模板模式的UML图学习 3、模板模式的应用场景 4、模板模式的优缺点 5、C实现的实例 1、模板模式含义 模板模式&#xff08;Template Method Pattern&#xff09;是一种行为设计模式&#xff0c;它定义了一个操作中的算法骨架&#xff0c;将某些步骤…

Unity3D学习FPS游戏(3)玩家第一人称视角转动和移动

前言&#xff1a;上一篇实现了角色简单的移动控制&#xff0c;但是实际游戏中玩家的视角是可以转动的&#xff0c;并根据转动后视角调整移动正前方。本篇实现玩家第一人称视角转动和移动&#xff0c;觉得有帮助的话可以点赞收藏支持一下&#xff01; 玩家第一人称视角 修复小问…

arco-design 自定义table和for循环自定义form-item并添加自定义校验

代码 <template><div class"list-container"><Breadcrumb:items"[menu.generateRecords, menu.generateRecordsDetail]":needBack"true"/><a-card class"general-card"><PageQueryref"pageQuery&quo…

DriftingBlues: 1渗透测试

靶机&#xff1a;DriftingBlues: 1 DriftingBlues: 1 ~ VulnHubhttps://www.vulnhub.com/entry/driftingblues-1,625/ 攻击机&#xff1a;kail linux 2024 1,将两台虚拟机网络连接都改为NAT模式&#xff0c;并查看靶机的MAC地址 2&#xff0c;攻击机上做主机扫描发现靶机 靶机I…

一个简单的图像分类项目(四)编写脚本:图像加载器

创建训练和测试的数据集&#xff0c;并创建加载器。lib.load_imags.py: import glob from torch.utils.data import DataLoader, Dataset from torchvision import transformsfrom script.setting import *# 图片处理函数 def img_loader(path):try:img Image.open(path)img …

NLTK无法下载?

以下内容仅为当前认识&#xff0c;可能有不足之处&#xff0c;欢迎讨论&#xff01; 文章目录 nltk无法下载怎么办&#xff1f;什么是NLTK&#xff1f;为什么要用NLTK&#xff1f;如何下载&#xff1f; nltk无法下载怎么办&#xff1f; 什么是NLTK&#xff1f; NLTK是学习自然…

厨艺爱好者的在线互动平台:Spring Boot实现

摘 要 使用旧方法对厨艺交流信息进行系统化管理已经不再让人们信赖了&#xff0c;把现在的网络信息技术运用在厨艺交流信息的管理上面可以解决许多信息管理上面的难题&#xff0c;比如处理数据时间很长&#xff0c;数据存在错误不能及时纠正等问题。 这次开发的厨艺交流平台功能…

解决SpringBoot项目启动错误:找不到或无法加载主类

如何解决SpringBoot项目的“找不到或无法加载主类”启动错误 在开发SpringBoot应用时&#xff0c;经常可能会遇到一个启动错误&#xff1a;“错误&#xff1a;找不到或无法加载主类 com.example.controller.demo.DemoApplication”。本文将介绍三种解决这一问题的方法。 方法…

Tessy学习笔记-CTE如何生成测试用例

1&#xff1a;前提工作 在开始设置测试用例之前&#xff0c;我们还需要将树图补充完整&#xff0c;如下图 补充步骤&#xff0c; 1&#xff1a;在palette中&#xff0c;选择两个class拖动到return图标下&#xff0c;然后回到palette中选择DefineParent将class与Return图标连接…

在Java中,需要每120分钟刷新一次的`assetoken`,并且你想使用Redis作为缓存来存储和管理这个令牌

学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……&#xff09; 2、学会Oracle数据库入门到入土用法(创作中……&#xff09; 3、手把手教你开发炫酷的vbs脚本制作(完善中……&#xff09; 4、牛逼哄哄的 IDEA编程利器技巧(编写中……&#xff09; 5、面经吐血整理的 面试技…

《Python游戏编程入门》注-第4章1

《Python游戏编程入门》的第4章是“用户输入&#xff1a;Bomb Cathcer游戏”&#xff0c;通过轮询键盘和鼠标设备状态实现Bomb Cathcer游戏。 1 Bomb Cathcer游戏介绍 “4.1 认识Bomb Cathcer游戏”内容介绍了Bomb Cathcer游戏的玩法&#xff0c;即通过鼠标来控制红色“挡板”…

【HarmonyOS】判断应用是否已安装

【HarmonyOS】判断应用是否已安装 前言 在鸿蒙中判断应用是否已安全&#xff0c;只是通过包名是无法判断应用安装与否。在鸿蒙里新增了一种判断应用安装的工具方法&#xff0c;即&#xff1a;canOpenLink。 使用该工具函数的前提是&#xff0c;本应用配置了查询标签querySch…

【Java基础】2、Java基础语法

f2/fnf2&#xff1a;选中点中的文件名 ​​​​​​​ 1.注释 为什么要有注释&#xff1f; 给别人和以后的自己可以看懂的解释 注释含义 注释是在程序指定位置的说明性信息&#xff1b;简单理解&#xff0c;就是对代码的一种解释 注释分类 单行注释 //注释信息 多行注释…

【Linux系统编程】线程深入运用

目录 一&#xff0c;C线程与系统线程 二&#xff0c;分离线程 三&#xff0c;线程结构 四&#xff0c;__thread关键字 五&#xff0c;Linux线程互斥 1&#xff0c;线程互斥相关的背景概念 2&#xff0c;互斥锁 3&#xff0c;死锁 4&#xff0c;互斥锁的弊端 六&#…

【ACM出版,EI稳定检索,九大高校联合举办, IEEE Fellow支持】2024年计算机视觉与艺术研讨会(CVA 2024)

在线投稿&#xff1a;学术会议-学术交流征稿-学术会议在线-艾思科蓝 2024年计算机视觉与艺术国际学术会议&#xff08;CVA 2024&#xff09;作为2024年人工智能、数字媒体技术与交互设计国际学术会议&#xff08;ICADI 2024)的分会。此次大会旨在汇聚全球在计算机视觉与艺术…