首页 > 编程知识 正文

用lstm进行时间序列的预测,时间序列长期预测模型

时间:2023-05-05 21:28:19 阅读:16491 作者:4450

时间序列预测(四) —— LSTM模型欢迎访问我的个人博客网站原文: https://xkw 168.github.io/2019/05/20 /时间序列预测-四-LSTM模型. html

文章链接(1)数据预处理

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

(三) XG提升模型

(四) LSTM机型

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

模型原理长周期内存(lstm )模型,即长时间模型。 LSTM的原理在这个博客上很清楚,建议英语好的伙伴直接去看原文。 这里简化粗略的翻译。

人类天生的能力之一是记忆的持续性,可以根据过去的经验推断出现在看到的内容的实际意义。 看电影的时候,从前面的时间可以推断出后续事件的文章时,也可以从过去知识的积累中推断出文章中各个词的意思。 传统神经网络没有“持久性”,每个神经元都无法根据前面神经元的结果推断。 为了解决这个问题,科学家提出了递归神经网络(Recurrent Neural Networks,RNN )。 RNN是包括循环在内的神经网络,如图所示,允许信息的持续化。 此处,a可以被认为是神经网络的缩影,通过接受一个时刻的输入X t X_t Xt并输出相应的结果h t h_t ht,信息在一个电路中可以从一个步骤传输到另一个步骤。

为了更直观地表示,将电路分割,如图所示用连续的序列表示。 一个循环神经网络可以视为连接有多个相同的基本单元,每个基本单元能够将信息传送到下一个基本单元。

常规RNN存在无法解决“长期依赖”(long-term dependency )问题的问题。 也就是说,有用的信息和预测点相距甚远。 以语言预测为例,“我来自中国。 会说中文。 ”这句话中,有用的信息远离预测点,所以RNN很容易推测出下一个词应该是中文。 但是,“我来自中国。 会说中文。 ”这样,如果有用的信息远离预测点,RNN就无法推测以下语言。 换句话说,RNN的信息持续性不够,不能保持几十到几百步。

为了弥补传统RNN的这一缺点,人们引入了长短时内存(lstm )模型。 LSTM可以被认为是一种特殊的RNN,与传统的RNN相比,LSTM天生更好地支持长期依赖。 LSTM模型的核心思想主要有两个,分别是存储器组(memory cell )和非线性门单元。 其中,存储器组用于保持系统的状态,非线性栅极单元用于调整在每个时间点流入存储器组的信息和流出存储器组的信息。 递归神经网络可以分解成无数个基本重复单元,正如传统RNN一样,LSTM也一样。 在传统的RNN中,基本重复单元的内部结构非常简单,通常只有一个简单的神经网络层。 (通常是一个tanh模块,如图所示。 在LSTM中,如图所示,使用4个神经网络层,相互以特殊的关系相互作用。

模型安装pip安装tensor流

模型的实现这里也使用了TensorFlow中的Timeseries模块的实现。

def now ) ) : return datetime.now ).strftime('%m_%d_%h_%m_%s ' ) defparse_result_TF ) TF _ _ 3360 theoutputoftensorflow 3360 return 3360 dataindatafrata return PD.data frame.from _ dict { ' ds ' : TF _ data [ ' times ] ' y ' : TF _ data [ ' mean ' ].reshape (-1 ) } (def generate _ time _ series (start _ date=datetime ) 2006,1, timestamp=false (: ' ' generateatimeseries/index : paramstart _ date : start date 3360 param CNT 3360 datecount.date

is one day. :param timestamp: output timestamp or format string :return: list of time string or timestamp """ def per_delta(): curr = start_date while curr < end_date: yield curr curr += delta end_date = start_date + delta * cnt time_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 it if model_dir: model_directory = model_dir params = 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模型较为复杂,故当数据量较少而规律不明显的情况下,其模型表现可能不尽人意。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。