Series temporelles avec Keras
On teste ici differentes modelisations a base de reseaux neuronaux sous TensorFlow et on les compare a des modeles de regression classiques.
1 Modules et donnees
library("reticulate")
use_condaenv(condaenv = "env_tf26")
1.1 Modules
import numpy as np
import pandas as pd
'display.max_columns', None)
pd.set_option(
import math
import sys
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import statsmodels.api as sm
import tensorflow as tf
from tensorflow.keras import layers
from tensorflow.keras.layers import Dense, GRU, Dropout, SimpleRNN
from tensorflow.keras.models import Sequential
from tensorflow.keras.callbacks import EarlyStopping
# https://github.com/philipperemy/keras-tcn
from tcn import TCN
# pour regler un bug graphique assez courant avec Anaconda,
# adapter le chemin vers le dossier 'plugins/platforms'
import os
from os import path
'QT_QPA_PLATFORM_PLUGIN_PATH'] = 'C:/Users/Sebastien/Anaconda3/Library/plugins/platforms'
os.environ[".")
os.chdir(
import matplotlib.pyplot as plt
import seaborn as sns
set()
sns.
2021)
tf.random.set_seed(
# calcul de la rmse
def rmse(u,v):
return int(mean_squared_error(u,v)**1/2)
Les versions Python et TensorFlow utilisees.
sys.version tf.__version__
'3.9.6 (default, Jul 30 2021, 11:42:22) [MSC v.1916 64 bit (AMD64)]'
'2.6.0'
1.2 Description des donnees Airline Passenger
Il s’agit du nombre mensuel de passagers du secteur aerien de 1949 a 1960, donnees qu’on a deja utilise pour tester le module prophet dans un autre document.
= data.frame(AirPassengers)
donnees_r "Month"] = c(sapply(1949:1960, function(x) paste(x, month.abb)))
donnees_r["Passengers"] = donnees_r$AirPassengers
donnees_r[$AirPassengers = NULL donnees_r
= r.donnees_r
donnees donnees.head()
Month Passengers
0 1949 Jan 112.0
1 1949 Feb 118.0
2 1949 Mar 132.0
3 1949 Apr 129.0
4 1949 May 121.0
= {'Passengers':'X'}, inplace = True)
donnees.rename(columns = donnees.X.astype('float32')
donnees.X = True) donnees.reset_index(drop
Month X
0 1949 Jan 112.0
1 1949 Feb 118.0
2 1949 Mar 132.0
3 1949 Apr 129.0
4 1949 May 121.0
.. ... ...
139 1960 Aug 606.0
140 1960 Sep 508.0
141 1960 Oct 461.0
142 1960 Nov 390.0
143 1960 Dec 432.0
[144 rows x 2 columns]
La serie est multiplicative avec une saisonnalite de periode 12 et la tendance est lineaire par morceaux.
= 12
periode = sm.tsa.seasonal_decompose(donnees.X, model='multiplicative', period = 12)
decomposition
decomposition.plot() plt.show()
2 Modelisation par tendance et saisonnalite
On definit une colonne “partition” pour scinder les donnees en jeux d’apprentissage (donnees.partition == True
) et de test, l’apprentissage allant jusqu’a mars 1956.
"partition"] = pd.Series(donnees.index) <= 0.6 * len(donnees)
donnees["partition"].value_counts() donnees[
True 87
False 57
Name: partition, dtype: int64
2.1 Modele lineaire
On se place d’avril 1953 a mars 1956, soit les 3 dernieres annees de l’apprentissage, pour obtenir une tendance par moyenne mobile et une saisonnalite les plus fiables afin de realiser une prevision par regression lineaire.
# X = tendance * saisonnalite * bruit
# profondeur de calcul de la tendance a partir des donnees recentes de l'apprentissage
= 12 * 3
K
= donnees[donnees.partition].copy()
dtf = dtf[-K:]
dtf
= sm.tsa.seasonal_decompose(dtf.X, model='multiplicative', period = periode)
decomposition
"temps"] = list(dtf.index)
dtf["tendance"] = decomposition.trend
dtf[ dtf
Month X partition temps tendance
51 1953 Apr 235.0 True 51 NaN
52 1953 May 229.0 True 52 NaN
53 1953 Jun 243.0 True 53 NaN
54 1953 Jul 264.0 True 54 NaN
55 1953 Aug 272.0 True 55 NaN
56 1953 Sep 237.0 True 56 NaN
57 1953 Oct 211.0 True 57 224.583333
58 1953 Nov 180.0 True 58 224.458333
59 1953 Dec 201.0 True 59 225.541667
60 1954 Jan 204.0 True 60 228.000000
61 1954 Feb 188.0 True 61 230.458333
62 1954 Mar 235.0 True 62 232.250000
63 1954 Apr 227.0 True 63 233.916667
64 1954 May 234.0 True 64 235.625000
65 1954 Jun 264.0 True 65 237.750000
66 1954 Jul 302.0 True 66 240.500000
67 1954 Aug 293.0 True 67 243.958333
68 1954 Sep 259.0 True 68 247.166667
69 1954 Oct 229.0 True 69 250.250000
70 1954 Nov 203.0 True 70 253.500000
71 1954 Dec 229.0 True 71 257.125000
72 1955 Jan 242.0 True 72 261.833333
73 1955 Feb 233.0 True 73 266.666667
74 1955 Mar 267.0 True 74 271.125000
75 1955 Apr 269.0 True 75 275.208333
76 1955 May 270.0 True 76 278.500000
77 1955 Jun 315.0 True 77 281.958333
78 1955 Jul 364.0 True 78 285.750000
79 1955 Aug 347.0 True 79 289.333333
80 1955 Sep 312.0 True 80 293.250000
81 1955 Oct 274.0 True 81 NaN
82 1955 Nov 237.0 True 82 NaN
83 1955 Dec 278.0 True 83 NaN
84 1956 Jan 284.0 True 84 NaN
85 1956 Feb 277.0 True 85 NaN
86 1956 Mar 317.0 True 86 NaN
On modelise lineairement la tendance et on recupere la saisonnalite calculee par statsmodels, ce qui permet d’en deduire la serie residuelle.
= (dtf.temps.min() // periode + 1) * periode
debut_saison
= list(decomposition.seasonal.loc[debut_saison:(debut_saison + periode - 1)])
saisons = len(donnees) // periode + 1
repet_saisons
= True)
dtf.dropna(inplace
= LinearRegression();
reg "temps"]], dtf.tendance);
reg.fit(dtf[[
"tendance"] = reg.predict(pd.Series(range(len(donnees))).to_frame())
donnees["saisons"] = (saisons*repet_saisons)[:len(donnees)]
donnees["residus"] = donnees.X / donnees.tendance / donnees.saisons donnees[
2.2 Qualite du modele
La tendance lineaire, les residus et la serie de donnees complete, on voit qu’avant avril 1953 la tendance avait une pente differente.
"X", "tendance"]].plot();
donnees[[ plt.show()
"residus", "saisons"]].plot();
donnees[[ plt.show()
On prevoit les 57 valeurs du futur en une fois par une modelisation parametrique simple.
"prev"] = donnees.tendance * donnees.saisons
donnees[= ~donnees.partition
test "X", "prev"]].plot();
donnees.loc[test, [f"rmse = {rmse(donnees.prev[test], donnees.X[test])}");
plt.title( plt.show()
3 Prevision du mois suivant par modeles neuronaux
On va proceder de deux manieres a partir de la connaissance des K derniers mois :
- par regression lineaire et par couche Dense appliquees a K variables (on peut utiliser tout modele de regression de Machine Learning)
- par couches récurrentes RNN et GRU et par couche de convolution TCN
On choisit K = 12
.
3.1 Early stopping et graphiques de performance
Si la perte ne diminue plus sur l’echantillon de validation “val_loss” lors d’une succession de 50 epoques, l’entrainement s’arrete et revient a la meilleure perte observee.
= EarlyStopping(
early_stopping = 'val_loss',
monitor = 1,
verbose = 50,
patience = True) restore_best_weights
Graphiques qui permettent de detecter le surapprentissage du modele (courbe de perte pour la validation superieure a celle de l’apprentissage) et l’evolution de la metrique “metier”, ici la rmse.
def perf(histoire):
= pd.DataFrame(histoire.history)
dtf = dtf.columns
colonnes
= dtf.reset_index().rename(columns = {'index': 'epochs'})
dtf = pd.melt(dtf, id_vars = ['epochs'], value_vars = colonnes,
dtf_tr ='noms_col', value_name='valeurs_col')
var_name
"metrique"] = dtf_tr.noms_col.str.replace("^val_", "", regex = True)
dtf_tr["echantillon"] = "val"
dtf_tr[== dtf_tr.metrique, "echantillon"] = "train"
dtf_tr.loc[dtf_tr.noms_col
= sns.FacetGrid(dtf_tr, col="metrique", hue = "echantillon", sharey = False, col_wrap = 2)
g = g.map_dataframe(sns.lineplot, x = "epochs",y = "valeurs_col").add_legend()
g = g.axes
axes 0].set_ylim(0,10000)
axes[1].set_ylim(0,150)
axes[ plt.show()
3.2 Preparation des donnees
3.2.1 Modele lineaire et couche Dense
On cree les K colonnes des mois precedents.
= "prev", inplace = True)
donnees.drop(columns = donnees.copy()
dtf_Xcol
for i in range(K-1):
"X"+str(i+1)] =dtf_Xcol.X.shift(-i-1)
dtf_Xcol[
"Y"] = dtf_Xcol.X.shift(-K)
dtf_Xcol[= True)
dtf_Xcol.dropna(inplace
= ["X"] + ["X"+str(i+1) for i in range(K-1)]
colonnes
= dtf_Xcol.loc[dtf_Xcol.partition, "Y"]
Y_train
= dtf_Xcol.loc[dtf_Xcol.partition, colonnes]
train_dense = dtf_Xcol.loc[~dtf_Xcol.partition, colonnes]
test_dense dtf_Xcol
Month X partition tendance saisons residus X1 X2 \
0 1949 Jan 112.0 True 36.816081 0.912383 3.334289 118.0 132.0
1 1949 Feb 118.0 True 39.970048 0.847441 3.483678 132.0 129.0
2 1949 Mar 132.0 True 43.124016 1.001484 3.056404 129.0 121.0
3 1949 Apr 129.0 True 46.277983 0.977029 2.853038 121.0 135.0
4 1949 May 121.0 True 49.431950 0.984408 2.486580 135.0 148.0
.. ... ... ... ... ... ... ... ...
127 1959 Aug 559.0 False 437.369940 1.203979 1.061559 463.0 407.0
128 1959 Sep 463.0 False 440.523907 1.059261 0.992221 407.0 362.0
129 1959 Oct 407.0 False 443.677874 0.930246 0.986117 362.0 405.0
130 1959 Nov 362.0 False 446.831842 0.803905 1.007766 405.0 417.0
131 1959 Dec 405.0 False 449.985809 0.893732 1.007045 417.0 391.0
X3 X4 X5 X6 X7 X8 X9 X10 X11 Y
0 129.0 121.0 135.0 148.0 148.0 136.0 119.0 104.0 118.0 115.0
1 121.0 135.0 148.0 148.0 136.0 119.0 104.0 118.0 115.0 126.0
2 135.0 148.0 148.0 136.0 119.0 104.0 118.0 115.0 126.0 141.0
3 148.0 148.0 136.0 119.0 104.0 118.0 115.0 126.0 141.0 135.0
4 148.0 136.0 119.0 104.0 118.0 115.0 126.0 141.0 135.0 125.0
.. ... ... ... ... ... ... ... ... ... ...
127 362.0 405.0 417.0 391.0 419.0 461.0 472.0 535.0 622.0 606.0
128 405.0 417.0 391.0 419.0 461.0 472.0 535.0 622.0 606.0 508.0
129 417.0 391.0 419.0 461.0 472.0 535.0 622.0 606.0 508.0 461.0
130 391.0 419.0 461.0 472.0 535.0 622.0 606.0 508.0 461.0 390.0
131 419.0 461.0 472.0 535.0 622.0 606.0 508.0 461.0 390.0 432.0
[132 rows x 18 columns]
3.2.2 Couches Recurrentes et Convolutives
On compile les K colonnes en une colonne de listes et on met le tenseur a la bonne dimension : nombre d’echantillons * historique de profondeur K * dimension de chaque valeur (1 pour notre serie univariee).
= dtf_Xcol.copy()
dtf_Xlist
"val_prec"] = dtf_Xlist[colonnes].values.tolist()
dtf_Xlist[= colonnes, inplace = True)
dtf_Xlist.drop(columns
= list(dtf_Xlist.loc[dtf_Xlist.partition, "val_prec"])
X_train = list(dtf_Xlist.loc[~dtf_Xlist.partition, "val_prec"])
X_test
= np.reshape(X_train, (len(X_train), K, 1))
X_train = np.reshape(X_test, (len(X_test), K, 1))
X_test "val_prec", "Y"]] dtf_Xlist[[
val_prec Y
0 [112.0, 118.0, 132.0, 129.0, 121.0, 135.0, 148... 115.0
1 [118.0, 132.0, 129.0, 121.0, 135.0, 148.0, 148... 126.0
2 [132.0, 129.0, 121.0, 135.0, 148.0, 148.0, 136... 141.0
3 [129.0, 121.0, 135.0, 148.0, 148.0, 136.0, 119... 135.0
4 [121.0, 135.0, 148.0, 148.0, 136.0, 119.0, 104... 125.0
.. ... ...
127 [559.0, 463.0, 407.0, 362.0, 405.0, 417.0, 391... 606.0
128 [463.0, 407.0, 362.0, 405.0, 417.0, 391.0, 419... 508.0
129 [407.0, 362.0, 405.0, 417.0, 391.0, 419.0, 461... 461.0
130 [362.0, 405.0, 417.0, 391.0, 419.0, 461.0, 472... 390.0
131 [405.0, 417.0, 391.0, 419.0, 461.0, 472.0, 535... 432.0
[132 rows x 2 columns]
3.3 Architecture et entrainement des modeles
3.3.1 Regression
= LinearRegression();
model_lin ; model_lin.fit(train_dense, Y_train)
3.3.2 Couche Dense
= Sequential()
model_dense 100, activation = 'relu', input_dim = len(colonnes)))
model_dense.add(Dense(1))
model_dense.add(Dense(compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_dense.
= model_dense.fit(train_dense,
history_dense
Y_train, = 100,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
3.3.3 RNN
= Sequential()
model_rnn 256, activation = 'relu', input_shape = (K, 1)))
model_rnn.add(SimpleRNN(0.2))
model_rnn.add(Dropout(1))
model_rnn.add(Dense(compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_rnn.
= model_rnn.fit(X_train,
history_rnn
Y_train, = 300,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
Restoring model weights from the end of the best epoch.
Epoch 00287: early stopping
3.3.4 GRU
= Sequential()
model_gru 256, activation='relu', input_shape = (K, 1)))
model_gru.add(GRU(0.2))
model_gru.add(Dropout(1))
model_gru.add(Dense(compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_gru.
= model_gru.fit(X_train,
history_gru
Y_train, = 200,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
3.3.5 TCN
= TCN(input_shape = (K, 1),
tcn_layer = 50,
nb_filters = 12,
kernel_size = (1, 2))
dilations
print('Receptive field size =', tcn_layer.receptive_field)
= Sequential()
model_tcn
model_tcn.add(tcn_layer)0.2))
model_tcn.add(Dropout(1))
model_tcn.add(Dense(compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_tcn.
= model_tcn.fit(X_train,
history_tcn
Y_train, = 300,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
Receptive field size = 67
Restoring model weights from the end of the best epoch.
Epoch 00164: early stopping
3.4 Performance lors de l’entrainement
3.4.1 Couche Dense
perf(history_dense)
3.4.2 RNN
perf(history_rnn)
3.4.3 GRU
perf(history_gru)
3.4.4 TCN
perf(history_tcn)
3.5 Qualite de la prevision sur l’echantillon test
3.5.1 Regression
"prev"] = model_lin.predict(dtf_Xcol[colonnes]); test = ~dtf_Xcol.partition
dtf_Xcol["Y", "prev"]].plot();
dtf_Xcol.loc[test, [f"rmse = {rmse(dtf_Xcol.prev[test], dtf_Xcol.Y[test])}")
plt.title(= (300, 650)) plt.show(ylim
3.5.2 Couche Dense
"prev"] = model_dense.predict(dtf_Xcol[colonnes]);
dtf_Xcol["Y", "prev"]].plot();
dtf_Xcol.loc[test, [f"rmse = {rmse(dtf_Xcol.prev[test], dtf_Xcol.Y[test])}")
plt.title(= (300, 650)) plt.show(ylim
3.5.3 RNN
= np.concatenate((X_train, X_test))
X "prev"] = model_rnn.predict(X); test = ~dtf_Xlist.partition
dtf_Xlist["Y", "prev"]].plot();
dtf_Xlist.loc[test, [f"rmse = {rmse(dtf_Xlist.prev[test], dtf_Xlist.Y[test])}")
plt.title(= (300, 650)) plt.show(ylim
3.5.4 GRU
"prev"] = model_gru.predict(X)
dtf_Xlist["Y", "prev"]].plot();
dtf_Xlist.loc[test, [f"rmse = {rmse(dtf_Xlist.prev[test], dtf_Xlist.Y[test])}")
plt.title(= (300, 650)) plt.show(ylim
3.5.5 TCN
"prev"] = model_tcn.predict(X)
dtf_Xlist["Y", "prev"]].plot();
dtf_Xlist.loc[test, [f"rmse = {rmse(dtf_Xlist.prev[test], dtf_Xlist.Y[test])}")
plt.title(= (300, 650)) plt.show(ylim
4 Prevision en bloc des L mois suivants
On choisit L = 12
.
4.1 Preparation des donnees
On prepare les donnees selon le meme schema que plus haut, avec L colonnes cibles au lieu d’une.
4.1.1 Couche Dense
= donnees.copy()
dtf_Xcol
for i in range(K-1):
"X"+str(i+1)] =dtf_Xcol.X.shift(-i-1)
dtf_Xcol[
for i in range(L):
"Y"+str(i+1)] =dtf_Xcol.X.shift(-K-i)
dtf_Xcol[
= True)
dtf_Xcol.dropna(inplace
= ["Y"+str(i+1) for i in range(L)]
colonnesY = dtf_Xcol.loc[dtf_Xcol.partition, colonnesY].values
Y_train
= colonnesY, inplace = True)
dtf_Xcol.drop(columns
= ["X"] + ["X"+str(i+1) for i in range(K-1)]
colonnes
= dtf_Xcol.loc[dtf_Xcol.partition, colonnes]
train_dense = dtf_Xcol.loc[~dtf_Xcol.partition, colonnes] test_dense
4.1.2 Couches Recurrentes
= dtf_Xcol.copy()
dtf_Xlist
"val_prec"] = dtf_Xlist[colonnes].values.tolist()
dtf_Xlist[= colonnes, inplace = True)
dtf_Xlist.drop(columns
= list(dtf_Xlist.loc[dtf_Xlist.partition, "val_prec"])
X_train = list(dtf_Xlist.loc[~dtf_Xlist.partition, "val_prec"])
X_test
= np.reshape(X_train, (len(X_train), K, 1))
X_train = np.reshape(X_test, (len(X_test), K, 1))
X_test dtf_Xlist
Month partition tendance saisons residus \
0 1949 Jan True 36.816081 0.912383 3.334289
1 1949 Feb True 39.970048 0.847441 3.483678
2 1949 Mar True 43.124016 1.001484 3.056404
3 1949 Apr True 46.277983 0.977029 2.853038
4 1949 May True 49.431950 0.984408 2.486580
.. ... ... ... ... ...
116 1958 Sep False 402.676298 1.059261 0.947158
117 1958 Oct False 405.830266 0.930246 0.950938
118 1958 Nov False 408.984233 0.803905 0.942867
119 1958 Dec False 412.138200 0.893732 0.914913
120 1959 Jan False 415.292168 0.912383 0.950105
val_prec
0 [112.0, 118.0, 132.0, 129.0, 121.0, 135.0, 148...
1 [118.0, 132.0, 129.0, 121.0, 135.0, 148.0, 148...
2 [132.0, 129.0, 121.0, 135.0, 148.0, 148.0, 136...
3 [129.0, 121.0, 135.0, 148.0, 148.0, 136.0, 119...
4 [121.0, 135.0, 148.0, 148.0, 136.0, 119.0, 104...
.. ...
116 [404.0, 359.0, 310.0, 337.0, 360.0, 342.0, 406...
117 [359.0, 310.0, 337.0, 360.0, 342.0, 406.0, 396...
118 [310.0, 337.0, 360.0, 342.0, 406.0, 396.0, 420...
119 [337.0, 360.0, 342.0, 406.0, 396.0, 420.0, 472...
120 [360.0, 342.0, 406.0, 396.0, 420.0, 472.0, 548...
[121 rows x 6 columns]
4.2 Architecture et entrainement des modeles
4.2.1 Couche Dense
= Sequential()
model_dense2 100, activation = 'relu', input_dim = len(colonnes)))
model_dense2.add(Dense(
model_dense2.add(Dense(L))compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_dense2.
= model_dense2.fit(train_dense,
history_dense
Y_train, = 100,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
4.2.2 RNN
= Sequential()
model_rnn2 260, activation='relu', input_shape = (K, 1)))
model_rnn2.add(SimpleRNN(0.2))
model_rnn2.add(Dropout(
model_rnn2.add(Dense(L))compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_rnn2.
= model_rnn2.fit(X_train,
history_rnn
Y_train, = 300,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
4.2.3 GRU
= Sequential()
model_gru2 256, activation='relu', input_shape = (K, 1)))
model_gru2.add(GRU(0.2))
model_gru2.add(Dropout(
model_gru2.add(Dense(L))compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_gru2.
= model_gru2.fit(X_train,
history_gru
Y_train, = 300,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
4.2.4 TCN
= TCN(input_shape = (K, 1),
tcn_layer = 30,
nb_filters = 3,
kernel_size = (1, 2))
dilations
print('Receptive field size =', tcn_layer.receptive_field)
= Sequential()
model_tcn2
model_tcn2.add(tcn_layer)0.2))
model_tcn2.add(Dropout(
model_tcn2.add(Dense(L))compile(loss = "mean_squared_error", metrics = [tf.keras.metrics.RootMeanSquaredError()])
model_tcn2.
= model_tcn2.fit(X_train,
history_tcn
Y_train, = 300,
epochs = 16,
batch_size = 0,
verbose = 0.3,
validation_split = [early_stopping]) callbacks
Receptive field size = 13
4.3 Performance lors de l’entrainement
4.3.1 Couche Dense
perf(history_dense)
4.3.2 RNN
perf(history_rnn)
4.3.3 GRU
perf(history_gru)
4.3.4 TCN
perf(history_tcn)
4.4 Qualite de la prevision sur l’annee 1960
4.4.1 Couche Dense
= pd.DataFrame({"reel": donnees.X[-L:],
resultats "prev": np.squeeze(model_dense2.predict(dtf_Xcol.tail(1)[colonnes]))})
;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
4.4.2 RNN
= np.reshape(X_test[-1,:], (1,L,1))
test = pd.DataFrame({"reel": donnees.X[-L:],
resultats "prev": np.squeeze(model_rnn2.predict(test))})
;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
4.4.3 GRU
= pd.DataFrame({"reel": donnees.X[-L:],
resultats "prev": np.squeeze(model_gru2.predict(test))})
;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
4.4.4 TCN
= pd.DataFrame({"reel": donnees.X[-L:],
resultats "prev": np.squeeze(model_tcn2.predict(test))})
;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
5 Prevision iteree des L mois suivants
On reprend les modeles entraines pour predire la valeur suivante. Cette nouvelle valeur est ensuite consideree comme la derniere valeur connue, et on reapplique les modeles pour predire la valeur qui la suit, etc.
5.1 Calcul des previsions
5.1.1 Regression
= dtf_Xcol[colonnes].tail(1)
dernieres_valeurs = dernieres_valeurs.columns
noms
for i in range(L):
= model_lin.predict(dernieres_valeurs)[0]
prev = dernieres_valeurs.values[0] .tolist()[1:]
decale_valeurs
decale_valeurs.append(prev)= pd.DataFrame(np.reshape(decale_valeurs, (1,12)), columns = noms)
dernieres_valeurs
= dernieres_valeurs.values[0] .tolist() prev_lin
5.1.2 Couche Dense
= dtf_Xcol[colonnes].tail(1)
dernieres_valeurs = dernieres_valeurs.columns
noms
for i in range(L):
= model_dense.predict(dernieres_valeurs)[0][0]
prev = dernieres_valeurs.values[0] .tolist()[1:]
decale_valeurs
decale_valeurs.append(prev)= pd.DataFrame(np.reshape(decale_valeurs, (1,12)), columns = noms)
dernieres_valeurs
= dernieres_valeurs.values[0] .tolist() prev_dense
5.1.3 RNN
= X_test.shape
dims = X_test[dims[0] - 1,:,0]
dernieres_valeurs = np.reshape(dernieres_valeurs, (1,K,1))
dernieres_valeurs
for i in range(L):
= model_rnn.predict(dernieres_valeurs)[0][0]
prev = dernieres_valeurs[0,:,0].tolist()[1:]
decale_valeurs
decale_valeurs.append(prev)= np.reshape(decale_valeurs, (1,K,1))
dernieres_valeurs
= dernieres_valeurs[0,:,0].tolist() prev_rnn
5.1.4 GRU
= X_test.shape
dims = X_test[dims[0] - 1,:,0]
dernieres_valeurs = np.reshape(dernieres_valeurs, (1,K,1))
dernieres_valeurs
for i in range(L):
= model_gru.predict(dernieres_valeurs)[0][0]
prev = dernieres_valeurs[0,:,0].tolist()[1:]
decale_valeurs
decale_valeurs.append(prev)= np.reshape(decale_valeurs, (1,K,1))
dernieres_valeurs
= dernieres_valeurs[0,:,0].tolist() prev_gru
5.1.5 TCN
= X_test.shape
dims = X_test[dims[0] - 1,:,0]
dernieres_valeurs = np.reshape(dernieres_valeurs, (1,K,1))
dernieres_valeurs
for i in range(L):
= model_tcn.predict(dernieres_valeurs)[0][0]
prev = dernieres_valeurs[0,:,0].tolist()[1:]
decale_valeurs
decale_valeurs.append(prev)= np.reshape(decale_valeurs, (1,K,1))
dernieres_valeurs
= dernieres_valeurs[0,:,0].tolist() prev_tcn
5.2 Qualite de la prevision sur l’annee 1960
5.2.1 Regression
= pd.DataFrame({"reel": donnees.X[-L:], "prev": prev_lin})
resultats ;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
5.2.2 Couche Dense
= pd.DataFrame({"reel": donnees.X[-L:], "prev": prev_dense})
resultats ;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
5.2.3 RNN
= pd.DataFrame({"reel": donnees.X[-L:], "prev": prev_rnn})
resultats ;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
5.2.4 GRU
= pd.DataFrame({"reel": donnees.X[-L:], "prev": prev_gru})
resultats ;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim
5.2.5 TCN
= pd.DataFrame({"reel": donnees.X[-L:], "prev": prev_tcn})
resultats ;
resultats.plot()f"rmse = {rmse(resultats.reel, resultats.prev)}")
plt.title(= (300, 650)) plt.show(ylim