首页 > 其他分享 >(29-6-02)通过回测、ARIMA 和 GRU 预测股票价格:深度学习模型预测(2)

(29-6-02)通过回测、ARIMA 和 GRU 预测股票价格:深度学习模型预测(2)

时间:2024-10-11 17:21:19浏览次数:9  
标签:02 node GRU 模型 29 NUMA test cuda

29.8.4  训练和测试数据集的划分

训练和测试数据集的划分是机器学习中评估模型在未见数据上的表现的重要过程。通过将数据集分成两个部分:训练集用于训练模型,测试集用于评估模型的性能,我们可以更好地了解模型对新数据的泛化能力。这一过程可以帮助我们避免过拟合,即模型在训练集上表现良好,但在测试集上表现不佳,因为模型过度学习了训练数据。

在本项目中,通过下面代码的功能是将数据集按照75%的比例划分为训练集和25%的比例划分为测试集。首先,它设定了一个阈值,将数据集分为训练数据和测试数据,然后输出训练集和测试集的形状。

# 设置数据划分的阈值
threshold = int(X.shape[0] * 0.75)  # 75%的数据用于训练

# 75%的数据用于训练
X_train, y_train = X[:threshold], y[:threshold]

# 25%的数据用于测试
X_test, y_test = X[threshold:], y[threshold:]

# 打印训练集和测试集的形状
print("X_train shape:", X_train.shape)
print("y_train shape:", y_train.shape)
print("X_test shape:", X_test.shape)
print("y_test shape:", y_test.shape)

执行后会输出:

X_train shape: (3468, 13, 13)
y_train shape: (3468,)
X_test shape: (1156, 13, 13)
y_test shape: (1156,)

29.8.5  构建和训练模型

接下来开始构建和训练模型,在这一步中主要实现下面的功能:

  1. 设置模型架构:将定义模型架构,包括一个或多个层的类型、神经元的数量、激活函数和输入形状。
  2. 编译模型:接下来,将通过指定损失函数、优化器以及任何其他希望监控的指标来编译模型。
  3. 训练模型:最后,将通过指定训练的轮数、批次大小以及训练数据来训练模型。
  4. 评估模型:一旦模型训练完成,我们将通过计算在验证数据上的准确性和其他性能指标来评估模型。

(1)下面代码定义并打印了一个用于时间序列预测的神经网络模型。模型架构包括一个输入层与训练数据形状相同,一个包含64个隐藏状态的GRU层,一个具有8个神经元并使用ReLU激活函数的全连接层,最后是一个输出层,用线性激活函数预测单一目标值。

# 定义一个Sequential模型
model = Sequential()

# 添加一个与训练数据形状相同的输入层
model.add(InputLayer((X_train.shape[1], X_train.shape[2])))

# 添加一个具有64个隐藏状态的GRU层
model.add(GRU(64))

# 添加一个具有8个神经元并使用ReLU激活的Dense层
model.add(Dense(8, 'relu'))

# 添加一个具有1个神经元并使用线性激活的输出层
model.add(Dense(1, 'linear'))

# 打印模型的摘要
model.summary()

执行后输出:

2024-08-23 21:35:23.769436: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:23.773514: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:23.774280: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:23.776147: I tensorflow/core/platform/cpu_feature_guard.cc:142] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations:  AVX2 AVX512F FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2024-08-23 21:35:23.776519: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:23.777502: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:23.778408: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:27.591823: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:27.592657: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:27.593387: I tensorflow/stream_executor/cuda/cuda_gpu_executor.cc:937] successful NUMA node read from SysFS had negative value (-1), but there must be at least one NUMA node, so returning NUMA node zero
2024-08-23 21:35:27.593991: I tensorflow/core/common_runtime/gpu/gpu_device.cc:1510] Created device /job:localhost/replica:0/task:0/device:GPU:0 with 15185 MB memory:  -> device: 0, name: Tesla P100-PCIE-16GB, pci bus id: 0000:00:04.0, compute capability: 6.0
Model: "sequential"
_________________________________________________________________
Layer (type)                 Output Shape              Param #   
=================================================================
gru (GRU)                    (None, 64)                15168     
_________________________________________________________________
dense (Dense)                (None, 8)                 520       
_________________________________________________________________
dense_1 (Dense)              (None, 1)                 9         
=================================================================
Total params: 15,697
Trainable params: 15,697
Non-trainable params: 0
_________________________________________________________________

