深度学习100例

您所在的位置:网站首页 今天的股票预测 深度学习100例

深度学习100例

2024-07-14 03:26| 来源: 网络整理| 查看: 265

🔗 运行环境:python3🚩 作者:K同学啊🥇 精选专栏:《深度学习100例》🔥 选自专栏:《新手入门深度学习》📚 推荐专栏:《Matplotlib教程》🧿 优秀专栏:《Python入门100题》

文章目录 一、前言二、LSTM的是什么三、准备工作1.设置GPU2.设置相关参数3.加载数据 四、数据预处理1.归一化2.时间戳函数 五、构建模型六、激活模型七、训练模型八、结果可视化1.绘制loss图2.预测3.评估

一、前言

今天是第10天,我们将使用LSTM完成股票开盘价格的预测,最后的R2可达到0.74,相对传统的RNN的0.72提高了两个百分点。

我的环境:

语言环境:Python3.6.5编译器:jupyter notebook深度学习环境:TensorFlow2.4.1

来自专栏:【深度学习100例】

往期精彩内容:

深度学习100例-卷积神经网络(LeNet-5)深度学习里的“Hello Word” | 第22天深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天深度学习100例-卷积神经网络(CNN)服装图像分类 | 第3天深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天深度学习100例-卷积神经网络(CNN)天气识别 | 第5天深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天深度学习100例-卷积神经网络(ResNet-50)鸟类识别 | 第8天深度学习100例-循环神经网络(RNN)股票预测 | 第9天

如果你还是一名小白,可以看看我这个专门为你写的专栏:《小白入门深度学习》,帮助零基础的你入门深度学习。

二、LSTM的是什么

神经网络程序的基本流程 在这里插入图片描述

一句话介绍LSTM,它是RNN的进阶版,如果说RNN的最大限度是理解一句话,那么LSTM的最大限度则是理解一段话,详细介绍如下:

LSTM,全称为长短期记忆网络(Long Short Term Memory networks),是一种特殊的RNN,能够学习到长期依赖关系。LSTM由Hochreiter & Schmidhuber (1997)提出,许多研究者进行了一系列的工作对其改进并使之发扬光大。LSTM在许多问题上效果非常好,现在被广泛使用。

所有的循环神经网络都有着重复的神经网络模块形成链的形式。在普通的RNN中,重复模块结构非常简单,其结构如下:

在这里插入图片描述

LSTM避免了长期依赖的问题。可以记住长期信息!LSTM内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下:

在这里插入图片描述

三、准备工作 1.设置GPU

如果使用的是CPU可以注释掉这部分的代码。

import tensorflow as tf gpus = tf.config.list_physical_devices("GPU") if gpus: tf.config.experimental.set_memory_growth(gpus[0], True) #设置GPU显存用量按需使用 tf.config.set_visible_devices([gpus[0]],"GPU") 2.设置相关参数 import pandas as pd import tensorflow as tf import numpy as np import matplotlib.pyplot as plt # 支持中文 plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签 plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号 from numpy import array from sklearn import metrics from sklearn.preprocessing import MinMaxScaler from keras.models import Sequential from keras.layers import Dense,LSTM,Bidirectional # 确保结果尽可能重现 from numpy.random import seed seed(1) tf.random.set_seed(1) # 设置相关参数 n_timestamp = 40 # 时间戳 n_epochs = 20 # 训练轮数 # ==================================== # 选择模型: # 1: 单层 LSTM # 2: 多层 LSTM # 3: 双向 LSTM # ==================================== model_type = 1 3.加载数据 data = pd.read_csv('./datasets/SH600519.csv') # 读取股票文件 data Unnamed: 0dateopenclosehighlowvolumecode0742010-04-2688.70287.38189.07287.362107036.136005191752010-04-2787.35584.84187.35584.68158234.486005192762010-04-2884.23584.31885.12883.59726287.436005193772010-04-2984.59285.67186.31584.59234501.206005194782010-04-3083.87182.34083.87181.52385566.70600519...........................242124952020-04-201221.0001227.3001231.5001216.80024239.00600519242224962020-04-211221.0201200.0001223.9901193.00029224.00600519242324972020-04-221206.0001244.5001249.5001202.22044035.00600519242424982020-04-231250.0001252.2601265.6801247.77026899.00600519242524992020-04-241248.0001250.5601259.8901235.18019122.00600519

2426 rows × 8 columns

