原文链接:http:///?p=23544下面是一个关于如何使用长短期记忆网络(LSTM)来拟合一个不稳定的时间序列的例子。 每年的降雨量数据可能是相当不稳定的。与温度不同,温度通常在四季中表现出明显的趋势,而雨量作为一个时间序列可能是相当不稳定的。夏季的降雨量与冬季的降雨量一样多是很常见的。 下面是某地区2020年11月降雨量的图解。 作为一个连续的神经网络,LSTM模型可以证明在解释时间序列的波动性方面有优势。 使用Ljung-Box检验,小于0.05的p值表明这个时间序列中的残差表现出随机模式,表明有明显的波动性。 >>> sm.stats.acorr_ljungbox(res.resid, lags=\[10\])Ljung-Box检验Dickey-Fuller 检验数据操作和模型配置该数据集由722个月的降雨量数据组成。 选择712个数据点用于训练和验证,即用于建立LSTM模型。然后,过去10个月的数据被用来作为测试数据,与LSTM模型的预测结果进行比较。 下面是数据集的一个片段。 然后形成一个数据集矩阵,将时间序列与过去的数值进行回归。 # 形成数据集矩阵for i in range(len(df)-previous-1): a = df\[i:(i+previous), 0\] dataX.append(a) dataY.append(df\[i + previous, 0\]) 然后用MinMaxScaler对数据进行标准化处理。 将前一个参数设置为120,训练和验证数据集就建立起来了。作为参考,previous = 120说明模型使用从t - 120到t - 1的过去值来预测时间t的雨量值。 前一个参数的选择要经过试验,但选择120个时间段是为了确保识别到时间序列的波动性或极端值。 # 训练和验证数据的划分train_size = int(len(df) * 0.8) val\_size = len(df) - train\_size train, val = df\[0:train\_size,:\], df\[train\_size:len(df),:\]# 前期的数量 previous = 120 然后,输入被转换为样本、时间步骤、特征的格式。 # 转换输入为\[样本、时间步骤、特征\]。np.reshape(X_train, (shape\[0\], 1, shape\[1\])) 模型训练和预测该模型在100个历时中进行训练,并指定了712个批次的大小(等于训练和验证集中的数据点数量)。 # 生成LSTM网络model = tf.keras.Sequential() # 列出历史中的所有数据 print(history.history.keys()) # 总结准确度变化 plt.plot(history.history\['loss'\]) 下面是训练集与验证集的模型损失的关系图。 预测与实际降雨量的关系图也被生成。 # 绘制所有预测图plt.plot(valpredPlot) 预测结果在平均方向准确性(MDA)、平均平方根误差(RMSE)和平均预测误差(MFE)的基础上与验证集进行比较。 mda(Y_val, predictions)0.9090909090909091>>> mse = mean\_squared\_error(Y_val, predictions) >>> rmse = sqrt(mse) >>> forecast_error >>> mean\_forecast\_error = np.mean(forecast_error)
针对测试数据进行预测虽然验证集的结果相当可观,但只有将模型预测与测试(或未见过的)数据相比较,我们才能对LSTM模型的预测能力有合理的信心。 如前所述,过去10个月的降雨数据被用作测试集。然后,LSTM模型被用来预测未来10个月的情况,然后将预测结果与实际值进行比较。 至t-120的先前值被用来预测时间t的值。 # 测试(未见过的)预测np.array(\[tseries.iloctseries.iloc,t 获得的结果如下
过去10个月的平均降雨量为148.93毫米,预测精度显示出与验证集相似的性能,而且相对于整个测试集计算的平均降雨量而言,误差很低。 结论在这个例子中,你已经看到:
|
|