- 本文为🔗365天深度学习训练营 中的学习记录博客
- 参考文章地址: 🔗深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天
活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
**
1,机缘
A,股票价格预测项目中的经验分享
B,平时学习过程中的经验记录
C,通过股票价格预测与相关作者进行技术交流
2,收获
A,获得了10粉丝的关注
B,获得了20正向的赞、阅读量等
C,认识了学习RNN的技术同行
3,日常
- 创作已经是我学习的一部分了
- 有限的时间下,周二、周四、周六进行创作,其余时间学习
4,憧憬
创作规划是学习RNN原理,使用RNN模型模拟股票价格输出
**
**
1,学习目标
掌握 RNN入门知识
2,学习内容
A,掌握误差估计方法
B,学习RNN基本原理
C,划分数据集
3,学习时间
周一至周五晚上 7 点—晚上9点
周六下午 6 点-下午 9 点
周日下午 6 点-下午 9 点
4,学习产出
技术笔记 10 篇
CSDN技术博客 3 篇
学习的vlog 视频 1 个
**
**
1,学习知识点
RNN的结构,模型构建方法
2,学习遇到的问题
数据集的划分、模型的设计
3,学习的收获
学会了RNN模型的构建
4,实操
import os,math
from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
from sklearn.preprocessing import MinMaxScaler
from sklearn import metrics
import numpy as np
import pandas as pd
import tensorflow as tf
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei'] # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False # 用来正常显示负号
data = pd.read_csv('D:/BaiduNetdiskDownload/SH600519.csv') # 读取股票文件
#print(data)
#取出第三列
training_set = data.iloc[0:2426 - 300, 2:3].values
test_set = data.iloc[2426 - 300:, 2:3].values
#归一化
sc= MinMaxScaler(feature_range=(0, 1))
training_set = sc.fit_transform(training_set)
test_set= sc.transform(test_set)
#设置测试集、训练集
x_train = []
y_train = []
x_test = []
y_test = []
"""
使用前60天的开盘价作为输入特征x_train
第61天的开盘价作为输入标签y_train
for循环共构建2426-300-60=2066组训练数据。
共构建300-60=260组测试数据
"""
for i in range(60, len(training_set)):
x_train.append(training_set[i - 60:i, 0])
y_train.append(training_set[i, 0])
for i in range(60, len(test_set)):
x_test.append(test_set[i - 60:i, 0])
y_test.append(test_set[i, 0])
# 对训练集进行打乱
np.random.seed(7)
np.random.shuffle(x_train)
np.random.seed(7)
np.random.shuffle(y_train)
tf.random.set_seed(7)
#将训练数据调整为数组(array)
x_train, y_train = np.array(x_train), np.array(y_train)
x_test, y_test = np.array(x_test), np.array(y_test)
x_train = np.reshape(x_train, (x_train.shape[0], 60, 1))
x_test = np.reshape(x_test, (x_test.shape[0], 60, 1))
model = tf.keras.Sequential([
SimpleRNN(100, return_sequences=True), #布尔值。是返回输出序列中的最后一个输出,还是全部序列。
Dropout(0.1), #防止过拟合
SimpleRNN(100),
Dropout(0.1),
Dense(1)
])
# 该应用只观测loss数值,不观测准确率,所以删去metrics选项,一会在每个epoch迭代显示时只显示loss值
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
loss='mean_squared_error') # 损失函数用均方误差
history = model.fit(x_train, y_train,
batch_size=64,
epochs=20,
validation_data=(x_test, y_test),
validation_freq=1) #测试的epoch间隔数
model.summary()
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()
##预测
predicted_stock_price = model.predict(x_test) # 测试集输入模型进行预测
predicted_stock_price = sc.inverse_transform(predicted_stock_price) # 对预测数据还原---从(0,1)反归一化到原始范围
real_stock_price = sc.inverse_transform(test_set[60:]) # 对真实数据还原---从(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()
#评估
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)
输出:
均方误差: 2832.55388
均方根误差: 53.22174
平均绝对误差: 46.33845
R2: 0.59098
分析:可以看出训练集和测试集差别较小,没有产生过拟合。使用该模型预测准确率也较吻合。产生的误差较小。