本文共 3153 字,大约阅读时间需要 10 分钟。
LSTM(长短期记忆网络)是一种特殊的循环神经网络(RNN),擅长处理时间序列数据。它通过引入门控机制,能够有效捕捉长期依赖信息,在很多时间序列预测任务中表现优于传统的RNN模型。本文将介绍如何利用TensorFlow搭建LSTM模型,完成实际时间序列预测任务。
我们使用R语言自带的AirPassengers数据集,该数据集记录了Box & Jenkins航空公司1949-1960年共144个观测值,反映了每个月的国际航线乘客数。这个数据集是一个经典的时间序列数据集,广泛用于教程和实践项目。
在实际应用中,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))
HIDDEN_SIZE = 40NUM_LAYERS = 1TIMESTEPS = 12TRAINING_STEPS = 2000BATCH_SIZE = 20
为了将原始数据转换为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)
我们定义了一个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
对原始数据进行尺度缩放,并生成训练集和测试集:
data = data_processing(data)train_X, train_y = generate_data(data)test_X, test_y = generate_data(data)
使用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)
使用训练好的模型对测试集进行预测:
predicted = np.array([pred for pred in regressor.predict(test_X)])
由于标准化会导致预测值范围变为[-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)
绘制反标准化前的和后的对比图:
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/