使用LSTM网络做预报(Forecast)

在一次小小的比赛中需要做趋势预测,当时找了很多种方法,最后也对LSTM的使用做出一定的研究,现在大多数能找到的都是Predict,对于Forecast的做法虽然找到了原理,但由于各种原因自己未能很好写出。最后是完成了,这里也做一个小小的记录。

LSTM

完全不想解释,因为只是调包侠,原理还不懂,调参都是手动调的,很离谱。

代码

导入基础模块,preprocessing用作数据归一化预处理

# 导入模块
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
from keras.models import Sequential, load_model
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler

下面对疫情数据进行读取,疫情数据分为三列,分别为Date、Confirmed、New,因为只做一维数据,所以先drop掉Date和New,并且将剩下的Confirmed列用values的方式读取出来。

# 读取数据
dataframe = pd.read_csv('./datalab/62612/中国疫情.csv')
dataframe = dataframe.drop(columns=['Date'])
dataframe = dataframe.drop(columns=['New'])
dataset = dataframe.values

为了做归一化,将int转化为float,随后进行归一化处理

dataset = dataset.astype('float32')
#归一化
scaler = MinMaxScaler(feature_range=(0, 1))
dataset = scaler.fit_transform(dataset)

分割

#分割训练集与测试集
train_size = int(len(dataset)*0.80)
test_size = len(dataset)-train_size
train,test = dataset[0:train_size,:],dataset[train_size:,:]

下面就是Forecast的核心。因为LSTM适用于给出下一刻数据,那么我们就采取时间滑窗的方式,将预测出的下一刻数据加入到数据集中,在进行下一刻预测。其中,create_dataset是LSTM建立数据集的核心,而create_predict是建立滑窗。
look_back也是timesteps,它代表着LSTM的映射关系,例如1就代表着1个X预测1个Y,3就代表3个X预测1个Y,在数据量小时,可以适当调整

#滑窗,建立数据集
def create_dataset(dataset,look_back):dataX,dataY = [],[]for i in range(len(dataset)-look_back-1):a = dataset[i:(i+look_back),0]dataX.append(a)dataY.append(dataset[i+look_back,0])return np.array(dataX),np.array(dataY)def create_predict(dataset,look_back):dataX = []for i in range(len(dataset)-look_back):a = dataset[i+1:,0]dataX.append(a)return np.array(dataX)
look_back = 1trainX,trainY = create_dataset(train,look_back)
testX,testY = create_dataset(test,look_back)

对训练集与测试集进行转换,因为keras需要。

#转换数据
trainX = np.reshape(trainX,(trainX.shape[0],1,trainX.shape[1]))
testX = np.reshape(testX,(testX.shape[0],1,testX.shape[1]))

初始化LSTM模型,注意input_shape,它决定了投进模型的数据维度,所以设置为look_back与前面设置的映射关系相符合。

model = Sequential()
model.add(LSTM(4, input_shape=(None,look_back)))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(trainX, trainY, epochs=100, batch_size=8, verbose=False)

Predict

#预测
trainPredict = model.predict(trainX)
testPredict  = model.predict(testX)#反归一化
trainPredict = scaler.inverse_transform(trainPredict)
testPredict  = scaler.inverse_transform(testPredict)

Forecast的又一个核心,运用了栈的原理,将Predict的值压入dataset中。
此处尤其注意,这几个操作所需的数据格式不一样,也是我试过很多次试出来的。append无法对array变量作用(或者是ndarray,我也忘了),所以要先将其变成List,同时,predict出的值自带中括号(我也不知道是什么数据类型),所以需要将其扁平化(一顿瞎编,我也不懂)(这一部分尤其重要,很多时候就停滞在此了)

predict_series = []
for i in range(30):p = dataset[-(look_back + 1):]p1 = create_predict(p, look_back)p2 = np.reshape(p1, (p1.shape[0], 1, p1.shape[1]))predict = model.predict(p2)dataset = np.vstack((dataset,predict))predict = scaler.inverse_transform(predict)predict=predict.flatten()predict = predict.tolist()   predict_series.append(predict)print(predict_series)

此部分为画图做准备,重新读取数据,并且设定出forecast的范围,因为往后预测了30步,所以此处设置为+1~+31

dataframe = pd.read_csv('./datalab/62612/中国疫情.csv')
future=np.arange(dataframe['Date'].shape[0]+1,dataframe['Date'].shape[0]+31,1)
plt.figure(figsize=(12, 8))plt.plot(trainPredict)
plt.plot(testPredict)
plt.plot(future,predict_series)dataframe = pd.read_csv('./datalab/62612/中国疫情.csv')
dataframe = dataframe.drop(columns=['Date'])
dataframe = dataframe.drop(columns=['New'])
dataset = dataframe.values
plt.plot(dataset)plt.xlabel('天数')
plt.ylabel('感染人群数目')plt.legend(['trainPredict','testPredict','forecast','data'], loc='best')
plt.show

Finished!
此文章自己观看,单纯当胡编就行了。

