better style in report
[talweg.git] / reports / Experiments.gj
CommitLineData
8eafefbc 1-----
4d376294 2# Résultats numériques
b6233fa6 3
4d376294
BA
4Cette partie montre les résultats obtenus avec des variantes de l'algorithme décrit au
5chapitre , en utilisant le package présenté à la section 3. Cet algorithme est
b6233fa6 6systématiquement comparé à deux approches naïves :
63ff1ecb 7
b6233fa6 8 * la moyenne des lendemains des jours "similaires" dans tout le passé, c'est-à-dire
4d376294 9prédiction = moyenne de tous les mardis passés si le jour courant est un lundi.
b6233fa6
BA
10 * la persistence, reproduisant le jour courant ou allant chercher le lendemain de la
11dernière journée "similaire" (même principe que ci-dessus ; argument "same\_day").
12
13Concernant l'algorithme principal à voisins, trois variantes sont étudiées dans cette
14partie :
15
16 * avec simtype="mix" et raccordement "Neighbors" dans le cas "non local", i.e. on va
17chercher des voisins n'importe où du moment qu'ils correspondent au premier élément d'un
18couple de deux jours consécutifs sans valeurs manquantes.
19 * avec simtype="endo" + raccordement "Neighbors" puis simtype="none" + raccordement
20"Zero" (sans ajustement) dans le cas "local" : voisins de même niveau de pollution et
21même saison.
22
23Pour chaque période retenue $-$ chauffage, épandage, semaine non polluée $-$ les erreurs
24de prédiction sont d'abord affichées, puis quelques graphes de courbes réalisées/prévues
25(sur le jour "en moyenne le plus facile" à gauche, et "en moyenne le plus difficile" à
26droite). Ensuite plusieurs types de graphes apportant des précisions sur la nature et la
27difficulté du problème viennent compléter ces premières courbes. Concernant les graphes
28de filaments, la moitié gauche du graphe correspond aux jours similaires au jour courant,
29tandis que la moitié droite affiche les lendemains : ce sont donc les voisinages tels
30qu'utilisés dans l'algorithme.
63ff1ecb 31<%
b6233fa6 32list_titles = ['Pollution par chauffage','Pollution par épandage','Semaine non polluée']
63ff1ecb
BA
33list_indices = ['indices_ch', 'indices_ep', 'indices_np']
34%>
63ff1ecb 35-----r
63ff1ecb
BA
36library(talweg)
37
d09b09b0
BA
38P = ${P} #instant de prévision
39H = ${H} #horizon (en heures)
40
b6233fa6
BA
41ts_data = read.csv(system.file("extdata","pm10_mesures_H_loc_report.csv",
42 package="talweg"))
43exo_data = read.csv(system.file("extdata","meteo_extra_noNAs.csv",
44 package="talweg"))
45# NOTE: 'GMT' because DST gaps are filled and multiple values merged in
46# above dataset. Prediction from P+1 to P+H included.
47data = getData(ts_data, exo_data, input_tz = "GMT", working_tz="GMT",
48 predict_at=P)
63ff1ecb
BA
49
50indices_ch = seq(as.Date("2015-01-18"),as.Date("2015-01-24"),"days")
51indices_ep = seq(as.Date("2015-03-15"),as.Date("2015-03-21"),"days")
52indices_np = seq(as.Date("2015-04-26"),as.Date("2015-05-02"),"days")
ff5df8e3 53% for i in range(3):
63ff1ecb 54-----
8eafefbc
BA
55##<h2 style="color:blue;font-size:2em">${list_titles[i]}</h2>
56${"##"} ${list_titles[i]}
63ff1ecb 57-----r
445e7bbc 58p1 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors", horizon=H,
aa059de7 59 simtype="mix", local=FALSE)
445e7bbc 60p2 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Neighbors", horizon=H,
aa059de7 61 simtype="endo", local=TRUE)
445e7bbc
BA
62p3 = computeForecast(data, ${list_indices[i]}, "Neighbors", "Zero", horizon=H,
63 simtype="none", local=TRUE)
64p4 = computeForecast(data, ${list_indices[i]}, "Average", "Zero", horizon=H)
65p5 = computeForecast(data, ${list_indices[i]}, "Persistence", "Zero", horizon=H,
aa059de7 66 same_day=${'TRUE' if loop.index < 2 else 'FALSE'})
63ff1ecb 67-----r
1f811218
BA
68e1 = computeError(data, p1, H)
69e2 = computeError(data, p2, H)
a3f39d31
BA
70e3 = computeError(data, p3, H)
71e4 = computeError(data, p4, H)
72e5 = computeError(data, p5, H)
63ff1ecb 73options(repr.plot.width=9, repr.plot.height=7)
1f811218 74plotError(list(e1, e5, e4, e2, e3), cols=c(1,2,colors()[258],4,6))
63ff1ecb 75
b6233fa6
BA
76# noir: Neighbors non-local (p1), bleu: Neighbors local endo (p2),
77# mauve: Neighbors local none (p3), vert: moyenne (p4),
78# rouge: persistence (p5)
63ff1ecb 79
63afc6d9 80sum_p123 = e1$abs$indices + e2$abs$indices + e3$abs$indices
b6233fa6
BA
81i_np = which.min(sum_p123) #indice de (veille de) jour "facile"
82i_p = which.max(sum_p123) #indice de (veille de) jour "difficile"
83-----
12119d21 84% if i == 0:
b6233fa6 85L'erreur absolue dépasse 20 sur 1 à 2 jours suivant les modèles (graphe en haut à
4d376294
BA
86droite). Sur cet exemple le modèle à voisins "contraint" (local=TRUE) utilisant des
87pondérations basées sur les similarités de forme (simtype="endo") obtient en moyenne les
88meilleurs résultats, avec un MAPE restant en général inférieur à 30% de 8h à 19h (7+1 à
897+12 : graphe en bas à gauche).
12119d21 90% elif i == 1:
b6233fa6
BA
91Il est difficile dans ce cas de déterminer une méthode meilleure que les autres : elles
92donnent toutes de plutôt mauvais résultats, avec une erreur absolue moyennée sur la
93journée dépassant presque toujours 15 (graphe en haut à droite).
8eafefbc 94% else:
b6233fa6
BA
95Dans ce cas plus favorable les intensité des erreurs absolues ont clairement diminué :
96elles restent souvent en dessous de 5. En revanche le MAPE moyen reste au-delà de 20%, et
97même souvent plus de 30%. Comme dans le cas de l'épandage on constate une croissance
98globale de la courbe journalière d'erreur absolue moyenne (en haut à gauche) ; ceci peut
99être dû au fait que l'on ajuste le niveau du jour à prédire en le recollant sur la
100dernière valeur observée.
101% endif
63ff1ecb
BA
102-----r
103options(repr.plot.width=9, repr.plot.height=4)
104par(mfrow=c(1,2))
105
445e7bbc
BA
106plotPredReal(data, p1, i_np); title(paste("PredReal p1 day",i_np))
107plotPredReal(data, p1, i_p); title(paste("PredReal p1 day",i_p))
63ff1ecb 108
445e7bbc
BA
109plotPredReal(data, p2, i_np); title(paste("PredReal p2 day",i_np))
110plotPredReal(data, p2, i_p); title(paste("PredReal p2 day",i_p))
63ff1ecb 111
445e7bbc
BA
112plotPredReal(data, p3, i_np); title(paste("PredReal p3 day",i_np))
113plotPredReal(data, p3, i_p); title(paste("PredReal p3 day",i_p))
63ff1ecb 114
b6233fa6
BA
115# Bleu : prévue ; noir : réalisée
116-----
12119d21 117% if i == 0:
c8a81efd
BA
118La courbe du jour "facile à prévoir", à gauche, se décompose en deux modes : un léger
119vers 10h (7+3), puis un beaucoup plus marqué vers 19h (7+12). Ces deux modes sont
120retrouvés par les trois variantes de l'algorithme à voisins, bien que l'amplitude soit
121mal prédite. Concernant le jour "difficile à prévoir" (à droite) il y a deux pics en tout
122début et toute fin de journée (à 9h et 23h), qui ne sont pas du tout anticipés par les
123méthodes ; la grande amplitude de ces pics explique alors l'intensité de l'erreur
124observée.
12119d21 125% elif i == 1:
b6233fa6
BA
126Dans le cas d'un jour "facile" à prédire $-$ à gauche $-$ la forme est plus ou moins
127retrouvée, mais le niveau moyen est trop bas (courbe en bleu). Concernant le jour
128"difficile" à droite, non seulement la forme n'est pas anticipée mais surtout le niveau
129prédit est très inférieur au niveau de pollution observé. Comme on le voit ci-dessous
130cela découle d'un manque de voisins au comportement similaire.
8eafefbc 131% else:
b6233fa6
BA
132La forme est raisonnablement retrouvée pour les méthodes "locales", l'autre version
133lissant trop les prédictions. Le biais reste cependant important, surtout en fin de
4d376294 134journée sur la courbes "difficile à prévoir".
b6233fa6 135% endif
63ff1ecb
BA
136-----r
137par(mfrow=c(1,2))
b6233fa6
BA
138f_np1 = computeFilaments(data, p1, i_np, plot=TRUE)
139 title(paste("Filaments p1 day",i_np))
140f_p1 = computeFilaments(data, p1, i_p, plot=TRUE)
141 title(paste("Filaments p1 day",i_p))
63ff1ecb 142
b6233fa6
BA
143f_np2 = computeFilaments(data, p2, i_np, plot=TRUE)
144 title(paste("Filaments p2 day",i_np))
145f_p2 = computeFilaments(data, p2, i_p, plot=TRUE)
146 title(paste("Filaments p2 day",i_p))
147-----
12119d21 148% if i == 0:
b6233fa6
BA
149Les voisins du jour courant (période de 24h allant de 8h à 7h le lendemain) sont affichés
150avec un trait d'autant plus sombre qu'ils sont proches. On constate dans le cas non
151contraint (en haut) une grande variabilité des lendemains, très nette sur le graphe en
152haut à droite. Ceci indique une faible corrélation entre la forme d'une courbe sur une
153période de 24h et la forme sur les 24h suivantes ; **cette observation est la source des
154difficultés rencontrées par l'algorithme sur ce jeu de données.**
12119d21 155% elif i == 1:
b6233fa6
BA
156Les observations sont les mêmes qu'au paragraphe précédent : trop de variabilité des
157lendemains (et même des voisins du jour courant).
8eafefbc 158% else:
b6233fa6
BA
159Les graphes de filaments ont encore la même allure, avec une assez grande variabilité
160observée. Cette observation est cependant trompeuse, comme l'indique plus bas le graphe
161de variabilité relative.
162% endif
63ff1ecb
BA
163-----r
164par(mfrow=c(1,2))
445e7bbc
BA
165plotFilamentsBox(data, f_np1); title(paste("FilBox p1 day",i_np))
166plotFilamentsBox(data, f_p1); title(paste("FilBox p1 day",i_p))
63ff1ecb 167
b6233fa6
BA
168# En pointillés la courbe du jour courant + lendemain (à prédire)
169-----
12119d21 170% if i == 0:
4d376294 171Sur cette boxplot fonctionnelle (voir la fonction fboxplot() du package R "rainbow") on
b6233fa6
BA
172constate essentiellement deux choses : le lendemain d'un voisin "normal" peut se révéler
173être une courbe atypique, fort éloignée de ce que l'on souhaite prédire (courbes bleue et
174rouge à gauche) ; et, dans le cas d'une courbe à prédire atypique (à droite) la plupart
175des voisins sont trop éloignés de la forme à prédire et forcent ainsi un aplatissement de
176la prédiction.
12119d21 177% elif i == 1:
b6233fa6
BA
178On constate la présence d'un voisin au lendemain complètement atypique avec un pic en
179début de journée (courbe en vert à gauche), et d'un autre phénomène semblable avec la
180courbe rouge sur le graphe de droite. Ajouté au fait que le lendemain à prévoir est
181lui-même un jour "hors norme", cela montre l'impossibilité de bien prévoir une courbe en
182utilisant l'algorithme à voisins.
8eafefbc 183% else:
b6233fa6
BA
184On peut réappliquer les mêmes remarques qu'auparavant sur les boxplots fonctionnels :
185lendemains de voisins atypiques, courbe à prévoir elle-même légèrement "hors norme".
186% endif
63ff1ecb
BA
187-----r
188par(mfrow=c(1,2))
445e7bbc
BA
189plotRelVar(data, f_np1); title(paste("StdDev p1 day",i_np))
190plotRelVar(data, f_p1); title(paste("StdDev p1 day",i_p))
63ff1ecb 191
445e7bbc
BA
192plotRelVar(data, f_np2); title(paste("StdDev p2 day",i_np))
193plotRelVar(data, f_p2); title(paste("StdDev p2 day",i_p))
63ff1ecb 194
b6233fa6
BA
195# Variabilité globale en rouge ; sur les voisins (+ lendemains) en noir
196-----
12119d21 197% if i == 0:
b6233fa6
BA
198Ces graphes viennent confirmer l'impression visuelle après observation des filaments. En
199effet, la variabilité globale en rouge (écart-type heure par heure sur l'ensemble des
200couples "aujourd'hui/lendemain"du passé) devrait rester nettement au-dessus de la
201variabilité locale, calculée respectivement sur un voisinage d'une soixantaine de jours
202(pour p1) et d'une dizaine de jours (pour p2). Or on constate que ce n'est pas du tout le
203cas sur la période "lendemain", sauf en partie pour p2 le jour 4 $-$ mais ce n'est pas
204suffisant.
12119d21 205% elif i == 1:
b6233fa6
BA
206Comme précédemment les variabilités locales et globales sont confondues dans les parties
207droites des graphes $-$ sauf pour la version "locale" sur le jour "facile"; mais cette
208bonne propriété n'est pas suffisante si l'on ne trouve pas les bons poids à appliquer.
8eafefbc 209% else:
b6233fa6
BA
210Cette fois la situation idéale est observée : la variabilité globale est nettement
211au-dessus de la variabilité locale. Bien que cela ne suffise pas à obtenir de bonnes
212prédictions de forme, on constate au moins l'amélioration dans la prédiction du niveau.
213% endif
63ff1ecb
BA
214-----r
215par(mfrow=c(1,2))
445e7bbc
BA
216plotSimils(p1, i_np); title(paste("Weights p1 day",i_np))
217plotSimils(p1, i_p); title(paste("Weights p1 day",i_p))
63ff1ecb 218
445e7bbc
BA
219plotSimils(p2, i_np); title(paste("Weights p2 day",i_np))
220plotSimils(p2, i_p); title(paste("Weights p2 day",i_p))
b6233fa6 221-----
12119d21 222% if i == 0:
b6233fa6
BA
223Les poids se concentrent près de 0 dans le cas "non local" (p1), et se répartissent assez
224uniformément dans [ 0, 0.2 ] dans le cas "local" (p2). C'est ce que l'on souhaite
225observer pour éviter d'effectuer une simple moyenne.
12119d21 226% elif i == 1:
b6233fa6
BA
227En comparaison avec le pragraphe précédent on retrouve le même (bon) comportement des
228poids pour la version "non locale". En revanche la fenêtre optimisée est trop grande sur
229le jour "facile" pour la méthode "locale" (voir affichage ci-dessous) : il en résulte des
230poids tous semblables autour de 0.084, l'algorithme effectue donc une moyenne simple $-$
231expliquant pourquoi les courbes mauve et bleue sont très proches sur le graphe d'erreurs.
8eafefbc 232% else:
b6233fa6 233Concernant les poids en revanche, deux cas a priori mauvais se cumulent :
63ff1ecb 234
b6233fa6
BA
235 * les poids dans le cas "non local" ne sont pas assez concentrés autour de 0, menant à
236un lissage trop fort $-$ comme observé sur les graphes des courbes réalisées/prévues ;
237 * les poids dans le cas "local" sont trop semblables (à cause de la trop grande fenêtre
238optimisée par validation croisée, cf. ci-dessous), résultant encore en une moyenne simple
239$-$ mais sur moins de jours, plus proches du jour courant.
240% endif
63ff1ecb 241-----r
b6233fa6
BA
242# Fenêtres sélectionnées dans ]0,7] :
243# "non-local" 2 premières lignes, "local" ensuite
445e7bbc
BA
244p1$getParams(i_np)$window
245p1$getParams(i_p)$window
63ff1ecb 246
445e7bbc
BA
247p2$getParams(i_np)$window
248p2$getParams(i_p)$window
63ff1ecb 249% endfor
b6233fa6 250-----
8eafefbc 251${"##"} Bilan
b6233fa6
BA
252
253Nos algorithmes à voisins ne sont pas adaptés à ce jeu de données où la forme varie
4d376294
BA
254considérablement d'un jour à l'autre. Toutefois, un espoir reste permis par exemple en
255aggrégeant les courbes spatialement (sur plusieurs stations situées dans la même
256agglomération ou dans une même zone).