博客
关于我
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
阅读量:422 次
发布时间:2019-03-06

本文共 3153 字,大约阅读时间需要 10 分钟。

什么是LSTM模型及其在时间序列预测中的应用

LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),擅长处理时间序列数据。它通过引入门控机制,能够有效捕捉长期依赖信息,在很多时间序列预测任务中表现优于传统的RNN模型。本文将介绍如何利用TensorFlow搭建LSTM模型,完成实际时间序列预测任务。


数据说明及预处理

2.1 数据来源

我们使用R语言自带的AirPassengers数据集,该数据集记录了Box & Jenkins航空公司1949-1960年共144个观测值,反映了每个月的国际航线乘客数。这个数据集是一个经典的时间序列数据集,广泛用于教程和实践项目。

2.2 数据预处理

在实际应用中,LSTM模型通常对输入数据进行预处理。由于LSTM的输出范围通常在[-1,1]之间,为了保持预测结果的物理意义,我们对原始数据进行尺度标准化。标准化的公式为:

[ X_{norm} = \frac{X - \mu}{\sigma} ]

其中,( \mu ) 和 ( \sigma ) 分别是原始数据的均值和标准差。我们可以选择标准化或极差规格化(Min-Max标准化)中的任意一种方法。以下是我们选择的标准化方法:

def data_processing(raw_data, scale=True):    if scale:        return (raw_data - np.mean(raw_data)) / np.std(raw_data)    else:        return (raw_data - np.min(raw_data)) / (np.max(raw_data) - np.min(raw_data))

模型建立及训练

3.1 LSTM基本参数设置

  • 隐层层数:由于数据集较简单,我们选择1层。
  • 隐层神经元个数:随意设置为40个。
  • 时间步中递归次数:根据数据的周期性和趋势,设置为12。
  • 训练轮数:设置为2000轮。
  • 训练批尺寸:设置为20。
HIDDEN_SIZE = 40NUM_LAYERS = 1TIMESTEPS = 12TRAINING_STEPS = 2000BATCH_SIZE = 20

3.2 数据生成函数

为了将原始数据转换为LSTM模型可以处理的格式,我们编写了以下数据生成函数:

def generate_data(seq):    X = []    Y = []    for i in range(len(seq) - TIMESTEPS - 1):        X.append([seq[i:i + TIMESTEPS]])        Y.append([seq[i + TIMESTEPS]])    return np.array(X, dtype=np.float32), np.array(Y, dtype=np.float32)

3.3 LSTM模型定义

我们定义了一个LSTM模型函数,包括以下步骤:

  • 定义LSTM单元。
  • 使用MultiRNNCell将多个LSTM单元堆叠。
  • 使用dynamic_rnn动态运行RNN。
  • 生成预测输出。
  • 定义损失函数和优化器。
  • def LstmCell():    return rnn.BasicLSTMCell(HIDDEN_SIZE, state_is_tuple=True)def lstm_model(X, y):    cell = rnn.MultiRNNCell([LstmCell() for _ in range(NUM_LAYERS)])    output, _ = tf.nn.dynamic_rnn(cell, X, dtype=tf.float32)    output = tf.reshape(output, [-1, HIDDEN_SIZE])    predictions = tf.contrib.layers.fully_connected(output, 1, None)    labels = tf.reshape(y, [-1])    predictions = tf.reshape(predictions, [-1])    loss = tf.losses.mean_squared_error(predictions, labels)    train_op = tf.contrib.layers.optimize_loss(        loss, tf.contrib.framework.get_global_step(),        optimizer='Adagrad', learning_rate=0.6    )    return predictions, loss, train_op

    训练过程

    4.1 数据准备

    对原始数据进行尺度缩放,并生成训练集和测试集:

    data = data_processing(data)train_X, train_y = generate_data(data)test_X, test_y = generate_data(data)

    4.2 模型训练

    使用SKCompat来仿照sklearn的训练方式:

    regressor = SKCompat(    learn.Estimator(        model_fn=lstm_model,        model_dir='Models/model_2'    ))regressor.fit(train_X, train_y, batch_size=BATCH_SIZE, steps=TRAINING_STEPS)

    模型评价

    5.1 测试集预测

    使用训练好的模型对测试集进行预测:

    predicted = np.array([pred for pred in regressor.predict(test_X)])

    5.2 反标准化

    由于标准化会导致预测值范围变为[-1,1],我们需要反标准化以获得实际的预测值。以下是反标准化函数:

    def scale_inv(raw_data, scale=True):    data = pd.read_csv(path + 'AirPassenger.csv')    data = data.iloc[:, 0].tolist()    if scale:        return raw_data * np.std(data) + np.mean(data)    else:        return raw_data * (np.max(data) - np.min(data)) + np.min(data)

    5.3 对比图

    绘制反标准化前的和后的对比图:

    plt.figure()plt.plot(predicted, label='预测值')plt.plot(test_y, label='真实值')plt.title('反标准化之前')plt.legend()plt.show()

    模型应用

    在实际应用中,可以通过以下步骤使用已训练好的LSTM模型进行预测:

  • 将模型加载到内存中。
  • 对待预测的新数据进行标准化或极差规格化。
  • 使用生成函数将数据转换为模型要求的格式。
  • 调用模型进行预测。
  • 对预测结果进行反标准化,得到实际的预测值。

  • 通过以上步骤,我们成功使用TensorFlow搭建了一个LSTM模型,完成了对AirPassengers数据集的时间序列预测任务。希望本文能够为大家提供一个清晰的LSTM模型搭建与训练参考。

    转载地址:http://dlcuz.baihongyu.com/

    你可能感兴趣的文章
    Objective-C实现k-Means算法(附完整源码)
    查看>>
    Objective-C实现k-nearest算法(附完整源码)
    查看>>
    Objective-C实现Knapsack problem背包问题算法(附完整源码)
    查看>>
    Objective-C实现knapsack背包问题算法(附完整源码)
    查看>>
    Objective-C实现knapsack背包问题算法(附完整源码)
    查看>>
    Objective-C实现knight tour骑士之旅算法(附完整源码)
    查看>>
    Objective-C实现KNN算法(附完整源码)
    查看>>
    Objective-C实现koch snowflake科赫雪花算法(附完整源码)
    查看>>
    Objective-C实现KPCA(附完整源码)
    查看>>
    Objective-C实现kth order statistick阶统计量算法(附完整源码)
    查看>>
    Objective-C实现LongestIncreasingSubsequence最长递增子序列算法(附完整源码)
    查看>>
    Objective-C实现LRU 缓存算法(附完整源码)
    查看>>
    Objective-C实现lstm prediction预测算法(附完整源码)
    查看>>
    Objective-C实现Luhn (Mod 10)Algorithm算法(附完整源码)
    查看>>
    Objective-C实现max subarray sum最大子数组和算法(附完整源码)
    查看>>
    Objective-C实现MaximumSubarray最大子阵列(动态规划解决方案)算法(附完整源码)
    查看>>
    Objective-C实现max_heap最大堆算法(附完整源码)
    查看>>
    Objective-C实现md5算法(附完整源码)
    查看>>
    Objective-C实现memoization优化技术算法(附完整源码)
    查看>>
    Objective-C实现memset函数功能(附完整源码)
    查看>>