时间序列预测(四)—— LSTM模型

欢迎大家来我的个人博客网站观看原文:https://xkw168.github.io/2019/05/20/时间序列预测-四-LSTM模型.html

文章链接

(一)数据预处理

(二)AR模型(自回归模型)

(三)Xgboost模型

(四)LSTM模型

(五)Prophet模型(自回归模型)


模型原理

  LSTM(Long-short time memory,LSTM)模型,亦即是长段时间模型。LSTM的原理这篇博客讲的十分的清楚,建议英语好的小伙伴直接去看原文,我这里就大致的翻译精简一下。
  人类天生具备的一个能力就是记忆的持久性,可以根据过往经验,从而推断出当前看到的内容的实际含义。如看电影的时候可以通过先前时间去推断后续事件;看一篇文章的时候,同样可以通过过往的知识积累去推断文章中每个词语的含义。而传统的神经网络并没有“持久性”,每一个神经元不能通过前面神经元的结果进行推断,为了解决这一问题科学家提出了递归神经网络(Recurrent Neural Networks,RNN)。RNN是包含循环的神经网络(如图所示),允许信息的持久化。其中A可以看作神经网络的一个缩影,接受某时刻的输入XtX_tXt​然后输出对应的结果hth_tht​,一个回路可以允许信息从一步传递到另一步。

  为了更直观的展示,将回路拆分开来,用一个连续的序列进行表示(如图所示)。一个循环神经网络可以看作是若干个相同的基本单元连接起来,每一个基本单元都可以将信息传递到下一个基本单元。

  常规的RNN存在一个问题就是,无法解决“长期依赖”(long-term dependency)问题,即有用信息和预测点相隔较远。以词语预测为例,“我来自中国,我会讲中文”,这句话里面有用信息与预测点相隔较近,RNN可以很轻易的推断出下一个词语应该是中文,但假如有用信息与预测点相隔较远,如“我来自中国……我会讲中文”,此时RNN便无法推断出接下来的词语。换句话说,RNN的信息持久性不够高,不能保持几十甚至上百步。
  为了弥补传统RNN的这个缺点,人们引入了LSTM(long short-term memory)这个模型。LSTM可以看作是一种特殊的RNN,相较于传统RNN,LSTM天生就对长期依赖有着很好的支持。LSTM模型的核心思想主要有两个,分别为记忆元组(memory cell)和非线性的门单元(nonlinear gating unit),其中记忆元组用于保持系统的状态,非线性的门单元用于在每一个时间点调节流入和流出记忆元组的信息。每个递归的神经网络都可以分解成无数个基本重复单元,传统的RNN是这样,LSTM也是如此。在传统的RNN里面,基本重复单元内部结构十分简单,通常只有一个简单的神经网络层(通常为一个tanh模块,如图所示);在LSTM中,使用了四个神经网络层并且彼此之间以一种特殊的关系进行交互(如图所示)。



模型安装

pip install tensorflow


模型实现

  这里同样使用的是TensorFlow里面的Timeseries模块实现。