(2)下面代码创建了一个早期停止回调,用于监控模型在验证集上的损失,并在训练过程中根据设置的条件停止训练。然后,代码编译了模型,设置了均方误差作为损失函数,使用Adam优化器,并通过根均方误差作为评估指标。最后,在训练集上训练模型,并在验证集上进行验证,同时应用早期停止回调。

# 创建一个早期停止回调以监控验证损失
callback = EarlyStopping(
    # 监控验证损失
    monitor="val_loss",
    # 损失变化的最小值,才算作改进
    min_delta=0.001,
    # 如果连续5个周期没有改进则停止训练
    patience=5,
    # 输出详细模式
    verbose=1,
    # 自动选择模式
    mode="auto",
    # 监控数量的基准值
    baseline=None,
    # 是否从最佳周期恢复模型权重
    restore_best_weights=False
)

# 编译模型
model.compile(loss='mse', optimizer=Adam(learning_rate=0.001), metrics=[RootMeanSquaredError()])

# 训练模型
history = model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=100, callbacks=callback)

执行后会输出:

2024-08-23 21:35:28.634027: I tensorflow/compiler/mlir/mlir_graph_optimization_pass.cc:185] None of the MLIR Optimization Passes are enabled (registered 2)
Epoch 1/100
2024-08-23 21:35:30.804070: I tensorflow/stream_executor/cuda/cuda_dnn.cc:369] Loaded cuDNN version 8005
109/109 [==============================] - 4s 7ms/step - loss: 6.7591e-04 - root_mean_squared_error: 0.0260 - val_loss: 0.0035 - val_root_mean_squared_error: 0.0595
Epoch 2/100
109/109 [==============================] - 0s 4ms/step - loss: 1.7683e-05 - root_mean_squared_error: 0.0042 - val_loss: 0.0033 - val_root_mean_squared_error: 0.0571
Epoch 3/100
109/109 [==============================] - 0s 4ms/step - loss: 1.0447e-05 - root_mean_squared_error: 0.0032 - val_loss: 0.0033 - val_root_mean_squared_error: 0.0576
Epoch 4/100
109/109 [==============================] - 0s 4ms/step - loss: 7.8711e-06 - root_mean_squared_error: 0.0028 - val_loss: 0.0034 - val_root_mean_squared_error: 0.0584
Epoch 5/100
109/109 [==============================] - 0s 4ms/step - loss: 6.9226e-06 - root_mean_squared_error: 0.0026 - val_loss: 0.0033 - val_root_mean_squared_error: 0.0574
Epoch 6/100
109/109 [==============================] - 0s 4ms/step - loss: 6.7276e-06 - root_mean_squared_error: 0.0026 - val_loss: 0.0035 - val_root_mean_squared_error: 0.0588
Epoch 00006: early stopping

29.8.6  使用 GRU 进行预测

门控递归单元(GRU)是一种用于处理序列数据的递归神经网络(RNN)变体。GRU 通过引入门控机制来解决传统 RNN 在长序列训练中遇到的梯度消失和爆炸问题。它包含两个主要的门控:重置门和更新门。重置门决定了之前状态对当前计算的影响程度,而更新门则控制了当前状态对模型的影响。GRU 相较于长短期记忆(LSTM)网络,结构更简单,计算更高效,能够在处理序列数据时提供更好的性能。使用 GRU 进行预测时需要注意:

  1. 确保数据规范化:在将数据输入 GRU 模型之前,必须确保数据已经规范化。这有助于确保模型不会对某些特征产生偏倚。
  2. 选择合适的学习率:选择一个既不太大也不太小的学习率。这将有助于确保模型不会过拟合或欠拟合数据。
  3. 使用适当的正则化:正则化有助于防止过拟合和欠拟合。使用适当的正则化技术,如 dropout、L2 正则化或早期停止,以确保模型不会过拟合或欠拟合数据。
  4. 调整模型超参数:调整模型的超参数,如层数、每层的神经元数量、优化器等,以确保模型能够在未见数据上良好地进行泛化。
  5. 使用良好的验证策略:一个好的验证策略对于确保模型在未见数据上能够良好地泛化非常重要。使用交叉验证、保留法或自助法等良好的验证策略,以确保模型能够良好地泛化。

