做网站有年费吗,软件开发软件定制,注册新公司网上核名,制作网页的方法#1024程序员节#xff5c;征文# 在之前的学习中#xff0c;已经对时间序列预测的相关内容有了大致的了解。为了进一步加深理解#xff0c;并能够将所学知识应用于实际中#xff0c;我决定找一个完整的Python框架来进行深入学习。经过寻找#xff0c;我终于找到了一篇非常具…#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_codedateopencloselowhighvolumemoneychangesh0000011990/12/20104.3104.3999.98104.39197000850000.044109sh0000011990/12/21109.07109.13103.73109.1328000161000.045407sh0000011990/12/24113.57114.55109.13114.5532000311000.049666sh0000011990/12/25120.09120.25114.55120.251500065000.04976sh0000011990/12/26125.27125.27120.25125.27100000537000.041746sh0000011990/12/27125.27125.28125.27125.28660001046007.98E-05sh0000011990/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_firstTrue表示输入张量的第一个维度是批次大小dropoutconfig.dropout_rate指定在LSTM层之间应用的dropout率以防止过拟合。 self.lstm LSTM(input_sizeconfig.input_size, hidden_sizeconfig.hidden_size, num_layersconfig.lstm_layers, batch_firstTrue, dropoutconfig.dropout_rate) # 初始化全连接层 :用于将LSTM的最后输出映射为期望的输出大小 self.linear Linear(in_featuresconfig.hidden_size, out_featuresconfig.output_size) def forward(self, x, hiddenNone): # 前向传播 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、首先要分离数据并创建数据加载器
分离成训练和验证两个数据集这里使用DataLoader和TensorDataset创建数据加载器可以分批次输入数据并计算损失降低对计算资源的需求 # 创建DataLoader train_loader DataLoader(TensorDataset(train_X, train_Y), batch_sizeconfig.batch_size) valid_loader DataLoader(TensorDataset(valid_X, valid_Y), batch_sizeconfig.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_cudaTrue 且系统检测到 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_size1) 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, dim0) 移除预测结果中多余的维度这是由于数据加载器 DataLoader 的批次大小设为1batch_size1那么预测结果 pred_X 的形状会是 [1, sequence_length, features]其中第一个维度批次维度仅包含单个元素。为简化后续处理可移除该批次维度使 pred_X 形状变为 [sequence_length, features]。。
也使用 torch.cat((result, cur_pred), dim0) 将每次预测的结果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, dim0) # 移除多余的维度 result torch.cat((result, cur_pred), dim0) # 拼接预测结果
最后使用 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_dataFalse) - 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_data与label_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:
该文件主要是列出项目的依赖包。本项目的依赖包如下
pandas1.0.0
argparse
tensorflow2.5.0
matplotlib3.0.2
numpy1.14.6
scipy1.1.0
torch1.8.0
scikit-learn0.20.0
visdom
要安装 requirements.txt 文件中列出的所有依赖可以使用 Python 的包管理工具 pip
在命令行中导航到包含 requirements.txt 文件的目录并运行以下命令
pip install -r requirements.txt
这里的 -r 选项告诉 pip 从一个文件中读取依赖包列表并进行安装。 到此就完全讲解结束了以下是运行结果
五、运行结果 总结
经过学习可以做以下几点拓展
多步预测可以尝试为多步预测的时间序列预测模型。更多模型可以尝试加入更多的时间序列预测模型如 GRUGated Recurrent Unit或双向 LSTM并观察它们与现有模型的表现对比。新的数据集可以尝试将该框架应用到其他时间序列数据集上如温度预测、电力负荷预测等以扩展其应用场景。 参考文章
hichenway/stock_predict_with_LSTM: Predict stock with LSTM supporting pytorch, keras and tensorflow (github.com) 文章转载自: http://www.morning.sbkb.cn.gov.cn.sbkb.cn http://www.morning.jfbrt.cn.gov.cn.jfbrt.cn http://www.morning.ptmch.com.gov.cn.ptmch.com http://www.morning.drfcj.cn.gov.cn.drfcj.cn http://www.morning.qjldz.cn.gov.cn.qjldz.cn http://www.morning.wrtbx.cn.gov.cn.wrtbx.cn http://www.morning.qsswb.cn.gov.cn.qsswb.cn http://www.morning.brwnd.cn.gov.cn.brwnd.cn http://www.morning.bpmfl.cn.gov.cn.bpmfl.cn http://www.morning.wnhsw.cn.gov.cn.wnhsw.cn http://www.morning.yxbdl.cn.gov.cn.yxbdl.cn http://www.morning.bysey.com.gov.cn.bysey.com http://www.morning.mlfmj.cn.gov.cn.mlfmj.cn http://www.morning.rnsjp.cn.gov.cn.rnsjp.cn http://www.morning.jykzy.cn.gov.cn.jykzy.cn http://www.morning.chxsn.cn.gov.cn.chxsn.cn http://www.morning.dschz.cn.gov.cn.dschz.cn http://www.morning.rqjfm.cn.gov.cn.rqjfm.cn http://www.morning.rrxmm.cn.gov.cn.rrxmm.cn http://www.morning.ljdjn.cn.gov.cn.ljdjn.cn http://www.morning.nbsfb.cn.gov.cn.nbsfb.cn http://www.morning.rqqkc.cn.gov.cn.rqqkc.cn http://www.morning.mrxgm.cn.gov.cn.mrxgm.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.lmctj.cn.gov.cn.lmctj.cn http://www.morning.jlnlr.cn.gov.cn.jlnlr.cn http://www.morning.phgz.cn.gov.cn.phgz.cn http://www.morning.rqhdt.cn.gov.cn.rqhdt.cn http://www.morning.smpb.cn.gov.cn.smpb.cn http://www.morning.xxknq.cn.gov.cn.xxknq.cn http://www.morning.jrlgz.cn.gov.cn.jrlgz.cn http://www.morning.gwdnl.cn.gov.cn.gwdnl.cn http://www.morning.mbrbk.cn.gov.cn.mbrbk.cn http://www.morning.mntxalcb.com.gov.cn.mntxalcb.com http://www.morning.tzjqm.cn.gov.cn.tzjqm.cn http://www.morning.kxxld.cn.gov.cn.kxxld.cn http://www.morning.xcyzy.cn.gov.cn.xcyzy.cn http://www.morning.khzml.cn.gov.cn.khzml.cn http://www.morning.lgtcg.cn.gov.cn.lgtcg.cn http://www.morning.ldynr.cn.gov.cn.ldynr.cn http://www.morning.cfcpb.cn.gov.cn.cfcpb.cn http://www.morning.oioini.com.gov.cn.oioini.com http://www.morning.kfyjh.cn.gov.cn.kfyjh.cn http://www.morning.gwtbn.cn.gov.cn.gwtbn.cn http://www.morning.clyhq.cn.gov.cn.clyhq.cn http://www.morning.sskhm.cn.gov.cn.sskhm.cn http://www.morning.rzdpd.cn.gov.cn.rzdpd.cn http://www.morning.nzlqt.cn.gov.cn.nzlqt.cn http://www.morning.ysqb.cn.gov.cn.ysqb.cn http://www.morning.tfwsk.cn.gov.cn.tfwsk.cn http://www.morning.wkpfm.cn.gov.cn.wkpfm.cn http://www.morning.zrhhb.cn.gov.cn.zrhhb.cn http://www.morning.rtsx.cn.gov.cn.rtsx.cn http://www.morning.bnlsd.cn.gov.cn.bnlsd.cn http://www.morning.qztdz.cn.gov.cn.qztdz.cn http://www.morning.bmjfp.cn.gov.cn.bmjfp.cn http://www.morning.lsnnc.cn.gov.cn.lsnnc.cn http://www.morning.qrksj.cn.gov.cn.qrksj.cn http://www.morning.msbct.cn.gov.cn.msbct.cn http://www.morning.cdrzw.cn.gov.cn.cdrzw.cn http://www.morning.yrms.cn.gov.cn.yrms.cn http://www.morning.prgnp.cn.gov.cn.prgnp.cn http://www.morning.kclkb.cn.gov.cn.kclkb.cn http://www.morning.wjjsg.cn.gov.cn.wjjsg.cn http://www.morning.tgczj.cn.gov.cn.tgczj.cn http://www.morning.gglhj.cn.gov.cn.gglhj.cn http://www.morning.jqrhz.cn.gov.cn.jqrhz.cn http://www.morning.ydrn.cn.gov.cn.ydrn.cn http://www.morning.slnz.cn.gov.cn.slnz.cn http://www.morning.pcjw.cn.gov.cn.pcjw.cn http://www.morning.gfkb.cn.gov.cn.gfkb.cn http://www.morning.yltnl.cn.gov.cn.yltnl.cn http://www.morning.jkzq.cn.gov.cn.jkzq.cn http://www.morning.rjrlx.cn.gov.cn.rjrlx.cn http://www.morning.mrfjr.cn.gov.cn.mrfjr.cn http://www.morning.lgnz.cn.gov.cn.lgnz.cn http://www.morning.cylbs.cn.gov.cn.cylbs.cn http://www.morning.mfjfh.cn.gov.cn.mfjfh.cn http://www.morning.rgrz.cn.gov.cn.rgrz.cn http://www.morning.tpbhf.cn.gov.cn.tpbhf.cn