def now():return datetime.now().strftime("%m_%d_%H_%M_%s")def parse_result_tf(tf_data):"""parse the result of model output in tensorflow:param tf_data: the output of tensorflow:return: data in DataFrame format"""return pd.DataFrame.from_dict({"ds": tf_data["times"].reshape(-1), "y": tf_data["mean"].reshape(-1)})def generate_time_series(start_date=datetime(2006, 1, 1),cnt=4018, delta=timedelta(days=1), timestamp=False
):"""generate a time series/index:param start_date: start date:param cnt: date count. If =cnt are specified, delta must not be; one is required:param delta: time delta, default is one day.:param timestamp: output timestamp or format string:return: list of time string or timestamp"""def per_delta():curr = start_datewhile curr < end_date:yield currcurr += deltaend_date = start_date + delta * cnttime_series = []if timestamp:for t in per_delta():time_series.append(t.timestamp())else:for t in per_delta():time_series.append(t)# print(t.strftime("%Y-%m-%d"))return time_seriesdef LSTM_predict_tf(train_data, evaluation_data, forecast_cnt=365, freq="D", model_dir=""):"""predict time series with LSTM model in tensorflow:param train_data: data use to train the model:param evaluation_data: data use to evaluate the model:param forecast_cnt: how many point needed to be predicted:param freq: the interval between time index:param model_dir: directory of pre-trained model(checkpoint, params):return:"""model_directory = "./model/LSTM_%s" % now()params = {"batch_size": 3,"window_size": 4,# The number of units in the model's LSTMCell."num_units": 128,# The dimensionality of the time series (one for univariate, more than one for multivariate)"num_features": 1,# how many steps we train the model"global_steps": 3000}# if there is a pre-trained model, use parameters from itif model_dir:model_directory = model_dirparams = read_model_param(model_dir + "/params.txt")# create time index for model training(use int)time_int = range(len(train_data) + len(evaluation_data))data_train = {tf.contrib.timeseries.TrainEvalFeatures.TIMES: time_int[:len(train_data)],tf.contrib.timeseries.TrainEvalFeatures.VALUES: train_data["y"],}data_eval = {tf.contrib.timeseries.TrainEvalFeatures.TIMES: time_int[len(train_data):],tf.contrib.timeseries.TrainEvalFeatures.VALUES: evaluation_data["y"],}reader_train = NumpyReader(data_train)reader_eval = NumpyReader(data_eval)"""define in tensorflow/contrib/timeseries/python/timeseries/input_pipeline.py"""train_input_fn = tf.contrib.timeseries.RandomWindowInputFn(reader_train, batch_size=params["batch_size"], window_size=params["window_size"])"""define in tensorflow/contrib/timeseries/python/timeseries/estimators.py"""estimator_lstm = ts_estimators.TimeSeriesRegressor(model=_LSTMModel(num_features=params["num_features"], num_units=params["num_units"]),optimizer=tf.train.AdamOptimizer(learning_rate=0.01),model_dir=model_directory)if not model_dir:"""website: https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator#train"""estimator_lstm.train(input_fn=train_input_fn, steps=params["global_steps"])evaluation_input_fn = tf.contrib.timeseries.WholeDatasetInputFn(reader_eval)evaluation = estimator_lstm.evaluate(input_fn=evaluation_input_fn, steps=1)# Predict starting after the evaluation(predictions,) = tuple(estimator_lstm.predict(input_fn=tf.contrib.timeseries.predict_continuation_input_fn(evaluation, steps=forecast_cnt)))save_model_param(model_directory, params)if "loss" in evaluation.keys():print("loss:%.5f" % evaluation["loss"])f = open(model_directory + "/%s" % evaluation["loss"], "w")f.close()model_log(evaluation["loss"],average_loss=-1 if "average_loss" not in evaluation.keys() else evaluation["average_loss"],content=model_dir)evaluation = parse_result_tf(evaluation)predictions = parse_result_tf(predictions)first_date = evaluation_data["ds"].tolist()[0]evaluation["ds"] = generate_time_series(first_date, cnt=len(evaluation), delta=delta_dict[freq])latest_date = evaluation_data["ds"].tolist()[-1]predictions["ds"] = generate_time_series(latest_date, cnt=len(predictions), delta=delta_dict[freq])return evaluation, predictions

关键参数

  • window_size:“观察窗”大小,用于控制将多少个连续的时间序列放在一起;
  • batch_size:批次大小,用于控制将多少个“观察窗”,该值越大,模型训练的时候梯度就会越稳定;
  • num_features:与AR模型一致,是时间序列的维度;
  • num_units:每个LSTM元组(cell)里面包含多少个基本单元(unit);
  • optimizer:优化器的种类;
  • learning_rate:学习速率,与模型训练时间成负相关,学习率越大训练时间越短,但是过大的学习率可能会导致模型无法收敛;
  • steps:模型的训练迭代次数。

注意由于LSTM模型较为复杂,故当数据量较少而规律不明显的情况下,其模型表现可能不尽人意。