(1)使用训练好的 GRU 模型对测试数据集 X_test 进行预测,并将预测结果转换为一维数组。随后,创建一个数据框 test_results 来对比预测值与实际值,并显示这些值。

# 使用 GRU 模型对 X_test 进行预测,然后将数据转换为一维数组
test_predictions = model.predict(X_test).flatten()
# 创建一个数据框来对比测试预测值和实际值
test_results = pd.DataFrame(data={'Test Predictions': test_predictions, 'Actuals': y_test})
# 显示这些值
test_results

执行后会输出:

Test Predictions	Actuals
0	0.377864	0.376329
1	0.378204	0.380764
2	0.378463	0.381507
3	0.375202	0.376793
4	0.374757	0.371249
...	...	...
1151	0.586198	0.593833
1152	0.592010	0.601970
1153	0.590334	0.602508
1154	0.589119	0.592959
1155	0.598000	0.622413
1156 rows × 2 columns

(2)绘制目标值和预测值有助于可视化模型的表现,并查看预测结果与目标值的接近程度。这可以帮助识别模型中的错误,并检查需要额外关注的地方。此外,对模型的表现进行时间上的比较也是有帮助的,这使得调整模型以获得更好的结果变得更加容易。下面代码绘制了使用GRU模型进

# 绘制预测值
plt.plot(test_results['Test Predictions']) 
# 绘制实际值
plt.plot(test_results['Actuals'])
# 移除顶部边框
plt.gca().spines['top'].set_visible(False)
# 移除右侧边框
plt.gca().spines['right'].set_visible(False)
# 添加图例
plt.legend(['Predictions', 'Actuals'])
# 设置 y 轴标签
plt.ylabel('Predictions / Actuals')
# 设置 x 轴标签
plt.xlabel('Time')
# 设置图表标题
plt.title('Predictions and Actuals over time, GRU Model', fontsize=18)
# 显示图表
plt.show()

执行效果如图29-25所示,展示了预测值和实际值的时间序列图,并进行了图表的美化处理,包括添加图例、标签、标题,以及去除图表的顶部和右侧边框。

图29-25  测试集上的预测图

29.8.7  模型评估

模型评估是机器学习中的关键步骤,用于验证模型的性能和有效性。通过评估,数据科学家可以确定模型是否能够准确地预测结果,识别潜在的过拟合或欠拟合问题,并确保模型在实际应用中的表现与预期一致。评估过程通常包括计算各种性能指标,如准确率、精确率、召回率和均方误差,以确保模型能够对新数据做出有效的预测,并在实际应用中发挥其预期作用。

在本项目中,模型评估非常重要,因为它有助于确保机器学习模型正常工作,并适合其预期用途。通过进行模型评估,数据科学家可以确保模型经过优化,能够最佳地表示数据并提供准确的预测。通过下面的代码计算并打印GRU模型在测试集上的均方误差(MSE)。均方误差是衡量模型预测值与实际值之间差异的标准指标,用于评估模型的性能。

print('MSE of the GRU model ::', round(mse(test_results['Test Predictions'], test_results['Actuals']),6))

执行后会输出:

MSE of the GRU model : 0.003459

上面的输出结果表示 GRU 模型在测试数据上的均方误差(MSE)为 0.003459,这是衡量模型预测准确性的一种方式,数值越小表明模型的预测越接近实际值。

标签:02,node,GRU,模型,29,NUMA,test,cuda
From: https://blog.csdn.net/asd343442/article/details/142849509