""" 前(2426-300=2126)天的开盘价作为训练集,后300天的开盘价作为测试集 """ training_set = data.iloc[0:2426 - 300, 2:3].values test_set = data.iloc[2426 - 300:, 2:3].values 四、数据预处理 1.归一化 #将数据归一化,范围是0到1 sc = MinMaxScaler(feature_range=(0, 1)) training_set_scaled = sc.fit_transform(training_set) testing_set_scaled = sc.transform(test_set) 2.时间戳函数 # 取前 n_timestamp 天的数据为 X;n_timestamp+1天数据为 Y。 def data_split(sequence, n_timestamp): X = [] y = [] for i in range(len(sequence)): end_ix = i + n_timestamp if end_ix > len(sequence)-1: break seq_x, seq_y = sequence[i:end_ix], sequence[end_ix] X.append(seq_x) y.append(seq_y) return array(X), array(y) X_train, y_train = data_split(training_set_scaled, n_timestamp) X_train = X_train.reshape(X_train.shape[0], X_train.shape[1], 1) X_test, y_test = data_split(testing_set_scaled, n_timestamp) X_test = X_test.reshape(X_test.shape[0], X_test.shape[1], 1) 五、构建模型 # 建构 LSTM模型 if model_type == 1: # 单层 LSTM model = Sequential() model.add(LSTM(units=50, activation='relu', input_shape=(X_train.shape[1], 1))) model.add(Dense(units=1)) if model_type == 2: # 多层 LSTM model = Sequential() model.add(LSTM(units=50, activation='relu', return_sequences=True, input_shape=(X_train.shape[1], 1))) model.add(LSTM(units=50, activation='relu')) model.add(Dense(1)) if model_type == 3: # 双向 LSTM model = Sequential() model.add(Bidirectional(LSTM(50, activation='relu'), input_shape=(X_train.shape[1], 1))) model.add(Dense(1)) model.summary() # 输出模型结构 WARNING:tensorflow:Layer lstm will not use cuDNN kernel since it doesn't meet the cuDNN kernel criteria. It will use generic GPU kernel as fallback when running on GPU Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm (LSTM) (None, 50) 10400 _________________________________________________________________ dense (Dense) (None, 1) 51 ================================================================= Total params: 10,451 Trainable params: 10,451 Non-trainable params: 0 _________________________________________________________________ 六、激活模型 # 该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值 model.compile(optimizer=tf.keras.optimizers.Adam(***), loss='mean_squared_error') # 损失函数用均方误差 七、训练模型 history = model.fit(X_train, y_train, batch_size=64, epochs=n_epochs, validation_data=(X_test, y_test), validation_freq=1) #测试的epoch间隔数 model.summary() Epoch 1/20 33/33 [==============================] - 5s 107ms/step - loss: 0.1049 - val_loss: 0.0569 Epoch 2/20 33/33 [==============================] - 3s 86ms/step - loss: 0.0074 - val_loss: 1.1616 Epoch 3/20 33/33 [==============================] - 3s 83ms/step - loss: 0.0012 - val_loss: 0.1408 Epoch 4/20 33/33 [==============================] - 3s 78ms/step - loss: 5.8758e-04 - val_loss: 0.0421 Epoch 5/20 33/33 [==============================] - 3s 84ms/step - loss: 5.3411e-04 - val_loss: 0.0159 Epoch 6/20 33/33 [==============================] - 3s 81ms/step - loss: 3.9690e-04 - val_loss: 0.0034 Epoch 7/20 33/33 [==============================] - 3s 84ms/step - loss: 4.3521e-04 - val_loss: 0.0032 Epoch 8/20 33/33 [==============================] - 3s 85ms/step - loss: 3.8233e-04 - val_loss: 0.0059 Epoch 9/20 33/33 [==============================] - 3s 81ms/step - loss: 3.6539e-04 - val_loss: 0.0082 Epoch 10/20 33/33 [==============================] - 3s 81ms/step - loss: 3.1790e-04 - val_loss: 0.0141 Epoch 11/20 33/33 [==============================] - 3s 82ms/step - loss: 3.5332e-04 - val_loss: 0.0166 Epoch 12/20 33/33 [==============================] - 3s 86ms/step - loss: 3.2684e-04 - val_loss: 0.0155 Epoch 13/20 33/33 [==============================] - 3s 80ms/step - loss: 2.6495e-04 - val_loss: 0.0149 Epoch 14/20 33/33 [==============================] - 3s 84ms/step - loss: 3.1398e-04 - val_loss: 0.0172 Epoch 15/20 33/33 [==============================] - 3s 80ms/step - loss: 3.4533e-04 - val_loss: 0.0077 Epoch 16/20 33/33 [==============================] - 3s 81ms/step - loss: 2.9621e-04 - val_loss: 0.0082 Epoch 17/20 33/33 [==============================] - 3s 83ms/step - loss: 2.2228e-04 - val_loss: 0.0092 Epoch 18/20 33/33 [==============================] - 3s 86ms/step - loss: 2.4517e-04 - val_loss: 0.0093 Epoch 19/20 33/33 [==============================] - 3s 86ms/step - loss: 2.7179e-04 - val_loss: 0.0053 Epoch 20/20 33/33 [==============================] - 3s 82ms/step - loss: 2.5923e-04 - val_loss: 0.0054 Model: "sequential" _________________________________________________________________ Layer (type) Output Shape Param # ================================================================= lstm (LSTM) (None, 50) 10400 _________________________________________________________________ dense (Dense) (None, 1) 51 ================================================================= Total params: 10,451 Trainable params: 10,451 Non-trainable params: 0 _________________________________________________________________ 八、结果可视化 1.绘制loss图 plt.plot(history.history['loss'] , label='Training Loss') plt.plot(history.history['val_loss'], label='Validation Loss') plt.title('Training and Validation Loss by K同学啊') plt.legend() plt.show()

