?活动地址:CSDN21天学习挑战赛?
文章图片
前言 1.什么是循环神经网络?
一个最简单的循环神经网络如下图所示:这样的神经网络一共有3层,分别是输入层x,隐藏层h和输出层y。定义每一层的节点下标如下:k表示的是输出层的节点下标,j表示的是当前时间节点隐藏层的节点下标,l表示的是上一时间节点隐藏层的节点下标,i表示的是输入层的节点下标。
文章图片
2.回归评价指标
MSE:均方误差----->预测值减真实值求平方后求均值
文章图片
RMSE :均方根误差----->对均方误差开方
平方根误差(RMSE),其又被称为RMSD(root mean square deviation),是回归模型中最常用的评价指标。
文章图片
MAE:平均绝对误差----->预测值减真实值求绝对值后求均值
文章图片
R2:决定系数,可以简单理解为反映模型拟合优度的重要的统计量
文章图片
其中的参数解释:
-
文章图片
是第i个样本的真实值 -
文章图片
?是第i个样本的预测值 - m是样本的个数
import os,math
from tensorflow.keras.layers import Dropout, Dense, SimpleRNN
from sklearn.preprocessingimport MinMaxScaler
from sklearn import metrics
import numpyas np
import pandasas pd
import tensorflowas tf
import matplotlib.pyplot as plt
# 支持中文
plt.rcParams['font.sans-serif'] = ['SimHei']# 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False# 用来正常显示负号
查看一下数据集
data = https://www.it610.com/article/pd.read_csv('./SH600519.csv')# 读取股票文件
data
Unnamed: o | date | open | close | high | low | volume | code | |
0 | 74 | 2010-04-26 | 88.702 | 87.381 | 89.072 | 87.362 | 107036.13 | 600519 |
1 | 75 | 2010-O4-27 | 87.355 | 84.841 | 87.355 | 84.681 | 58234.48 | 600519 |
2 | 76 | 2010-04-28 | 84.235 | 84.318 | 85.128 | 83.597 | 26287.43 | 600519 |
3 | 77 | 2010-04-29 | 84.592 | 85.671 | 86.315 | 84.592 | 34501.2 | 600519 |
4 | 78 | 2010-04-30 | 83.871 | 82.34 | 83.871 | 81.523 | 85566.7 | 600519 |
… | … | … | … | … | … | … | … | … |
2421 | 2495 | 2020-04-20 | 1221 | 1227.3 | 1231.5 | 1216.8 | 24239 | 600519 |
2422 | 2496 | 2020-04-21 | 1221.02 | 1200 | 1223.99 | 1193 | 29224 | 600519 |
2423 | 2497 | 2020-04-22 | 1206 | 1244.5 | 1249.5 | 1202.22 | 44035 | 600519 |
2424 | 2498 | 2020-04-23 | 1250 | 1252.26 | 1265.68 | 1247.77 | 26899 | 600519 |
2425 | 2499 | 2020-04-24 | 1248 | 1250.56 | 1259.89 | 1235.18 | 19122 | 600519 |
"""
前(2426-300=2126)天的开盘价作为训练集,表格从0开始计数,2:3 是提取[2:3)列,前闭后开,故提取出C列开盘价
后300天的开盘价作为测试集
"""
training_set = data.iloc[0:2426 - 300, 2:3].values
test_set = data.iloc[2426 - 300:, 2:3].values
二、数据预处理 1.归一化
sc = MinMaxScaler(feature_range=(0, 1))
training_set = sc.fit_transform(training_set)
test_set = sc.transform(test_set)
2.设置测试集训练集
x_train = []
y_train = []x_test = []
y_test = []"""
使用前60天的开盘价作为输入特征x_train
第61天的开盘价作为输入标签y_trainfor循环共构建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:(2066, 60, 1)
y_train:(2066,)
x_test :(240, 60, 1)
y_test :(240,)
"""
x_train, y_train = np.array(x_train), np.array(y_train) # x_train形状为:(2066, 60, 1)
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=https://www.it610.com/article/(x_test, y_test),
validation_freq=1)#测试的epoch间隔数model.summary()
文章图片
八、结果可视化 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')
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(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()
文章图片
3.模型评估
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.56694
均方根误差: 53.22187
平均绝对误差: 46.33857
R2: 0.59098
参考资料:
【深度学习|循环神经网络(RNN)实现股票预测】>- 本文为[365天深度学习训练营](https://mp.weixin.qq.com/s/k-vYaC8l7uxX51WoypLkTw) 中的学习记录博客
>- 参考文章地址: [深度学习100例-循环神经网络(RNN)实现股票预测 | 第9天](https://mtyjkh.blog.csdn.net/article/details/117752046)
推荐阅读
- 神经网络|神经网络方法研究及应用,神经网络算法简单例子
- 深度学习|神经网络讲解与实例,如何理解神经网络
- 深度学习|迁移学习 & 凯明初始化
- opencv|最近opencv又报了啥错(一)
- yolov5|跑yolov5又出啥问题了(1)p,r,map全部为0
- opencv|基于opencv的实时睡意检测系统
- opencv|基于opencv的实时停车地点查找
- 大数据|滴滴开源了哪些有意思的项目()
- 数据库|滴滴技术牛逼吗(看它开源了哪些有意思的项目)