{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "library(talweg)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "data = getData(ts_data=\"../pkg/data/pm10_mesures_H_loc.csv\", exo_data=\"../pkg/data/meteo_extra_noNAs.csv\",\n", " input_tz = \"Europe/Paris\", working_tz=\"Europe/Paris\", predict_at=7)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Introduction\n", "\n", "J'ai fait quelques essais dans différentes configurations pour la méthode \"Neighbors\" (la seule dont on a parlé).
Il semble que le mieux soit\n", "\n", " * simtype=\"mix\" : on utilise les similarités endogènes et exogènes (fenêtre optimisée par VC)\n", " * same_season=FALSE : les indices pour la validation croisée ne tiennent pas compte des saisons\n", " * mix_strategy=\"mult\" : on multiplie les poids (au lieu d'en éteindre)\n", "\n", "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", "\n", "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", "\n", "

Pollution par chauffage

" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "indices_ch = seq(as.Date(\"2015-01-18\"),as.Date(\"2015-01-24\"),\"days\")\n", "p_ch_nn = getForecast(data,indices_ch,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n", "p_ch_pz = getForecast(data, indices_ch, \"Persistence\", \"Zero\", same_day=TRUE)\n", "p_ch_az = getForecast(data, indices_ch, \"Average\", \"Zero\") #, memory=183)\n", "#p_ch_zz = getForecast(data, indices_ch, \"Zero\", \"Zero\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "e_ch_nn = getError(data, p_ch_nn)\n", "e_ch_pz = getError(data, p_ch_pz)\n", "e_ch_az = getError(data, p_ch_az)\n", "#e_ch_zz = getError(data, p_ch_zz)\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotError(list(e_ch_nn, e_ch_pz, e_ch_az), cols=c(1,2,colors()[258]))\n", "\n", "#Noir: neighbors, rouge: persistence, vert: moyenne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La méthode Neighbors fait assez nettement mieux que les autres dans ce cas." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotPredReal(data, p_ch_nn, 3)\n", "plotPredReal(data, p_ch_nn, 4)\n", "\n", "#Bleu: prévue, noir: réalisée" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Prédictions d'autant plus lisses que le jour à prévoir est atypique (pollué)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "plotPredReal(data, p_ch_az, 3)\n", "plotPredReal(data, p_ch_az, 4)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les erreurs sont proches, mais les courbes prédites très différentes : avantage à \"Neighbors\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "f3_ch = computeFilaments(data, p_ch_nn$getIndexInData(3), plot=TRUE)\n", "f4_ch = computeFilaments(data, p_ch_nn$getIndexInData(4), plot=TRUE)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(2,2))\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotFilamentsBox(data, f3_ch$indices)\n", "plotFilamentsBox(data, f3_ch$indices+1)\n", "plotFilamentsBox(data, f4_ch$indices)\n", "plotFilamentsBox(data, f4_ch$indices+1)\n", "\n", "#En haut : jour 3 + lendemain (4) ; en bas : jour 4 + lendemain (5)\n", "#À gauche : premières 24h ; à droite : 24h suivantes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dans les deux cas, un voisinage \"raisonnable\" est trouvé ; mais grande variabilité le lendemain \"pollué\"." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotRelativeVariability(data, f3_ch$indices)\n", "plotRelativeVariability(data, f4_ch$indices)\n", "\n", "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dans la situation idéale, il faudrait que la courbe noire soit nettement plus basse que la courbe rouge. Ce n'est pas très clair à J+1, surtout en soirée (de 21h à 0h)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,3))\n", "plotSimils(p_ch_nn, 3)\n", "plotSimils(p_ch_nn, 4)\n", "plotSimils(p_ch_nn, 5)\n", "\n", "#Non pollué à gauche, pollué au milieu, autre pollué à droite" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "La plupart des poids très proches de zéro ; pas pour le jour 5 : autre type de jour, cf. ci-dessous." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "plotPredReal(data, p_ch_nn, 5)\n", "ignored <- computeFilaments(data, p_ch_nn$getIndexInData(5), plot=TRUE)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Pollution par épandage

" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "indices_ep = seq(as.Date(\"2015-03-15\"),as.Date(\"2015-03-21\"),\"days\")\n", "p_ep_nn = getForecast(data,indices_ep,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n", "p_ep_pz = getForecast(data, indices_ep, \"Persistence\", \"Zero\", same_day=TRUE)\n", "p_ep_az = getForecast(data, indices_ep, \"Average\", \"Zero\") #, memory=183)\n", "#p_ep_zz = getForecast(data, indices_ep, \"Zero\", \"Zero\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "e_ep_nn = getError(data, p_ep_nn)\n", "e_ep_pz = getError(data, p_ep_pz)\n", "e_ep_az = getError(data, p_ep_az)\n", "#e_ep_zz = getError(data, p_ep_zz)\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotError(list(e_ep_nn, e_ep_pz, e_ep_az), cols=c(1,2,colors()[258]))\n", "\n", "#Noir: neighbors, rouge: persistence, vert: moyenne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Cette fois les deux méthodes naïves font en moyenne moins d'erreurs que Neighbors. Prédiction trop difficile ?" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotPredReal(data, p_ep_nn, 4)\n", "plotPredReal(data, p_ep_nn, 6)\n", "\n", "#Bleu: prévue, noir: réalisée" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "À gauche un jour \"bien\" prévu, à droite le pic d'erreur (jour 6)." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "plotPredReal(data, p_ep_pz, 4)\n", "plotPredReal(data, p_ep_pz, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Assez bonnes performances de la persistence (par chance...)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "f4_ep = computeFilaments(data, p_ep_nn$getIndexInData(4), plot=TRUE)\n", "f6_ep = computeFilaments(data, p_ep_nn$getIndexInData(6), plot=TRUE)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(2,2))\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotFilamentsBox(data, f4_ep$indices)\n", "plotFilamentsBox(data, f4_ep$indices+1)\n", "plotFilamentsBox(data, f6_ep$indices)\n", "plotFilamentsBox(data, f6_ep$indices+1)\n", "\n", "#En haut : jour 4 + lendemain (5) ; en bas : jour 6 + lendemain (7)\n", "#À gauche : premières 24h ; à droite : 24h suivantes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "\"Voisinages\" catastrophiques : les jours 4 et 6 sont trop atypiques ; de façon étonnante les lendemains sont en revanche assez \"centraux\" parmi les lendemains des (mauvais) voisins." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotRelativeVariability(data, f4_ep$indices)\n", "plotRelativeVariability(data, f6_ep$indices)\n", "\n", "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Dans la situation idéale, il faudrait que la courbe noire soit nettement plus basse que la courbe rouge. Ce n'est pas vérifié à J+1, sauf pour le jour 6 en début et fin de journée." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "plotSimils(p_ep_nn, 4)\n", "plotSimils(p_ep_nn, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Poids très concentrés près de zéro pour les prédictions avec peu de voisins." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

Semaine non polluée

" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "indices_np = seq(as.Date(\"2015-04-26\"),as.Date(\"2015-05-02\"),\"days\")\n", "p_np_nn = getForecast(data,indices_np,\"Neighbors\",\"Neighbors\",simtype=\"mix\",same_season=FALSE,mix_strategy=\"mult\")\n", "p_np_pz = getForecast(data, indices_np, \"Persistence\", \"Zero\", same_day=FALSE)\n", "p_np_az = getForecast(data, indices_np, \"Average\", \"Zero\") #, memory=183)\n", "#p_np_zz = getForecast(data, indices_np, \"Zero\", \"Zero\")" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "e_np_nn = getError(data, p_np_nn)\n", "e_np_pz = getError(data, p_np_pz)\n", "e_np_az = getError(data, p_np_az)\n", "#e_np_zz = getError(data, p_np_zz)\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotError(list(e_np_nn, e_np_pz, e_np_az), cols=c(1,2,colors()[258]))\n", "\n", "#Noir: neighbors, rouge: persistence, vert: moyenne" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Performances des méthodes \"Average\" et \"Neighbors\" comparables ; mauvais résultats pour la persistence." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotPredReal(data, p_np_nn, 3)\n", "plotPredReal(data, p_np_nn, 6)\n", "\n", "#Bleu: prévue, noir: réalisée" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Les \"bonnes\" prédictions (à gauche) sont tout de même trop lissées." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "plotPredReal(data, p_np_az, 3)\n", "plotPredReal(data, p_np_az, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Légèrement meilleur ajustement par la méthode \"Average\" ; plutôt net à droite." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "f3_np = computeFilaments(data, p_np_nn$getIndexInData(3), plot=TRUE)\n", "f6_np = computeFilaments(data, p_np_nn$getIndexInData(6), plot=TRUE)" ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(2,2))\n", "options(repr.plot.width=9, repr.plot.height=7)\n", "plotFilamentsBox(data, f3_np$indices)\n", "plotFilamentsBox(data, f3_np$indices+1)\n", "plotFilamentsBox(data, f6_np$indices)\n", "plotFilamentsBox(data, f6_np$indices+1)\n", "\n", "#En haut : jour 3 + lendemain (4) ; en bas : jour 6 + lendemain (7)\n", "#À gauche : premières 24h ; à droite : 24h suivantes" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Jours \"typiques\", donc beaucoup de voisins. En revanche les lendemains des jours similaires sont très variables." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,2))\n", "options(repr.plot.width=9, repr.plot.height=4)\n", "plotRelativeVariability(data, f3_np$indices)\n", "plotRelativeVariability(data, f6_np$indices)\n", "\n", "#Variabilité sur 60 courbes au hasard en rouge ; sur nos 60 voisins (+ lendemains) en noir" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Situation quasi-idéale : la courbe noire est toujours assez nettement en dessous." ] }, { "cell_type": "code", "execution_count": null, "metadata": { "collapsed": false }, "outputs": [], "source": [ "par(mfrow=c(1,3))\n", "plotSimils(p_np_nn, 3)\n", "plotSimils(p_np_nn, 4)\n", "plotSimils(p_np_nn, 6)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Répartition idéale des poids : quelques uns au-delà de 0.3-0.4, le reste très proche de zéro." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Bilan\n", "\n", "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 same_day).\n", "\n", "Comment améliorer la méthode ?" ] } ], "metadata": { "kernelspec": { "display_name": "R", "language": "R", "name": "ir" }, "language_info": { "codemirror_mode": "r", "file_extension": ".r", "mimetype": "text/x-r-source", "name": "R", "pygments_lexer": "r", "version": "3.3.2" } }, "nbformat": 4, "nbformat_minor": 2 }