在这里插入图片描述

2.预测 predicted_stock_price = model.predict(X_test) # 测试集输入模型进行预测 predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 对预测数据还原---从(0,1)反归一化到原始范围 real_stock_price = sc.inverse_transform(y_test)# 对真实数据还原---从(0,1)反归一化到原始范围 # 画出真实数据和预测数据的对比曲线 plt.plot(real_stock_price, color='red', label='Stock Price') plt.plot(predicted_stock_price, color='blue', label='Predicted Stock Price') plt.title('Stock Price Prediction by K同学啊') plt.xlabel('Time') plt.ylabel('Stock Price') plt.legend() plt.show()

在这里插入图片描述

3.评估 """ MSE :均方误差 -----> 预测值减真实值求平方后求均值 RMSE :均方根误差 -----> 对均方误差开方 MAE :平均绝对误差-----> 预测值减真实值求绝对值后求均值 R2 :决定系数,可以简单理解为反映模型拟合优度的重要的统计量 详细介绍可以参考文章:https://blog.csdn.net/qq_38251616/article/details/107997435 """ MSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price) RMSE = metrics.mean_squared_error(predicted_stock_price, real_stock_price)**0.5 MAE = metrics.mean_absolute_error(predicted_stock_price, real_stock_price) R2 = metrics.r2_score(predicted_stock_price, real_stock_price) print('均方误差: %.5f' % MSE) print('均方根误差: %.5f' % RMSE) print('平均绝对误差: %.5f' % MAE) print('R2: %.5f' % R2) 均方误差: 2688.75170 均方根误差: 51.85317 平均绝对误差: 44.97829 R2: 0.74036

拟合度除了更换模型外,还可以通过调整参数来提高,这里主要是介绍LSTM,就不对调参做详细介绍了。

往期精彩内容:

深度学习100例-卷积神经网络(CNN)实现mnist手写数字识别 | 第1天深度学习100例-卷积神经网络(CNN)服装图像分类 | 第3天深度学习100例-卷积神经网络(CNN)花朵识别 | 第4天深度学习100例-卷积神经网络(CNN)天气识别 | 第5天深度学习100例-卷积神经网络(VGG-16)识别海贼王草帽一伙 | 第6天深度学习100例-卷积神经网络(ResNet-50)鸟类识别 | 第8天深度学习100例-循环神经网络(RNN)股票预测 | 第9天

来自专栏:《深度学习100例》

如果觉得本文对你有帮助记得 点个关注,给个赞,加个收藏

最后再送大家一本,帮助大家拿到 BAT 等一线大厂 offer 的数据结构刷题笔记,是谷歌和阿里的大佬写的,对于算法薄弱或者需要提高的同学都十分受用(提取码:9go2 ):

谷歌和阿里大佬的Leetcode刷题笔记

以及我整理的7K+本开源电子书,总有一本可以帮到你 💖(提取码:4eg0)

7K+本开源电子书



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3