深度学习100例 |
您所在的位置:网站首页 › 今天的股票预测 › 深度学习100例 |
🔗 运行环境: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内部有较为复杂的结构。能通过门控状态来选择调整传输的信息,记住需要长时间记忆的信息,忘记不重要的信息,其结构如下: 如果使用的是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.006005192426 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()拟合度除了更换模型外,还可以通过调整参数来提高,这里主要是介绍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 |