使用LSTM网络做预报(Forecast)相关推荐

  1. sklearn中lstm_利用LSTM网络进行预测,使用,做,预报,Forecast

    使用LSTM网络做预报(Forecast) 在一次小小的比赛中需要做趋势预测,当时找了很多种方法,最后也对LSTM的使用做出一定的研究,现在大多数能找到的都是Predict,对于Forecast的做法 ...

  2. sklearn中lstm_深度学习之路(一):用LSTM网络做时间序列数据预测

    简介 问题:有一组1维数据,可能是某商品的销售量,可能是股票的价格等,用深度学习模型来解决对该数据的预测问题,比如用前50个数据,来预测下一个数据. 首先,给出数据集: 前10行数据.png 接下来, ...

  3. 深度学习神经网络实践:基于LSTM的电离层预报

    目录 1 引言 2 环境配置 3 数据和方法 4 网络结构和一些公式 LSTM内部结构 用于预报的网络 4 训练代码 5 小结 1 引言 在本科的毕业设计中,我的题目就是基于深度学习的电离层预报,在初 ...

  4. 从任务到可视化,如何理解LSTM网络中的神经元 By 机器之心2017年7月03日 14:29 对人类而言,转写是一件相对容易并且可解释的任务,所以它比较适合用来解释神经网络做了哪些事情,以及神经网

    从任务到可视化,如何理解LSTM网络中的神经元 By 机器之心2017年7月03日 14:29 对人类而言,转写是一件相对容易并且可解释的任务,所以它比较适合用来解释神经网络做了哪些事情,以及神经网络 ...

  5. 用lstm模型做预测_使用LSTM深度学习模型进行温度的时间序列单步和多步预测

    本文的目的是提供代码示例,并解释使用python和TensorFlow建模时间序列数据的思路. 本文展示了如何进行多步预测并在模型中使用多个特征. 本文的简单版本是,使用过去48小时的数据和对未来1小 ...

  6. 教你用深度学习LSTM网络预测流行音乐趋势(附代码)

    来源:大数据挖掘DT数据分析 本文长度为1500字,建议阅读5分钟 本文为你介绍LSTM网络原理及其在流行音乐趋势预测赛题中的应用. 后台回复关键词"音乐",下载完整代码及数据集 ...

  7. 手把手教你使用 1D 卷积和 LSTM 混合模型做 EEG 信号识别

    本文是由CSDN用户[Memory逆光]授权分享.主要介绍了使用 1D 卷积和 LSTM 混合模型做 EEG 信号识别.感谢Memory逆光! 内容包括:1. 数据集(1.1 数据集下载.1.2 数据 ...

  8. (译)理解 LSTM 网络 (Understanding LSTM Networks by colah)

    前言:其实之前就已经用过 LSTM 了,是在深度学习框架 keras 上直接用的,但是到现在对LSTM详细的网络结构还是不了解,心里牵挂着难受呀!今天看了 tensorflow 文档上面推荐的这篇博文 ...

  9. TF之LSTM:基于Tensorflow框架采用PTB数据集建立LSTM网络的自然语言建模

    TF之LSTM:基于Tensorflow框架采用PTB数据集建立LSTM网络的自然语言建模 目录 关于PTB数据集 代码实现 关于PTB数据集 PTB (Penn Treebank Dataset)文 ...

最新文章

  1. RFID中间件成为全球软件产业争夺新焦点
  2. [转]ExtJS Grid 分页时保持选中的简单实现方法
  3. 面试必会:HashMap 实现原理解读
  4. [安全攻防进阶篇] 六.逆向分析之OllyDbg逆向CrackMe01-02及加壳判断
  5. poj 3710——Christmas Game
  6. Android png模拟svg,Android 中使用svg图片
  7. list中去除连续重复的值并保留头尾2个和头尾2个值在原list中的索引
  8. Linux服务器下LNMP安装与配置方法
  9. CDH页面中Oozie的调度告警邮箱设置
  10. Windows 7 安装VS2008 SP1 失败
  11. ViewPager轮播图自动无限循环滑动,手指按住停止滑动
  12. Ramda 函数库参考教程
  13. 2008年9月23号,星期二,晴。博观而约取,厚积而薄发。(苏轼)
  14. 51nod 1429 巧克力
  15. 任务宿主阻止关机解决方案
  16. 使用conda时出现Solving environment: failed with initial frozen solve. Retrying with flexible solve错误
  17. muParser公式库使用简介( 转)
  18. 海康威视视频ocx控件开发总结
  19. flutter 人脸识别_使用flutter和tensorflow lite进行人脸识别认证
  20. PHP如何获取网页源码?

热门文章

  1. You don't have permission to access / on this server. ---解决方法
  2. 谷歌乳腺癌Detecting Cancer Metastases on Gigapixel Pathology Images
  3. 学画画软件app推荐_有什么好用的绘画app?
  4. WGCNA模块与性状展示图
  5. 拉卡拉支付日常使用小技巧,这些你都知道吗?
  6. android动态平分屏幕,Android开发RecyclerView的item平分屏幕
  7. [虚幻4] 手雷抛物线预测(c++代码实现)
  8. 异业联盟与联盟卡结合——商家实现共享资源,用户享受消费优惠
  9. java 获取json的值_Java如何获取JSON数据中的值
  10. 一天掌握Python基础,一篇文章就够了 #全教程 #无遗漏 #知识点 #小项目