打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
ARIMA与LSTM:用电量的预测

  哪种型号效果更好?

  

  > Source: Photo by Comfreak from Pixabay

  在此示例中,ARIMA和LSTM模型用于预测爱尔兰都柏林市议会市政办公室的用电量模式。

  有问题的数据来自data.ie。

  具体而言,以每15分钟的千瓦消耗量提供数据。

  分析分为三个阶段:

  · 调用相关的数据处理程序以汇总每天的总千瓦消耗量,即形成每日时间序列。

  · 使用ARIMA模型预测整个验证集的千瓦能耗。

  · 使用LSTM模型在整个验证集中生成另一个预测,并检查预测是否有所改善。

  数据处理

  这是加载到Python中的原始数据集。

  df=pd.read_csv('dccelectricitycivicsblocks34p20130221-1840.csv',

  engine='python',

  skipfooter=3)

  df

  > Source: Jupyter Notebook Output

  我们可以看到,对于每个日期,每隔15分钟就会提供一次相关的电量消耗。

  但是,在这种情况下,我们希望预测每天的总消费量,并且如果时间序列以15分钟为基础形成,那么波动性将会太大,从而使任何预测都显得肤浅。

  在这方面,每天对数据进行排序:

  df2=dfame(columns=df.iloc[0])

  df3=df2.drop(df.index[0])

  df3

  df3.drop(df3.index[0])

  df4=df3.drop('Date', axis=1)

  df5=df4.drop('Values', axis=1)

  df5

  df6=df5.dropna()

  df7=df6.values

  df7

  dataset=np.sum(df7, axis=1, dtype=float)

  dataset

  相应的列被重命名,并且每天的千瓦消耗量被汇总。

  形成一个包含每日汇总数据的numpy数组:

  array([4981.5001927 , 5166.60016445, 3046.35014537, 3101.10013769, 4908.60016439, 4858.50017742, 4905.00019836, 4999.95019526,... 2383.5 , 4481.5 , 4543. , 4390. , 4385. , 4289.5 , 2564. , 2383. ])

  这是数据图:

  

  > Source: Jupyter Notebook Output

  ARIMA

  ARIMA模型(或自回归综合移动平均模型)用于获取相关时间序列的组成部分(即p,d和q参数),并据此做出新的预测。

  尽管将使用pmdarima自动选择这些坐标,但定义季节性趋势很重要。

  时间序列的前80%(554个观测值)用作训练数据。这是在此训练集上生成的自相关函数的图。

  

  > Source: Jupyter Notebook Output

  我们可以看到,在滞后7处识别出最高的正相关性(在负相关性之后)。这表明与原始7天后的千瓦读数之间存在很强的相关性。

  在这方面,ARIMA模型的季节性分量被标识为m=7。

  在运行ARIMA模型之前,让我们快速浏览一下此时间序列的7天移动平均线,以便更好地可视化整体趋势。

  

  > Source: Jupyter Notebook Output

  我们可以看到,该系列的上半年总能耗量似乎正在减少,而下半年则有所增加。

  值得注意的是,我们可以看到该系列中途出现了急剧下降,这显然标志着该系列中的异常。

  这可能是由于断电或其他一些事件导致富贵论坛用电量突然下降。在运行预测时,我们必须牢记,过去的数据不一定会解释这种"时间序列冲击"。

  使用训练数据,现在使用pmdarima进行逐步搜索以最小化AIC值,即选择显示最低AIC的ARIMA模型。

  >>> Arima_model=pm.auto_arima(train_df,

  start_p=0,

  start_q=0,

  max_p=10,

  max_q=10,

  start_P=0,

  start_Q=0,

  max_P=10,

  max_Q=10,

  m=7,

  stepwise=True,

  seasonal=True,

  information_criterion='aic',

  trace=True,

  d=1,

  D=1,

  error_action='warn',

  suppress_warnings=True,

  random_state=20,

  n_fits=30)

  Performing stepwise search to minimize aic

  ARIMA(0,1,0)(0,1,0)[7] : AIC=8483.714, Time=0.04 sec

  ARIMA(1,1,0)(1,1,0)[7] : AIC=8421.989, Time=0.12 sec

  ARIMA(0,1,1)(0,1,1)[7] : AIC=8319.248, Time=0.34 sec

  ARIMA(0,1,1)(0,1,0)[7] : AIC=8360.091, Time=0.10 sec

  ARIMA(0,1,1)(1,1,1)[7] : AIC=inf, Time=0.78 sec

  ARIMA(0,1,1)(0,1,2)[7] : AIC=inf, Time=1.36 sec

  ARIMA(0,1,1)(1,1,0)[7] : AIC=8328.690, Time=0.27 sec

  ARIMA(0,1,1)(1,1,2)[7] : AIC=inf, Time=2.29 sec

  ARIMA(0,1,0)(0,1,1)[7] : AIC=8451.400, Time=0.18 sec

  ARIMA(1,1,1)(0,1,1)[7] : AIC=inf, Time=0.81 sec

  ARIMA(0,1,2)(0,1,1)[7] : AIC=inf, Time=0.75 sec

  ARIMA(1,1,0)(0,1,1)[7] : AIC=8415.537, Time=0.09 sec

  ARIMA(1,1,2)(0,1,1)[7] : AIC=inf, Time=1.16 sec

  ARIMA(0,1,1)(0,1,1)[7] intercept : AIC=8321.247, Time=1.30 sec

  Best model: ARIMA(0,1,1)(0,1,1)[7] Total fit time: 9.588 seconds

  最合适的ARIMA模型被标识为ARIMA(0,1,1)(0,1,1)[7]。

  现在,可以对接下来的126天进行预测,并将预测结果与在整个验证集中获得的实际结果进行比较。

  prediction=pd.DataFrame(Arima_model.predict(n_periods=126), index=val_df)

  prediction=np.array(prediction)

  调整预测的形状以确保验证集和预测的格式相同:

  prediction=prediction.reshape(126,-1)

  均方根误差计算如下:

  >>> mse=mean_squared_error(val_df, prediction)

  >>> rmse=math.sqrt(mse)

  >>> print('RMSE: %f' % rmse)

  RMSE: 1288.000396

  验证集中的平均千瓦消耗为3,862。鉴于RMSE误差占均值大小的33%,这表明ARIMA模型在预测用电量方面可以做得更好。

  为了更直观地了解发生了什么,我们来绘制预测和验证数据。

  

  > Source: Jupyter Notebook Output

  我们可以看到ARIMA模型很好地反映了该系列的季节性趋势。就是说,图表前半部分的峰值消耗预测似乎比实际要高得多。

  此外,我们看到该模型无法捕获整个验证集中大约70-80天之间的千瓦时能耗下降。这种异常可能会导致我们为RMSE值看到的较大误差,因为RMSE旨在更严厉地惩罚异常值。

  LSTM

  现在,在这组数据上实现了LSTM模型,以检查使用这种方法时预测准确性是否有所提高。

  数据以与上述最初相同的方式进行操作,即通过在一天的时间内每15分钟汇总一次用电量来形成每日时间序列。

  数据分为训练和验证数据:

  train_size=int(len(df) * 0.8)

  val_size=len(df) - train_size

  train, val=df[0:train_size,:], df[train_size:len(df),:]

  形成一个数据集矩阵:

  def create_dataset(df, previous=1):

  dataX, dataY=[], []

  for i in range(len(df)-previous-1):

  a=df[i:(i+previous), 0]

  dataX.append(a)

  dataY.append(df[i + previous, 0])

  return np.array(dataX), np.array(dataY)数据归一化

  为了使LSTM模型正确解释数据,对数据进行了标准化。

  但是,在实施此过程时有一个很大的警告。训练和验证集必须分别分开(如上所述),然后分别对每个训练集进行缩放。

  实施LSTM模型时的一个常见错误是仅对整个数据集进行缩放。这是错误的,因为缩放器会将验证集中的值用作缩放的基准,从而导致数据泄漏回到训练集中。

  例如,让我们假设假设训练集的规模为1–1000,假设验证集的规模为1–1200。MaxMinScaler会将比例缩小为0–1之间的数字。如果同时在训练集和验证集上对数据进行缩放,那么MaxMinScaler还将使用1–1200的缩放比例作为训练集的基准。这意味着验证集已损害了整个训练集的新量表,从而导致预测不可靠。

  因此,我们示例中的数据按如下比例缩放:

  scaler=MinMaxScaler(feature_range=(0, 1))

  train=scaler_transform(train)

  trainval=scaler_transform(val)

  valLSTM模型配置

  现在已经对数据进行了缩放,因此需要实施回溯期,即在时间t进行预测时,我们希望LSTM模型考虑多少个先前期。

  经过反复试验,回溯期5显示了预测时的最低RMSE。

  lookback=5

  X_train, Y_train=create_dataset(train, lookback)

  X_val, Y_val=create_dataset(val, lookback)

  然后,将输入调整为具有样本,时间步长,特征的格式。

  LSTM网络的定义和训练是:

  # Generate LSTM network

  model=tf.keras.Sequential()

  model.add(LSTM(4, input_shape=(1, lookback)))

  model.add(Dense(1))

  modelpile(loss='mean_squared_error',

  optimizer='adam')

  history=model(X_train,

  Y_train,

  validation_split=0.2,

  epochs=100,

  batch_size=1,

  verbose=2)

  这是训练和验证损失的图:

  

  > Source: Jupyter Notebook Output

  生成预测,然后将其转换回原始比例(在先前使用MinMaxScaler转换之后):

  trainpred=model.predict(X_train)

  valpred=model.predict(X_val)

  trainpred=scaler.inverse_transform(trainpred)

  Y_train=scaler.inverse_transform([Y_train])

  valpred=scaler.inverse_transform(valpred)

  Y_val=scaler.inverse_transform([Y_val])

  predictions=valpred

  现在,可以通过将预测与实际验证数据进行比较来计算预测准确性。

  首先,这是预测数据与实际数据的曲线图。

  

  > Source: Jupyter Notebook Output

  计算RMSE值。

  >>> mse=mean_squared_error(Y_val, predictions)

  >>> rmse=sqrt(mse)

  >>> print('RMSE: %f' % rmse)

  RMSE: 410.116102

  验证集的平均值为3909。RMSE的大小占平均值的10%,这意味着该模型在预测用电量趋势方面显示出优于ARIMA的性能。

  从图中可以看出,LSTM模型擅长于预测消费水平低于正常水平的时期。假设LSTM是一个单步预测模型,即没有时间前五周的值就无法预测时间t的千瓦时,这在某种程度上是可以预期的-这不是长期预测。

  也就是说,LSTM模型在解决该系列的波动性方面更为有效。

  结论

  在此示例中,我们看到了:

  · 如何使用Pandas进行数据操作

  · 配置ARIMA模型以进行长期预测

  · LSTM模型提前一步进行预测

  · 如何使用RMSE评估预测准确性

  非常感谢您的宝贵时间,相关的GitHub存储库以及数据集和代码示例可在此处找到。

  免责声明:本文按"原样"撰写,不作任何担保。本文档旨在概述数据科学概念,不应将其理解为专业建议。本文中的发现和解释是作者的发现,并不受本文提及的任何第三方的认可或附属。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Python用LSTM长短期记忆神经网络对不稳定降雨量时间序列进行预测分析
深度学习正在被滥用
【深度学习量化投资】RNNs在股票价格预测的应用基于Keras
「手把手教你」使用Python玩转金融时间序列模型
DL之LSTM/GRU/CNN:基于tensorflow框架分别利用LSTM/GRU、CNN算法对上海最高气温实现回归预测案例
在Keras中使用LSTM模型进行多变量时间序列预测
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服