相关文章

  • Redis-02 数据持久化
    redis持久化即将数据从内存写入磁盘,Redis提供了两种持久化的方式:RDB和AOF。1.RDBRDB持久化:Redis可以将内存中的数据定期快照保存到磁盘上的一个二进制文件中。RDB持久化是一种比较紧凑的文件格式,适用于备份和灾难恢复。通过配置Redis的持久化策略,可以设置Redis定期保存快......
  • 2024前端面试题!
    目录一、Html5、Css3篇1、HTML、XHTML、XML有什么区别?⭐2、XML和JSON的区别?3、是否了解W3C的规范?⭐4、什么是语义化标签?⭐⭐5、常用的块级元素和行内元素有哪一些?⭐6、行内元素和块级元素的区别?⭐7、css盒子模型有几种类型?它们区别是什么⭐8、标签上title与a......
  • 多校A层冲刺NOIP2024模拟赛05
    咋是计数专场啊,讨厌计数!就会一个签到题,恼了。rank21,T1100pts,T20pts,T320pts,T40ptsdp设计状态不行。T3典型的背包没看出来,T2简单dp不会设计状态。有一些套路还是要学好数(number)签到题。假设一个数\(a_i\)是好数,那么一定有\(a_i=a_x+a_y+a_z(x\ley\lez)\)用一个b......
  • 多校A层冲刺NOIP2024模拟赛05
    多校A层冲刺NOIP2024模拟赛05\(T1\)A.好数(number)\(100pts/100pts\)枚举两数之和,开个桶维护即可。点击查看代码inta[5010];unordered_map<int,bool>s;intmain(){ freopen("number.in","r",stdin); freopen("number.out","w",stdout)......
  • 多校 A 层冲刺 NOIP2024 模拟赛 05
    多校A层冲刺NOIP2024模拟赛05T1好数(number)签到题首先\(O(nV)\)的背包暴力是显然的,注意到本题只需要合法性,状态只有\(0/1\),上\(bitset\)优化转移即可。时间复杂度\(O(\frac{nV}{w})\)。T2SOS字符串(sos)签到题计数题难点在不重不漏,而本题则主要是不重。考虑一种好的......
  • 20222418 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容本周课程内容为缓冲区溢出和shellcode:2.实验过程(1)直接修改程序机器指令,改变程序执行流程①首先根据网上教程安装好kali虚拟机,更改主机名为heshan;下载目标文件pwn1,将pwn1文件放入共享文件夹并在VMware中设置共享以便使用,并将其重命名为pwn20222418。②然后运行可......
  • ABC292G Count Strictly Increasing Sequences [区间DP]
    Description你有\(n\)个数,每个数长度为\(m\)。不过这\(n\)个数中,可能有某些位不确定,需要你在每个?位置上\(0\)到\(9\)之间填一个数。设你填出来的序列是\(\{S_i\}\)。请你求出,在所有可能的填数方案中,有多少种满足\(S_1<S_2<\dots<S_n\)?对\(998244353\)取......
  • 2025年软考考试+报名时间安排!这份日历请收好!
    软考(计算机技术与软件专业技术资格(水平)考试)是纳入全国专业技术人员职业资格证书制度统一规划,实行大纲、试题、标准、证书均统一的考试办法。2024年软考报名已经结束,想要报考的同学请提前备考2025年的考试,那2025年软考考几次?考试是什么时候呢?2025年软考考试时间:软考考试时......
  • EI稳定检索|7天录用|第四届智能电力与系统国际学术会议(ICIPS 2024)
    电力学科品牌IEEE会议,往届均已EI检索!“推动新质生产力加快发展,培育新能源新兴产业,实现电力行业新跨越”高端主题研讨会暨第四届智能电力与系统国际学术会议(ICIPS2024)【往届见刊后1个月完成EI检索】*澳大利亚会场(11月1-3日)地点:珀斯|澳大利亚|MurdochUniversity  ......
  • 20222302 2024-2025-1 《网络与系统攻防技术》实验一实验报告
    1.实验内容本周学习内容1.熟练掌握了栈和堆的概念。2.掌握了Linux的基本操作,如shell命令和编译器gcc、调试器gdb的使用。3.掌握了缓冲区溢出的原理。实验任务本次实验的对象是一个名为pwn1的linux可执行文件。该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何......