时间序列预测(四)—— LSTM模型相关推荐

  1. 【深度学习 项目实战】Keras深度学习多变量时间序列预测的LSTM模型

    无意中发现了一个巨牛的人工智能教程,忍不住分享一下给大家.教程不仅是零基础,通俗易懂,而且非常风趣幽默,像看小说一样!觉得太牛了,所以分享给大家.点这里可以跳转到教程.人工智能教程 本篇文章将介绍基于 ...

  2. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测大气压( air pressure)+代码实战

    深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测大气压( air pressure)+代码实战 长短期记忆(Long short-term memory, LSTM)是一种特殊的RNN,主 ...

  3. 深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战

    深度学习时间序列预测:LSTM算法构建时间序列单变量模型预测空气质量(PM2.5)+代码实战 # 导入需要的包和函数: from __future__ import print_function im ...

  4. 深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战

    深度学习多变量时间序列预测:LSTM算法构建时间序列多变量模型预测交通流量+代码实战 LSTM(Long Short Term Memory Network)长短时记忆网络,是一种改进之后的循环神经网 ...

  5. 多元时间序列预测之LSTM的实现

    多元时间序列预测之LSTM的实现 keras简单介绍 多变量LSTM预测模型 本文使用keras库实现基于LSTM的多元时间序列预测问题.所谓多元时间序列预测,是指根据多个变量之间的关系预测他们下一时 ...

  6. tf.keras 11: 时间序列预测之LSTM天气预测

    本教程介绍了使用递归神经网络(RNN)进行时间序列预测的流程.包括两个部分:首先,预测单变量时间序列,然后预测多变量时间序列. 文章目录 1. 数据集介绍 2. 单变量单步输出预测 2.1 数据标准化 ...

  7. 时间序列预测任务的模型选择最全总结

    在第一部分,将了解多种时间序列的模型,如 经典的时间序列模型 监督学习模型 基于深度学习的模型 在第二部分,将建立几个时间序列模型来预测股市的应用案例,并了解一些时间序列建模技术.这些模型将相互比较, ...

  8. 时间序列预测——双向LSTM(Bi-LSTM)

      本文展示了使用双向LSTM(Bi-LSTM)进行时间序列预测的全过程,包含详细的注释.整个过程主要包括:数据导入.数据清洗.结构转化.建立Bi-LSTM模型.训练模型(包括动态调整学习率和earl ...

  9. 时间序列预测-传统统计学模型ARIMA

    ARIMA单变量预测股价DEMO 时间序列介绍: 统计学模型-ARIMA介绍 ARIMA 参数选择说明 源代码解析 参考资料 时间序列介绍: 时间序列(TIME-SERISE)充斥着我们生活的空间,在 ...

  10. 阿里天池竞赛 A股上市公司营收预测 使用LSTM模型做时序预测

    参赛结束了,最后结果一百多名,先把清洗好的数据和预测算法文件记录下来. 使用的完全代码和数据 https://download.csdn.net/download/infent/10693927 代码 ...

最新文章

  1. Javascript正则匹配不含某子串
  2. android studio2.3.2增加jni
  3. Windows 命令窗口(cmd)命令不能用解决办法
  4. POJ 1821 Fence ★(单调队列优化DP)
  5. wxWidgets:wxAnyValueType类用法
  6. OutOfMemoryError dump memory
  7. Dubbo为什么用Go重写?
  8. topcoder srm 525 div1
  9. Java中的break和continue关键字使用总结
  10. Gstreamer 搭建RTSP服务器(九)
  11. 晨间日记模板 Web应用版 晨间日记软件 开源
  12. sqlserver 企业版下载地址
  13. 8.1 - mysql 基本知识
  14. go第三方库文档 日志构建zap
  15. 语言中的历史——汉语和突厥语的纠缠
  16. 谷歌Chrome浏览器主页被毒霸篡改
  17. Spine 实用技巧大全
  18. python判断成年_用python判断你是青少年还是老年人
  19. Java第十二天笔记01——网络编程
  20. java面试之每天五题

热门文章

  1. [模拟]AT2202
  2. iOS xcode真机调试获取手机屏幕截屏
  3. 什么是Crowbar电路?
  4. SpringBoot项目配置maven命令、打包运行等
  5. 秋藕最补人 8款食谱益胃健脾 养血补虚
  6. leetcode 53 最大自序和
  7. Qt的半透明方法总结
  8. 在/tmp目录下,新建目录director新建三个txt文件,分别为file1.txt,file2.txt,file3.txt,用vi编辑器分别在三个文件中输入内容。
  9. html-js-css素材网站
  10. .NET5-统一平台(一统江湖)