TODO: tests, reports
[talweg.git] / reports / report_2017-03-01.13h_average.ipynb
CommitLineData
fa8078f9
BA
1{
2 "cells": [
3 {
4 "cell_type": "code",
1e20780e 5 "execution_count": null,
fa8078f9
BA
6 "metadata": {
7 "collapsed": false
8 },
9 "outputs": [],
10 "source": [
11 "library(talweg)"
12 ]
13 },
14 {
15 "cell_type": "code",
1e20780e 16 "execution_count": null,
fa8078f9
BA
17 "metadata": {
18 "collapsed": false
19 },
20 "outputs": [],
21 "source": [
22 "data = getData(ts_data=\"../pkg/data/pm10_mesures_H_loc.csv\", exo_data=\"../pkg/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 moyennes des lendemains des jours \"similaires\" dans tout le passé ; à 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",
1e20780e 47 "execution_count": null,
fa8078f9
BA
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\") #, memory=183)\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",
1e20780e 63 "execution_count": null,
fa8078f9
BA
64 "metadata": {
65 "collapsed": false
66 },
1e20780e 67 "outputs": [],
fa8078f9
BA
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_az), cols=c(1,2,colors()[258]))\n",
76 "\n",
77 "#Noir: neighbors, rouge: persistence, vert: moyenne"
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",
1e20780e 89 "execution_count": null,
fa8078f9
BA
90 "metadata": {
91 "collapsed": false
92 },
1e20780e 93 "outputs": [],
fa8078f9
BA
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 },
110 {
111 "cell_type": "code",
1e20780e 112 "execution_count": null,
fa8078f9
BA
113 "metadata": {
114 "collapsed": false
115 },
1e20780e 116 "outputs": [],
fa8078f9
BA
117 "source": [
118 "par(mfrow=c(1,2))\n",
119 "plotPredReal(data, p_ch_az, 3)\n",
120 "plotPredReal(data, p_ch_az, 4)"
121 ]
122 },
123 {
124 "cell_type": "markdown",
125 "metadata": {},
126 "source": [
127 "Les erreurs sont proches, mais les courbes prédites très différentes : avantage à \"Neighbors\""
128 ]
129 },
130 {
131 "cell_type": "code",
1e20780e 132 "execution_count": null,
fa8078f9
BA
133 "metadata": {
134 "collapsed": false
135 },
1e20780e 136 "outputs": [],
fa8078f9
BA
137 "source": [
138 "par(mfrow=c(1,2))\n",
139 "f3 = computeFilaments(data, p_ch_nn$getIndexInData(3), plot=TRUE)\n",
140 "f4 = computeFilaments(data, p_ch_nn$getIndexInData(4), plot=TRUE)"
141 ]
142 },
143 {
144 "cell_type": "code",
1e20780e 145 "execution_count": null,
fa8078f9
BA
146 "metadata": {
147 "collapsed": false
148 },
1e20780e 149 "outputs": [],
fa8078f9
BA
150 "source": [
151 "par(mfrow=c(2,2))\n",
152 "plotFilamentsBox(data, f3$indices)\n",
153 "plotFilamentsBox(data, f3$indices+1)\n",
154 "plotFilamentsBox(data, f4$indices)\n",
155 "plotFilamentsBox(data, f4$indices+1)"
156 ]
157 },
158 {
159 "cell_type": "markdown",
160 "metadata": {},
161 "source": [
162 "Beaucoup de courbes similaires dans le cas peu pollué, très peu pour un jour pollué."
163 ]
164 },
165 {
166 "cell_type": "code",
167 "execution_count": null,
168 "metadata": {
169 "collapsed": false
170 },
171 "outputs": [],
172 "source": [
173 "par(mfrow=c(1,2))\n",
174 "plotSimils(p_ch_nn, 6)\n",
175 "plotSimils(p_ch_nn, 6)\n",
176 "#plotSimils(p_ch_nn, 5)\n",
177 "\n",
178 "#Non pollué à gauche, pollué au milieu, autre pollué à droite"
179 ]
180 },
181 {
182 "cell_type": "markdown",
183 "metadata": {},
184 "source": [
185 "La plupart des poids très proches de zéro ; pas pour le jour 5 : autre type de jour, cf. ci-dessous."
186 ]
187 },
188 {
189 "cell_type": "code",
190 "execution_count": null,
191 "metadata": {
192 "collapsed": false
193 },
194 "outputs": [],
195 "source": [
196 "par(mfrow=c(1,2))\n",
197 "plotPredReal(data, p_ch_nn, 5)\n",
198 "plotFilaments(data, p_ch_nn$getIndexInData(5))"
199 ]
200 },
201 {
202 "cell_type": "markdown",
203 "metadata": {},
204 "source": [
205 "<h2 style=\"color:blue;font-size:2em\">Pollution par épandage</h2>"
206 ]
207 },
208 {
209 "cell_type": "code",
210 "execution_count": null,
211 "metadata": {
212 "collapsed": false
213 },
214 "outputs": [],
215 "source": [
216 "indices = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n",
217 "p_ep_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
218 "p_ep_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=TRUE)\n",
219 "p_ep_az = getForecast(data, indices, \"Average\", \"Zero\") #, memory=183)\n",
220 "#p_ep_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
221 "#p_ep_l = getForecast(data, indices, \"Level\", same_day=TRUE)"
222 ]
223 },
224 {
225 "cell_type": "code",
226 "execution_count": null,
227 "metadata": {
228 "collapsed": false
229 },
230 "outputs": [],
231 "source": [
232 "class(p_ep_nn)"
233 ]
234 },
235 {
236 "cell_type": "code",
237 "execution_count": null,
238 "metadata": {
239 "collapsed": false
240 },
241 "outputs": [],
242 "source": [
243 "e_ep_nn = getError(data, p_ep_nn)\n",
244 "e_ep_pz = getError(data, p_ep_pz)\n",
245 "e_ep_az = getError(data, p_ep_az)\n",
246 "#e_ep_zz = getError(data, p_ep_zz)\n",
247 "#e_ep_l = getError(data, p_ep_l)\n",
248 "options(repr.plot.width=9, repr.plot.height=6)\n",
249 "plotError(list(e_ep_nn, e_ep_pz, e_ep_az), cols=c(1,2,colors()[258]))\n",
250 "\n",
251 "#Noir: neighbors, rouge: persistence, vert: moyenne"
252 ]
253 },
254 {
255 "cell_type": "markdown",
256 "metadata": {},
257 "source": [
258 "Cette fois les deux méthodes naïves font en moyenne moins d'erreurs que Neighbors. Prédiction trop difficile ?"
259 ]
260 },
261 {
262 "cell_type": "code",
263 "execution_count": null,
264 "metadata": {
265 "collapsed": false
266 },
267 "outputs": [],
268 "source": [
269 "par(mfrow=c(1,2))\n",
270 "options(repr.plot.width=9, repr.plot.height=4)\n",
271 "plotPredReal(data, p_ep_nn, 5)\n",
272 "plotPredReal(data, p_ep_nn, 2)\n",
273 "\n",
274 "#Bleu: prévue, noir: réalisée"
275 ]
276 },
277 {
278 "cell_type": "markdown",
279 "metadata": {},
280 "source": [
281 "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 6)."
282 ]
283 },
284 {
285 "cell_type": "code",
286 "execution_count": null,
287 "metadata": {
288 "collapsed": false
289 },
290 "outputs": [],
291 "source": [
292 "par(mfrow=c(1,2))\n",
293 "plotPredReal(data, p_ep_pz, 4)\n",
294 "plotPredReal(data, p_ep_pz, 6)"
295 ]
296 },
297 {
298 "cell_type": "markdown",
299 "metadata": {},
300 "source": [
301 "Bonnes performances de la persistence (par chance...)"
302 ]
303 },
304 {
305 "cell_type": "code",
306 "execution_count": null,
307 "metadata": {
308 "collapsed": false
309 },
310 "outputs": [],
311 "source": [
312 "par(mfrow=c(1,2))\n",
313 "plotFilaments(data, p_ep_nn$getIndexInData(5))\n",
314 "plotFilaments(data, p_ep_nn$getIndexInData(2))"
315 ]
316 },
317 {
318 "cell_type": "code",
319 "execution_count": null,
320 "metadata": {
321 "collapsed": false
322 },
323 "outputs": [],
324 "source": [
325 "par(mfrow=c(1,2))\n",
326 "plotSimils(p_ep_nn, 5)\n",
327 "plotSimils(p_ep_nn, 2)"
328 ]
329 },
330 {
331 "cell_type": "markdown",
332 "metadata": {},
333 "source": [
334 "Même observation concernant les poids : concentrés près de zéro pour les prédictions avec peu de voisins."
335 ]
336 },
337 {
338 "cell_type": "markdown",
339 "metadata": {},
340 "source": [
341 "## Semaine non polluée"
342 ]
343 },
344 {
345 "cell_type": "code",
346 "execution_count": null,
347 "metadata": {
348 "collapsed": false
349 },
350 "outputs": [],
351 "source": [
352 "indices = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n",
353 "p_np_nn = getForecast(data,indices,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n",
354 "p_np_pz = getForecast(data, indices, \"Persistence\", \"Zero\", same_day=FALSE)\n",
355 "p_np_az = getForecast(data, indices, \"Average\", \"Zero\") #, memory=183)\n",
356 "#p_np_zz = getForecast(data, indices, \"Zero\", \"Zero\")\n",
357 "#p_np_l = getForecast(data, indices, \"Level\", same_day=FALSE)"
358 ]
359 },
360 {
361 "cell_type": "code",
362 "execution_count": null,
363 "metadata": {
364 "collapsed": false
365 },
366 "outputs": [],
367 "source": [
368 "e_np_nn = getError(data, p_np_nn)\n",
369 "e_np_pz = getError(data, p_np_pz)\n",
370 "e_np_az = getError(data, p_np_az)\n",
371 "#e_np_zz = getError(data, p_np_zz)\n",
372 "#e_np_l = getError(data, p_np_l)\n",
373 "options(repr.plot.width=9, repr.plot.height=6)\n",
374 "plotError(list(e_np_nn, e_np_pz, e_np_az), cols=c(1,2,colors()[258]))\n",
375 "\n",
376 "#Noir: neighbors, rouge: persistence, vert: moyenne"
377 ]
378 },
379 {
380 "cell_type": "markdown",
381 "metadata": {},
382 "source": [
383 "Performances des méthodes \"Average\" et \"Neighbors\" comparables ; mauvais résultats pour la persistence."
384 ]
385 },
386 {
387 "cell_type": "code",
388 "execution_count": null,
389 "metadata": {
390 "collapsed": false
391 },
392 "outputs": [],
393 "source": [
394 "par(mfrow=c(1,2))\n",
395 "options(repr.plot.width=9, repr.plot.height=4)\n",
396 "plotPredReal(data, p_np_nn, 3)\n",
397 "plotPredReal(data, p_np_nn, 6)\n",
398 "\n",
399 "#Bleu: prévue, noir: réalisée"
400 ]
401 },
402 {
403 "cell_type": "markdown",
404 "metadata": {},
405 "source": [
406 "Les \"bonnes\" prédictions (à gauche) sont tout de même trop lissées."
407 ]
408 },
409 {
410 "cell_type": "code",
411 "execution_count": null,
412 "metadata": {
413 "collapsed": false
414 },
415 "outputs": [],
416 "source": [
417 "par(mfrow=c(1,2))\n",
418 "plotPredReal(data, p_np_az, 3)\n",
419 "plotPredReal(data, p_np_az, 6)"
420 ]
421 },
422 {
423 "cell_type": "markdown",
424 "metadata": {},
425 "source": [
426 "Légèrement meilleur ajustement par la méthode \"Average\" ; très net à droite."
427 ]
428 },
429 {
430 "cell_type": "code",
431 "execution_count": null,
432 "metadata": {
433 "collapsed": false
434 },
435 "outputs": [],
436 "source": [
437 "par(mfrow=c(1,2))\n",
438 "plotFilaments(data, p_np_nn$getIndexInData(3))\n",
439 "plotFilaments(data, p_np_nn$getIndexInData(6))"
440 ]
441 },
442 {
443 "cell_type": "markdown",
444 "metadata": {},
445 "source": [
446 "Jours \"typiques\", donc beaucoup de voisins."
447 ]
448 },
449 {
450 "cell_type": "code",
451 "execution_count": null,
452 "metadata": {
453 "collapsed": false
454 },
455 "outputs": [],
456 "source": [
457 "par(mfrow=c(1,3))\n",
458 "plotSimils(p_np_nn, 3)\n",
459 "plotSimils(p_np_nn, 4)\n",
460 "plotSimils(p_np_nn, 6)"
461 ]
462 },
463 {
464 "cell_type": "markdown",
465 "metadata": {},
466 "source": [
467 "Répartition idéale des poids : quelques uns au-delà de 0.3-0.4, le reste très proche de zéro."
468 ]
469 },
470 {
471 "cell_type": "markdown",
472 "metadata": {},
473 "source": [
474 "## Bilan\n",
475 "\n",
476 "Problème difficile : on ne fait guère mieux qu'une naïve moyenne des lendemains des jours similaires dans le passé, ce qui n'est pas loin 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",
477 "\n",
478 "Comment améliorer la méthode ?"
479 ]
480 }
481 ],
482 "metadata": {
483 "kernelspec": {
484 "display_name": "R",
485 "language": "R",
486 "name": "ir"
487 },
488 "language_info": {
489 "codemirror_mode": "r",
490 "file_extension": ".r",
491 "mimetype": "text/x-r-source",
492 "name": "R",
493 "pygments_lexer": "r",
494 "version": "3.3.2"
495 }
496 },
497 "nbformat": 4,
498 "nbformat_minor": 2
499}