on the way to R6 class + remove truncated days (simplifications)
[talweg.git] / reports / report_2017-03-01.7h_zero.ipynb
CommitLineData
3a3f16cc
BA
1{
2 "cells": [
3 {
4 "cell_type": "code",
5 "execution_count": null,
6 "metadata": {
7 "collapsed": false
8 },
9 "outputs": [],
10 "source": [
11 "library(talweg)"
12 ]
13 },
14 {
15 "cell_type": "code",
16 "execution_count": null,
17 "metadata": {
18 "collapsed": false
19 },
20 "outputs": [],
21 "source": [
22 "data = getData(ts_data=\"../data/pm10_mesures_H_loc.csv\", exo_data=\"../data/meteo_extra_noNAs.csv\",\n",
23 " input_tz = \"Europe/Paris\", working_tz=\"Europe/Paris\", predict_at=7)"
24 ]
25 },
26 {
27 "cell_type": "markdown",
28 "metadata": {},
29 "source": [
30 "## Introduction\n",
31 "\n",
32 "J'ai fait quelques essais dans différentes configurations pour la méthode \"Neighbors\" (la seule dont on a parlé).<br>Il semble que le mieux soit\n",
33 "\n",
34 " * simtype=\"mix\" : on utilise les similarités endogènes et exogènes (fenêtre optimisée par VC)\n",
35 " * same_season=FALSE : les indices pour la validation croisée ne tiennent pas compte des saisons\n",
36 " * mix_strategy=\"mult\" : on multiplie les poids (au lieu d'en éteindre)\n",
37 "\n",
38 "J'ai systématiquement comparé à deux autres approches : la persistence et la répétition de la dernière valeur observée (sur tout l'horizon, donc \"zero\") ; à chaque fois sans prédiction du saut (sauf pour Neighbors : prédiction basée sur les poids calculés).\n",
39 "\n",
40 "Ensuite j'affiche les erreurs, quelques courbes prévues/mesurées, quelques filaments puis les histogrammes de quelques poids. Concernant les graphes de filaments, la moitié gauche du graphe correspond aux jours similaires au jour courant, tandis que la moitié droite affiche les lendemains : ce sont donc les voisinages tels qu'utilisés dans l'algorithme.\n",
41 "\n",
42 "<h2 style=\"color:blue;font-size:2em\">Pollution par chauffage</h2>"
43 ]
44 },
45 {
46 "cell_type": "code",
47 "execution_count": null,
48 "metadata": {
49 "collapsed": false
50 },
51 "outputs": [],
52 "source": [
53 "indices = seq(as.Date(\"2015-01-18\"),as.Date(\"2015-01-24\"),\"days\")\n",
54 "p_ch_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
55 "p_ch_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=TRUE)\n",
56 "#p_ch_az = getForecast(data, indices, \"Average\", \"Zero\")\n",
57 "p_ch_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
58 "#p_ch_l = getForecast(data, indices, \"Level\", same_day=FALSE)"
59 ]
60 },
61 {
62 "cell_type": "code",
63 "execution_count": null,
64 "metadata": {
65 "collapsed": false
66 },
67 "outputs": [],
68 "source": [
69 "e_ch_nn = getError(data, p_ch_nn)\n",
70 "e_ch_pz = getError(data, p_ch_pz)\n",
71 "#e_ch_az = getError(data, p_ch_az)\n",
72 "e_ch_zz = getError(data, p_ch_zz)\n",
73 "#e_ch_l = getError(data, p_ch_l)\n",
74 "options(repr.plot.width=9, repr.plot.height=6)\n",
75 "plotError(list(e_ch_nn, e_ch_pz, e_ch_zz), cols=c(1,2,colors()[258]))\n",
76 "\n",
77 "#Noir: neighbors, rouge: persistence, vert: zero"
78 ]
79 },
80 {
81 "cell_type": "markdown",
82 "metadata": {},
83 "source": [
84 "La méthode Neighbors fait assez nettement mieux que les autres dans ce cas."
85 ]
86 },
87 {
88 "cell_type": "code",
89 "execution_count": null,
90 "metadata": {
91 "collapsed": false
92 },
93 "outputs": [],
94 "source": [
95 "par(mfrow=c(1,2))\n",
96 "options(repr.plot.width=9, repr.plot.height=4)\n",
97 "plotPredReal(data, p_ch_nn, 3)\n",
98 "plotPredReal(data, p_ch_nn, 4)\n",
99 "\n",
100 "#Bleu: prévue, noir: réalisée"
101 ]
102 },
103 {
104 "cell_type": "markdown",
105 "metadata": {},
106 "source": [
107 "Prédictions d'autant plus lisses que le jour à prévoir est atypique (pollué)."
108 ]
109 },
4c59ec9a
BA
110 {
111 "cell_type": "code",
112 "execution_count": null,
113 "metadata": {
114 "collapsed": false
115 },
116 "outputs": [],
117 "source": [
118 "par(mfrow=c(1,2))\n",
119 "plotPredReal(data, p_ch_zz, 3)\n",
120 "plotPredReal(data, p_ch_zz, 6)\n",
121 "\n",
122 "#Méthode \"zero\" :"
123 ]
124 },
3a3f16cc
BA
125 {
126 "cell_type": "code",
127 "execution_count": null,
128 "metadata": {
129 "collapsed": false
130 },
131 "outputs": [],
132 "source": [
133 "par(mfrow=c(1,2))\n",
134 "plotFilaments(data, p_ch_nn$getIndexInData(3))\n",
135 "plotFilaments(data, p_ch_nn$getIndexInData(4))"
136 ]
137 },
138 {
139 "cell_type": "markdown",
140 "metadata": {},
141 "source": [
142 "Beaucoup de courbes similaires dans le cas peu pollué, très peu pour un jour pollué."
143 ]
144 },
145 {
146 "cell_type": "code",
147 "execution_count": null,
148 "metadata": {
149 "collapsed": false
150 },
151 "outputs": [],
152 "source": [
153 "par(mfrow=c(1,3))\n",
154 "plotSimils(p_ch_nn, 3)\n",
155 "plotSimils(p_ch_nn, 4)\n",
156 "plotSimils(p_ch_nn, 5)\n",
157 "\n",
158 "#Non pollué à gauche, pollué au milieu, autre pollué à droite"
159 ]
160 },
161 {
162 "cell_type": "markdown",
163 "metadata": {},
164 "source": [
165 "La plupart des poids très proches de zéro ; pas pour le jour 5 : autre type de jour, cf. ci-dessous."
166 ]
167 },
168 {
169 "cell_type": "code",
170 "execution_count": null,
171 "metadata": {
172 "collapsed": false
173 },
174 "outputs": [],
175 "source": [
176 "par(mfrow=c(1,2))\n",
177 "plotPredReal(data, p_ch_nn, 5)\n",
178 "plotFilaments(data, p_ch_nn$getIndexInData(5))"
179 ]
180 },
181 {
182 "cell_type": "markdown",
183 "metadata": {},
184 "source": [
185 "<h2 style=\"color:blue;font-size:2em\">Pollution par épandage</h2>"
186 ]
187 },
188 {
189 "cell_type": "code",
190 "execution_count": null,
191 "metadata": {
192 "collapsed": false
193 },
194 "outputs": [],
195 "source": [
196 "indices = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n",
197 "p_ep_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
198 "p_ep_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=TRUE)\n",
199 "#p_ep_az = getForecast(data, indices, \"Average\", \"Zero\")\n",
200 "p_ep_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
201 "#p_ep_l = getForecast(data, indices, \"Level\", same_day=TRUE)"
202 ]
203 },
204 {
205 "cell_type": "code",
206 "execution_count": null,
207 "metadata": {
208 "collapsed": false
209 },
210 "outputs": [],
211 "source": [
212 "e_ep_nn = getError(data, p_ep_nn)\n",
213 "e_ep_pz = getError(data, p_ep_pz)\n",
214 "#e_ep_az = getError(data, p_ep_az)\n",
215 "e_ep_zz = getError(data, p_ep_zz)\n",
216 "#e_ep_l = getError(data, p_ep_l)\n",
217 "options(repr.plot.width=9, repr.plot.height=6)\n",
218 "plotError(list(e_ep_nn, e_ep_pz, e_ep_zz), cols=c(1,2,colors()[258]))\n",
219 "\n",
220 "#Noir: neighbors, rouge: persistence, vert: zero"
221 ]
222 },
223 {
224 "cell_type": "markdown",
225 "metadata": {},
226 "source": [
227 "Cette fois les deux méthodes naïves font en moyenne moins d'erreurs que Neighbors. Prédiction trop difficile ?"
228 ]
229 },
230 {
231 "cell_type": "code",
232 "execution_count": null,
233 "metadata": {
234 "collapsed": false
235 },
236 "outputs": [],
237 "source": [
238 "par(mfrow=c(1,2))\n",
239 "options(repr.plot.width=9, repr.plot.height=4)\n",
240 "plotPredReal(data, p_ep_nn, 4)\n",
4c59ec9a
BA
241 "plotPredReal(data, p_ep_nn, 6)\n",
242 "\n",
243 "#Bleu: prévue, noir: réalisée"
3a3f16cc
BA
244 ]
245 },
246 {
247 "cell_type": "markdown",
248 "metadata": {},
249 "source": [
250 "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 6)."
251 ]
252 },
4c59ec9a
BA
253 {
254 "cell_type": "code",
255 "execution_count": null,
256 "metadata": {
257 "collapsed": false
258 },
259 "outputs": [],
260 "source": [
261 "par(mfrow=c(1,2))\n",
262 "plotPredReal(data, p_ep_zz, 4)\n",
263 "plotPredReal(data, p_ep_zz, 6)\n",
264 "\n",
265 "#Méthode \"zero\" :"
266 ]
267 },
3a3f16cc
BA
268 {
269 "cell_type": "code",
270 "execution_count": null,
271 "metadata": {
272 "collapsed": false
273 },
274 "outputs": [],
275 "source": [
276 "par(mfrow=c(1,2))\n",
277 "plotFilaments(data, p_ep_nn$getIndexInData(4))\n",
278 "plotFilaments(data, p_ep_nn$getIndexInData(6))"
279 ]
280 },
281 {
282 "cell_type": "code",
283 "execution_count": null,
284 "metadata": {
285 "collapsed": false
286 },
287 "outputs": [],
288 "source": [
289 "par(mfrow=c(1,2))\n",
290 "plotSimils(p_ep_nn, 4)\n",
291 "plotSimils(p_ep_nn, 6)"
292 ]
293 },
294 {
295 "cell_type": "markdown",
296 "metadata": {},
297 "source": [
298 "Même observation concernant les poids : concentrés près de zéro pour les prédictions avec peu de voisins."
299 ]
300 },
301 {
302 "cell_type": "markdown",
303 "metadata": {},
304 "source": [
305 "## Semaine non polluée"
306 ]
307 },
308 {
309 "cell_type": "code",
310 "execution_count": null,
311 "metadata": {
312 "collapsed": false
313 },
314 "outputs": [],
315 "source": [
316 "indices = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n",
317 "p_np_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
318 "p_np_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=FALSE)\n",
319 "#p_np_az = getForecast(data, indices, \"Average\", \"Zero\")\n",
320 "p_np_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
321 "#p_np_l = getForecast(data, indices, \"Level\", same_day=FALSE)"
322 ]
323 },
324 {
325 "cell_type": "code",
326 "execution_count": null,
327 "metadata": {
328 "collapsed": false
329 },
330 "outputs": [],
331 "source": [
332 "e_np_nn = getError(data, p_np_nn)\n",
333 "e_np_pz = getError(data, p_np_pz)\n",
334 "#e_np_az = getError(data, p_np_az)\n",
335 "e_np_zz = getError(data, p_np_zz)\n",
336 "#e_np_l = getError(data, p_np_l)\n",
337 "options(repr.plot.width=9, repr.plot.height=6)\n",
338 "plotError(list(e_np_nn, e_np_pz, e_np_zz), cols=c(1,2,colors()[258]))\n",
339 "\n",
340 "#Noir: neighbors, rouge: persistence, vert: zero"
341 ]
342 },
343 {
344 "cell_type": "markdown",
345 "metadata": {},
346 "source": [
347 "Performances des méthodes \"Zero\" et \"Neighbors\" comparables ; mauvais résultats pour la persistence."
348 ]
349 },
350 {
351 "cell_type": "code",
352 "execution_count": null,
353 "metadata": {
354 "collapsed": false
355 },
356 "outputs": [],
357 "source": [
358 "par(mfrow=c(1,2))\n",
359 "options(repr.plot.width=9, repr.plot.height=4)\n",
360 "plotPredReal(data, p_np_nn, 3)\n",
4c59ec9a
BA
361 "plotPredReal(data, p_np_nn, 6)\n",
362 "\n",
363 "#Bleu: prévue, noir: réalisée"
3a3f16cc
BA
364 ]
365 },
366 {
367 "cell_type": "markdown",
368 "metadata": {},
369 "source": [
370 "Les \"bonnes\" prédictions (à gauche) sont tout de même trop lissées."
371 ]
372 },
4c59ec9a
BA
373 {
374 "cell_type": "code",
375 "execution_count": null,
376 "metadata": {
377 "collapsed": false
378 },
379 "outputs": [],
380 "source": [
381 "par(mfrow=c(1,2))\n",
382 "plotPredReal(data, p_np_zz, 4)\n",
383 "plotPredReal(data, p_np_zz, 6)\n",
384 "\n",
385 "#Méthode \"zero\" :"
386 ]
387 },
3a3f16cc
BA
388 {
389 "cell_type": "code",
390 "execution_count": null,
391 "metadata": {
392 "collapsed": false
393 },
394 "outputs": [],
395 "source": [
396 "par(mfrow=c(1,2))\n",
397 "plotFilaments(data, p_np_nn$getIndexInData(3))\n",
398 "plotFilaments(data, p_np_nn$getIndexInData(6))"
399 ]
400 },
401 {
402 "cell_type": "markdown",
403 "metadata": {},
404 "source": [
405 "Jours \"typiques\", donc beaucoup de voisins."
406 ]
407 },
408 {
409 "cell_type": "code",
410 "execution_count": null,
411 "metadata": {
412 "collapsed": false
413 },
414 "outputs": [],
415 "source": [
416 "par(mfrow=c(1,3))\n",
417 "plotSimils(p_np_nn, 3)\n",
418 "plotSimils(p_np_nn, 4)\n",
419 "plotSimils(p_np_nn, 6)"
420 ]
421 },
422 {
423 "cell_type": "markdown",
424 "metadata": {},
425 "source": [
426 "Répartition idéale des poids : quelques uns au-delà de 0.3-0.4, le reste très proche de zéro."
427 ]
428 },
429 {
430 "cell_type": "markdown",
431 "metadata": {},
432 "source": [
433 "## Bilan\n",
434 "\n",
4c59ec9a 435 "Problème difficile : en terme d'erreur moyenne, on ne fait guère mieux que de prédire une série constante égale à la dernière valeur observée (méthode \"zéro\"). La persistence donne parfois de bons résultats mais est trop instable (sensibilité à l'argument <code>same_day</code>).\n",
3a3f16cc
BA
436 "\n",
437 "Comment améliorer la méthode ?"
438 ]
439 }
440 ],
441 "metadata": {
442 "kernelspec": {
443 "display_name": "R",
444 "language": "R",
445 "name": "ir"
446 },
447 "language_info": {
448 "codemirror_mode": "r",
449 "file_extension": ".r",
450 "mimetype": "text/x-r-source",
451 "name": "R",
452 "pygments_lexer": "r",
453 "version": "3.3.2"
454 }
455 },
456 "nbformat": 4,
457 "nbformat_minor": 2
458}