Train, tune and use time series, sequence and prediction models

Difficile de savoir ce qui est attendu par TensorFlow pour ce 1er skill en Time Series.

On peut supposer qu’il s’agit d’utiliser des réseaux de neurones pour du forecast. On peut aussi penser qu’il s’agit d’une introduction aux Time Series.

Le tutoriel qui sert de référence pour celui-ci est Forecasting de Sequences, Time Series and Prediction (Coursera/Semaine 1).

Naive forecast

Supposons, la série de données x_valid :

split_time = 1000
x_valid = series[split_time:]
naive_forecast = series[split_time - 1:-1]
naive_forecast[0], naive_forecast[1], naive_forecast[2]
(67.19674, 71.34472, 68.98551)
x_valid[0], x_valid[1], x_valid[2]
(71.34472, 68.98551, 64.6752)
plt.figure(figsize=(10, 6))
plot_series(time_valid, x_valid, start=0, end=150)
plot_series(time_valid, naive_forecast, start=1, end=151)
naive forecast

Pour mesurer la pertinence de la prévision on utilise MSE ou MAE

print(keras.metrics.mean_squared_error(x_valid, naive_forecast).numpy())print(keras.metrics.mean_absolute_error(x_valid, naive_forecast).numpy())
61.827538
5.937908

Moving average:

def moving_average_forecast(series, window_size):
  """Forecasts the mean of the last few values.
     If window_size=1, then this is equivalent to naive forecast"""
  forecast = []
  for time in range(len(series) - window_size):
    forecast.append(series[time:time + window_size].mean())
  return np.array(forecast)
moving_avg = moving_average_forecast(series, 30)[split_time - 30:]

plt.figure(figsize=(10, 6))
plot_series(time_valid, x_valid)
plot_series(time_valid, moving_avg)
print(keras.metrics.mean_squared_error(x_valid, moving_avg).numpy())
print(keras.metrics.mean_absolute_error(x_valid, moving_avg).numpy())
106.674576
7.142419

Les résultats ne sont pas terribles !

differencing

On effectue d’abord le delta entre les données des périodes.

diff_series = (series[365:] - series[:-365])
diff_time = time[365:]

Puis ensuite on effectue un moving average

diff_moving_avg = moving_average_forecast(diff_series, 50)[split_time - 365 - 50:]

et on rajoute les données de la période précédente

diff_moving_avg_plus_past = series[split_time - 365:-365] + diff_moving_avg
print(keras.metrics.mean_squared_error(x_valid, diff_moving_avg_plus_past).numpy())print(keras.metrics.mean_absolute_error(x_valid, diff_moving_avg_plus_past).numpy())
52.97366
5.839311

Les résultats sont meilleurs cette fois.