Python时间序列LSTM预测系列教程(11)-多步预测

Multi-Step LSTM预测(2)

教程原文链接


关联教程:

Python时间序列LSTM预测系列教程(10)-多步预测

Python时间序列LSTM预测系列教程(11)-多步预测


多步预测的LSTM网络


数据准备

1、变成具有稳定性数据
2、缩放数据

LSTM模型预测过程


1、数据预测处理,准备数据
2、定义模型
3、训练模型
4、预测
5、数据逆变换
6、评估

代码


  1. from pandas import DataFrame
  2. from pandas import Series
  3. from pandas import concat
  4. from pandas import read_csv
  5. from pandas import datetime
  6. from sklearn.metrics import mean_squared_error
  7. from sklearn.preprocessing import MinMaxScaler
  8. from keras.models import Sequential
  9. from keras.layers import Dense
  10. from keras.layers import LSTM
  11. from math import sqrt
  12. from matplotlib import pyplot
  13. from numpy import array
  14. # date-time parsing function for loading the dataset
  15. def parser(x):
  16. return datetime.strptime( '190'+x, '%Y-%m')
  17. # convert time series into supervised learning problem
  18. def series_to_supervised(data, n_in=1, n_out=1, dropnan=True):
  19. n_vars = 1 if type(data) is list else data.shape[ 1]
  20. df = DataFrame(data)
  21. cols, names = list(), list()
  22. # input sequence (t-n, ... t-1)
  23. for i in range(n_in, 0, -1):
  24. cols.append(df.shift(i))
  25. names += [( 'var%d(t-%d)' % (j+ 1, i)) for j in range(n_vars)]
  26. # forecast sequence (t, t+1, ... t+n)
  27. for i in range( 0, n_out):
  28. cols.append(df.shift(-i))
  29. if i == 0:
  30. names += [( 'var%d(t)' % (j+ 1)) for j in range(n_vars)]
  31. else:
  32. names += [( 'var%d(t+%d)' % (j+ 1, i)) for j in range(n_vars)]
  33. # put it all together
  34. agg = concat(cols, axis= 1)
  35. agg.columns = names
  36. # drop rows with NaN values
  37. if dropnan:
  38. agg.dropna(inplace= True)
  39. return agg
  40. # create a differenced series
  41. def difference(dataset, interval=1):
  42. diff = list()
  43. for i in range(interval, len(dataset)):
  44. value = dataset[i] - dataset[i - interval]
  45. diff.append(value)
  46. return Series(diff)
  47. # transform series into train and test sets for supervised learning
  48. def prepare_data(series, n_test, n_lag, n_seq):
  49. # extract raw values
  50. raw_values = series.values
  51. # transform data to be stationary
  52. diff_series = difference(raw_values, 1)
  53. diff_values = diff_series.values
  54. diff_values = diff_values.reshape(len(diff_values), 1)
  55. # rescale values to -1, 1
  56. scaler = MinMaxScaler(feature_range=( -1, 1))
  57. scaled_values = scaler.fit_transform(diff_values)
  58. scaled_values = scaled_values.reshape(len(scaled_values), 1)
  59. # transform into supervised learning problem X, y
  60. supervised = series_to_supervised(scaled_values, n_lag, n_seq)
  61. supervised_values = supervised.values
  62. # split into train and test sets
  63. train, test = supervised_values[ 0:-n_test], supervised_values[-n_test:]
  64. return scaler, train, test
  65. # fit an LSTM network to training data
  66. def fit_lstm(train, n_lag, n_seq, n_batch, nb_epoch, n_neurons):
  67. # reshape training into [samples, timesteps, features]
  68. X, y = train[:, 0:n_lag], train[:, n_lag:]
  69. X = X.reshape(X.shape[ 0], 1, X.shape[ 1])
  70. # design network
  71. model = Sequential()
  72. model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[ 1], X.shape[ 2]), stateful= True))
  73. model.add(Dense(y.shape[ 1]))
  74. model.compile(loss= 'mean_squared_error', optimizer= 'adam')
  75. # fit network
  76. for i in range(nb_epoch):
  77. model.fit(X, y, epochs= 1, batch_size=n_batch, verbose= 0, shuffle= False)
  78. model.reset_states()
  79. return model
  80. # make one forecast with an LSTM,
  81. def forecast_lstm(model, X, n_batch):
  82. # reshape input pattern to [samples, timesteps, features]
  83. X = X.reshape( 1, 1, len(X))
  84. # make forecast
  85. forecast = model.predict(X, batch_size=n_batch)
  86. # convert to array
  87. return [x for x in forecast[ 0, :]]
  88. # evaluate the persistence model
  89. def make_forecasts(model, n_batch, train, test, n_lag, n_seq):
  90. forecasts = list()
  91. for i in range(len(test)):
  92. X, y = test[i, 0:n_lag], test[i, n_lag:]
  93. # make forecast
  94. forecast = forecast_lstm(model, X, n_batch)
  95. # store the forecast
  96. forecasts.append(forecast)
  97. return forecasts
  98. # invert differenced forecast
  99. def inverse_difference(last_ob, forecast):
  100. # invert first forecast
  101. inverted = list()
  102. inverted.append(forecast[ 0] + last_ob)
  103. # propagate difference forecast using inverted first value
  104. for i in range( 1, len(forecast)):
  105. inverted.append(forecast[i] + inverted[i -1])
  106. return inverted
  107. # inverse data transform on forecasts
  108. def inverse_transform(series, forecasts, scaler, n_test):
  109. inverted = list()
  110. for i in range(len(forecasts)):
  111. # create array from forecast
  112. forecast = array(forecasts[i])
  113. forecast = forecast.reshape( 1, len(forecast))
  114. # invert scaling
  115. inv_scale = scaler.inverse_transform(forecast)
  116. inv_scale = inv_scale[ 0, :]
  117. # invert differencing
  118. index = len(series) - n_test + i - 1
  119. last_ob = series.values[index]
  120. inv_diff = inverse_difference(last_ob, inv_scale)
  121. # store
  122. inverted.append(inv_diff)
  123. return inverted
  124. # evaluate the RMSE for each forecast time step
  125. def evaluate_forecasts(test, forecasts, n_lag, n_seq):
  126. for i in range(n_seq):
  127. actual = [row[i] for row in test]
  128. predicted = [forecast[i] for forecast in forecasts]
  129. rmse = sqrt(mean_squared_error(actual, predicted))
  130. print( 't+%d RMSE: %f' % ((i+ 1), rmse))
  131. # plot the forecasts in the context of the original dataset
  132. def plot_forecasts(series, forecasts, n_test):
  133. # plot the entire dataset in blue
  134. pyplot.plot(series.values)
  135. # plot the forecasts in red
  136. for i in range(len(forecasts)):
  137. off_s = len(series) - n_test + i - 1
  138. off_e = off_s + len(forecasts[i]) + 1
  139. xaxis = [x for x in range(off_s, off_e)]
  140. yaxis = [series.values[off_s]] + forecasts[i]
  141. pyplot.plot(xaxis, yaxis, color= 'red')
  142. # show the plot
  143. pyplot.show()
  144. # load dataset
  145. series = read_csv( 'shampoo-sales.csv', header= 0, parse_dates=[ 0], index_col= 0, squeeze= True, date_parser=parser)
  146. # configure
  147. n_lag = 1
  148. n_seq = 3
  149. n_test = 10
  150. n_epochs = 1500
  151. n_batch = 1
  152. n_neurons = 1
  153. # prepare data
  154. scaler, train, test = prepare_data(series, n_test, n_lag, n_seq)
  155. # fit model
  156. model = fit_lstm(train, n_lag, n_seq, n_batch, n_epochs, n_neurons)
  157. # make forecasts
  158. forecasts = make_forecasts(model, n_batch, train, test, n_lag, n_seq)
  159. # inverse transform forecasts and test
  160. forecasts = inverse_transform(series, forecasts, scaler, n_test+ 2)
  161. actual = [row[n_lag:] for row in test]
  162. actual = inverse_transform(series, actual, scaler, n_test+ 2)
  163. # evaluate forecasts
  164. evaluate_forecasts(actual, forecasts, n_lag, n_seq)
  165. # plot forecasts
  166. plot_forecasts(series, forecasts, n_test+ 2)





猜你喜欢

转载自blog.csdn.net/sinat_22510827/article/details/81040698