LSMT 实战-python
长短期记忆网络(LSTM,Long Short-Term Memory)
使用kears 搭建一个LSTM预测模型,使用2022年美国大学生数学建模大赛中C题中处理后的BTC比特币的数据进行数据训练和预测。
这篇博客包含两个预测,一种是使用前N天的数据预测后一天的数据,一种使用前N天的数据预测后N天的数据
第一种:使用前个三十天数据进行预测后一天的数据。
总数据集:1826个数据
数据下载地址:需要的可以自行下载,很快
- 链接:https://pan.baidu.com/s/1TmQxLfzHiyOL3vEVcuWlgQ
- 提取码:wy0f
模型结构
Model: "sequential"
_________________________________________________________________
Layer (type) Output Shape Param #
=================================================================
lstm (LSTM) (None, 30, 64) 16896
_________________________________________________________________
lstm_1 (LSTM) (None, 30, 128) 98816
_________________________________________________________________
lstm_2 (LSTM) (None, 32) 20608
_________________________________________________________________
dropout (Dropout) (None, 32) 0
_________________________________________________________________
dense (Dense) (None, 1) 33
=================================================================
Total params: 136,353
Trainable params: 136,353
Non-trainable params: 0
_________________________________________________________________
训练100次:
损失函数图像:
预测和真实值比较,可以看到效果并不是很好,这个需要自己调参进行变化
- 我的GPU加速时1650还挺快,7.5算力,训练时间可以接受
代码:
# 调用库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.preprocessing import MinMaxScaler
#### 数据处理部分 ####
# 读入数据
data = pd.read_excel('BTCtest.xlsx')
# 时间戳长度
time_step = 30 # 输入序列长度
print(len(data))
# 划分训练集与验证集
data = data[['Value']]
train = data[0:1277]
valid = data[1278:1550]
test = data[1551:]
# 归一化
scaler = MinMaxScaler(feature_range=(0, 1))
# datas 切片数据 time_step要输入的维度 pred 预测维度
def scalerClass(datas,scaler,time_step,pred):
x, y = [], []
scaled_data = scaler.fit_transform(datas)
for i in range(time_step, len(datas) - pred):
x.append(scaled_data[i - time_step:i])
y.append(scaled_data[i: i + pred])
# 把x_train转变为array数组
x, y = np.array(x), np.array(y).reshape(-1, 1) # reshape(-1,5)的意思时不知道分成多少行,但是是五列
return x,y
# 训练集 验证集 测试集 切片
x_train,y_train = scalerClass(train,scaler,time_step=time_step,pred=1)
x_valid, y_valid = scalerClass(valid,scaler,time_step=time_step,pred=1)
x_test, y_test = scalerClass(test,scaler,time_step=time_step,pred=1)
#### 建立神经网络模型 ####
model = keras.Sequential()
model.add(layers.LSTM(64, return_sequences=True, input_shape=(x_train.shape[1:])))
model.add(layers.LSTM(128, return_sequences=True))
model.add(layers.LSTM(32))
model.add(layers.Dropout(0.3))
model.add(layers.Dense(1))
# model.compile(optimizer = 优化器,loss = 损失函数, metrics = ["准确率”])
# “adam" 或者 tf.keras.optimizers.Adam(lr = 学习率,decay = 学习率衰减率)
# ”mse" 或者 tf.keras.losses.MeanSquaredError()
model.compile(optimizer=keras.optimizers.Adam(), loss='mse',metrics=['accuracy'])
# monitor:要监测的数量。
# factor:学习速率降低的因素。new_lr = lr * factor
# patience:没有提升的epoch数,之后学习率将降低。
# verbose:int。0:安静,1:更新消息。
# mode:{auto,min,max}之一。在min模式下,当监测量停止下降时,lr将减少;在max模式下,当监测数量停止增加时,它将减少;在auto模式下,从监测数量的名称自动推断方向。
# min_delta:对于测量新的最优化的阀值,仅关注重大变化。
# cooldown:在学习速率被降低之后,重新恢复正常操作之前等待的epoch数量。
# min_lr:学习率的下限
learning_rate= keras.callbacks.ReduceLROnPlateau(monitor='val_loss', patience=3, factor=0.7, min_lr=0.00000001)
#显示模型结构
model.summary()
# 训练模型
history = model.fit(x_train, y_train,
batch_size = 128,
epochs=100,
validation_data=(x_valid, y_valid),
callbacks=[learning_rate])
# loss变化趋势可视化
plt.title('LSTM loss figure')
plt.plot(history.history['loss'],label='training loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.legend(loc='upper right')
plt.show()
#### 预测结果分析&可视化 ####
# 输入测试数据,输出预测结果
y_pred = model.predict(x_test)
# 输入数据和标签,输出损失和精确度
model.evaluate(x_test)
scaler.fit_transform(pd.DataFrame(valid['Value'].values))
# 反归一化
y_pred = scaler.inverse_transform(y_pred.reshape(-1,1)[:,0].reshape(1,-1)) #只取第一列
y_test = scaler.inverse_transform(y_test.reshape(-1,1)[:,0].reshape(1,-1))
# 预测效果可视化
plt.figure(figsize=(16, 8))
plt.title('Predicted and real')
dict = {
'Predictions': y_pred[0],
'Value': y_test[0]
}
data_pd = pd.DataFrame(dict)
plt.plot(data_pd[['Value']],linewidth=3,alpha=0.8)
plt.plot(data_pd[['Predictions']],linewidth=1.2)
#plt.savefig('lstm.png', dpi=600)
plt.show()
预测后几天的数据和预测后一天原理是一样的
- 因为预测的是5天的数据所以不能使用图像显示出来,只能取出预测五天的头一天的数据进行绘图。数据结构可以打印出来的,我没有反归一化,需要的时候再弄把
- 前五十天预测五天的代码:
# 调用库
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.preprocessing import MinMaxScaler
# 读入数据
data = pd.read_excel('BTCtest.xlsx')
time_step = 50 # 输入序列长度
# 划分训练集与验证集
data = data[['Value']]
train = data[0:1277] #70%
valid = data[1278:1550] #15%
test = data[1551:] #15%
# 归一化
scaler = MinMaxScaler(feature_range=(0, 1))
# 定义一个切片函数
# datas 切片数据 time_step要输入的维度 pred 预测维度
def scalerClass(datas,scaler,time_step,pred):
x, y = [], []
scaled_data = scaler.fit_transform(datas)
for i in range(time_step, len(datas) - pred):
x.append(scaled_data[i - time_step:i])
y.append(scaled_data[i: i + pred])
# 把x_train转变为array数组
x, y = np.array(x), np.array(y).reshape(-1, 5) # reshape(-1,5)的意思时不知道分成多少行,但是是五列
return x,y
# 训练集 验证集 测试集 切片
x_train,y_train = scalerClass(train,scaler,time_step=time_step,pred=5)
x_valid, y_valid = scalerClass(valid,scaler,time_step=time_step,pred=5)
x_test, y_test = scalerClass(test,scaler,time_step=time_step,pred=5)
# 建立网络模型
model = keras.Sequential()
model.add(layers.LSTM(64, return_sequences=True, input_shape=(x_train.shape[1:])))
model.add(layers.LSTM(64, return_sequences=True))
model.add(layers.LSTM(32))
model.add(layers.Dropout(0.1))
model.add(layers.Dense(5))
model.compile(optimizer=keras.optimizers.Adam(), loss='mse',metrics=['accuracy'])
learning_rate_reduction = keras.callbacks.ReduceLROnPlateau(monitor='val_loss', patience=3, factor=0.7, min_lr=0.000000005)
model.summary()
history = model.fit(x_train, y_train,
batch_size = 128,
epochs=30,
validation_data=(x_valid, y_valid),
callbacks=[learning_rate_reduction])
# loss变化趋势可视化
plt.title('LSTM loss figure')
plt.plot(history.history['loss'],label='training loss')
plt.plot(history.history['val_loss'], label='val loss')
plt.legend(loc='upper right')
plt.show()
#### 预测结果分析&可视化 ####
y_pred = model.predict(x_test)
model.evaluate(x_test)
scaler.fit_transform(pd.DataFrame(valid['Value'].values))
print(y_pred)
print(y_test)
# 预测效果可视化
# 反归一化
y_pred = scaler.inverse_transform(y_pred.reshape(-1,5)[:,0].reshape(1,-1)) #只取第一列
y_test = scaler.inverse_transform(y_test.reshape(-1,5)[:,0].reshape(1,-1))
plt.figure(figsize=(16, 8))
plt.title('Predicted and real')
dict_data = {
'Predictions': y_pred.reshape(1,-1)[0],
'Value': y_test[0]
}
data_pd = pd.DataFrame(dict_data)
plt.plot(data_pd[['Value']],linewidth=3,alpha=0.8)
plt.plot(data_pd[['Predictions']],linewidth=1.2)
plt.savefig('lstm.png', dpi=600)
plt.show()
LSMT 实战-python的更多相关文章
- 《实战Python网络爬虫》- 感想
端午节假期过了,之前一直在做出行准备,后面旅游完又休息了一下,最近才恢复状态. 端午假期最后一天收到一个快递,回去打开,发现是微信抽奖中的一本书,黄永祥的<实战Python网络爬虫>. 去 ...
- 移动端自动化测试Appium 从入门到项目实战Python版☝☝☝
移动端自动化测试Appium 从入门到项目实战Python版 (一个人学习或许会很枯燥,但是寻找更多志同道合的朋友一起,学习将会变得更加有意义✌✌) 说到APP自动化测试,Appium可是说是非常流 ...
- 移动端自动化测试appium 从入门到项目实战Python版✍✍✍
移动端自动化测试appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课程 ...
- 移动端自动化测试Appium 从入门到项目实战Python版
移动端自动化测试Appium 从入门到项目实战Python版 整个课程都看完了,这个课程的分享可以往下看,下面有链接,之前做java开发也做了一些年头,也分享下自己看这个视频的感受,单论单个知识点课 ...
- Django-Multitenant,分布式多租户数据库项目实战(Python/Django+Postgres+Citus)
Python/Django 支持分布式多租户数据库,如 Postgres+Citus. 通过将租户上下文添加到您的查询来实现轻松横向扩展,使数据库(例如 Citus)能够有效地将查询路由到正确的数据库 ...
- 实战Python实现BT种子转化为磁力链接
经常看电影的朋友肯定对BT种子并不陌生,但是BT种子文件相对磁力链来说存储不方便,而且在网站上存放BT文件容易引起版权纠纷,而磁力链相对来说则风险小一些. 将BT种子转换为占用空间更小,分享更方便的磁 ...
- 机器学习实战-python相关软件库的安装
1 安装python 2 安装sublime text2 3 安装NumPy.Matplotlib http://book.51cto.com/art/201401/426522.htm Matplo ...
- NBC朴素贝叶斯分类器 ————机器学习实战 python代码
这里的p(y=1|x)计算基于朴素贝叶斯模型(周志华老师机器学习书上说的p(xi|y=1)=|Dc,xi|/|Dc|) 也可以基于文本分类的事件模型 见http://blog.csdn.net/app ...
- redis实战 -- python知识散记
-- time.time() -- row.to_dict() -- json.dumps(row.to_dict()) #!/usr/bin/env python import time def s ...
随机推荐
- 【记录一个问题】android下opencl中的event.getProfilingInfo()测速时间并不准确
使用了类似的代码来做android下opencl的时间测试: cl::CommandQueue queue(context, devices[0], CL_QUEUE_PROFILING_ENABLE ...
- cesium 3dtiles模型单体化点击高亮效果
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. c ...
- 学习鸟哥私房菜--linux bash 的环境变量ps1设置
bash里边的变量ps1是用户平时的提示符,系统默认为[username@host 工作目录]$.关于ps1的相关介绍详见:http://www.cnblogs.com/starspace/archi ...
- Vulnhub DC-1靶场学习笔记
0x00 环境准备 本文介绍了Vulnhub中DC-1靶机的实战渗透过程,实战的目标是获取到服务器中的5个flag,最终目标是获取到root目录下的thefinalflag文件: 测试环境 备注 Ka ...
- Android安卓开发一环境配置
安卓项目开发 我采用的安卓开发软件是IDEA,IDEA功能强大,具有集成的安卓开发环境. 安卓开发的首要任务是在IDEA配置安卓开发环境 第一步新建一个安卓项目 按照提示完成操作,首次建立安卓项目它会 ...
- python 裴伯拉切数列
裴伯拉切数列:从第三个元素开始,每个元素为该元素前面的两个元素的和. 裴伯拉切数列:0,1,1,2,3,5,8,13,21,34,55...... 求出小于n的裴伯拉切数列. def fibo(n): ...
- js 二分查找法之每日一更
<!DOCTYPE html> <html> <head> <meta http-equiv="content-type" content ...
- JOISC 2017
Day1 「JOISC 2017 Day 1」开荒者 首先观察部分分发现分档很多,于是考虑一步步思考上来. 首先有一点关键观察(一): 风吹的顺序是无所谓的,令分别往东.西.南.北吹了 \(r, l, ...
- Java Calendar类的使用总结【转】
感谢!原文地址:https://www.cnblogs.com/huangminwen/p/6041168.html Java Calendar类的使用总结 在实际项目当中,我们经常会涉及到对时间的处 ...
- AI模型运维——GPU性能监控NVML和DCGM
最近一年负责运维的GPU主机越来越多,发现现有的监控项无法很好的了解GPU的性能和负载情况,研究了下官方文档,在此记录. 一.NVML和DCGM NVML:https://developer.nvid ...