UNIVERSITE PARIS DAUPHINE / PARIS 2 PANTHEON-ASSAS MASTER 272 IEF / ISF Réseaux de neurones et séries temporelles : une application sous SAS. Nicolas Arnoult, 2011 Professeur sponsor : Joseph Rynkiewicz RÉSUMÉ. Cet article a pour objectif de présenter une méthode permettant d’utiliser les réseaux de neurones pour répondre à un besoin d’affiner les prévisions de séries temporelles. Il propose une méthodologie pour aborder et répondre, étape par étape, aux problèmes pratiques et théoriques d’utilisation et de programmation des perceptrons multicouches. ABSTRACT. The objective of this paper is to present a method to use artificial neural networks to improve time series forecasting. It suggests a methodology to deal, step by step, with practical and theoretical problems of these models. It also proposes programming solutions to answer this problematic. MOTS-CLÉS : Réseaux de Neurones Autorégressifs, Réseaux de Neurones à Moyenne Mobile, Perceptron Multicouches, Econométrie Non Linéaire. KEYWORDS: Neural Autoregressive Model, Neural Network Modeling, Neural Moving Average Model, Time Delayed Neural Network, NAR, NARMA, NARMAX, Multilayer Perceptron. REMERCIEMENTS: Je tiens à remercier Joseph Rynkiewicz, maître de conférences à l’université Paris 1 Panthéon Sorbonne, pour m’avoir apporté son expérience sur ce sujet.
35
Embed
Réseaux de neurones et séries temporelles : une ...nicolasarnoult.free.fr/mapage/r-seaux-de-neurones-et-s-ries... · Figure 1 : Représentation d’un neurone biologique ... Model)
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
UNIVERSITE PARIS DAUPHINE / PARIS 2 PANTHEON-ASSAS MASTER 272 IEF / ISF
Réseaux de neurones et séries temporelles :
une application sous SAS.
Nicolas Arnoult, 2011
Professeur sponsor : Joseph Rynkiewicz
RÉSUMÉ. Cet article a pour objectif de présenter une méthode permettant
d’utiliser les réseaux de neurones pour répondre à un besoin d’affiner les
prévisions de séries temporelles. Il propose une méthodologie pour aborder et
répondre, étape par étape, aux problèmes pratiques et théoriques d’utilisation
et de programmation des perceptrons multicouches.
ABSTRACT. The objective of this paper is to present a method to use artificial
neural networks to improve time series forecasting. It suggests a methodology
to deal, step by step, with practical and theoretical problems of these models. It
also proposes programming solutions to answer this problematic.
MOTS-CLÉS : Réseaux de Neurones Autorégressifs, Réseaux de Neurones à
Moyenne Mobile, Perceptron Multicouches, Econométrie Non Linéaire.
Moving Average Model, Time Delayed Neural Network, NAR, NARMA,
NARMAX, Multilayer Perceptron.
REMERCIEMENTS: Je tiens à remercier Joseph Rynkiewicz, maître de conférences à l’université Paris 1 Panthéon Sorbonne, pour m’avoir apporté son expérience sur ce sujet.
Les données utilisées sont standardisées par le calcul suivant :
(6)
La fonction d’activation est très sensible à la forme des données et passer par cette
étape permet de se placer dans un cadre correct du point de vue de l’estimation. Arnoult et
Issaad (2011) ont montré dans un projet universitaire que la qualité de la prévision pouvait en
être fortement affectée. Pour effectuer l’opération inverse à la fin du programme, les
statistiques de la moyenne et de l’écart type sont retenues.
/*retain mean and std before standardization*/ proc means data = &table. mean std noprint; var &target.; output out=stat mean=_mean_ std=_std_; run;quit; data _null_; set stat; call symputx("mean",_mean_); call symputx("std",_std_); call symputx("freq", _FREQ_); run; /*****************************************/ /*standardize data*/ proc standard data=&table. out=&table._std mean=0 std=1; var &target. &exvar.; run; /****************/
Il est également nécessaire de vérifier plusieurs hypothèses pour utiliser les réseaux de
neurones avec des séries temporelles. Dans un premier temps, il convient d’étudier les
propriétés du modèle linéaire usuel. Les hypothèses de non autocorrélation, de stationarité,
etc… doivent être vérifiées. Une fois le modèle linéaire établi, nous utilisons les variables
significatives en inputs dans le réseau. Il existe cependant une exception : dans le modèle
linéaire, si toutes les données sont centrées, alors la constante ne sera pas significative. En
revanche, dans un modèle non linéaire, l’utilisation d’une constante et/ou d’une constante
cachée peut s’avérer significative. Nous montrons en annexe 1 que l’oubli de ces constantes
peut nettement dégrader la prévision.
7
La représentation d’un modèle linéaire à a priori d’autres avantages. Elle permet par
exemple de donner une meilleure interprétabilité au réseau. En effet, celle-ci s’avère de plus
en plus difficile à mesure que le réseau possède un nombre de neurones important.
3.2. Recherche du modèle dominant et élagage
Définition : On entend par « modèle dominant » le réseau d’architecture maximal en
termes de nombre de neurones cachés. Il comprend au moins tous les paramètres significatifs
du modèle.
Si l’on ne choisit pas un critère d’arrêt de l’apprentissage du modèle, celui-ci est alors
totalement sur-paramétré (augmentation du nombre de neurones jusqu’à avoir un fit
pratiquement parfait). Deux techniques sont principalement utilisées pour stopper
l’apprentissage du réseau si l’on utilise des séries temporelles.
La technique la plus classique, l’« early stopping », se rapproche de la technique
utilisée lorsque l’on réalise un score. La base de données est séparée en trois. Une partie de la
base est utilisée comme base d’apprentissage. Il s’agit de l’échantillon sur lequel les
paramètres sont estimés. Le deuxième échantillon est celui de validation. A chaque fois
qu’une itération est effectuée dans l’estimation du réseau (ajout d’un neurone
supplémentaire), l’erreur quadratique moyenne est calculée sur cette base de validation. Dès
que la moyenne des erreurs augmente, l’estimation est stoppée. Il s’agit donc d’un algorithme
de sélection forward. Les poids sont ensuite élagués suivant une méthode d’élagage dite
backward. Le lien faisant le plus baisser la moyenne quadratique des erreurs est éliminé
jusqu’à ce que ce critère ne baisse plus. En pratique, les résultats de cette méthode sont
satisfaisants. En revanche, cette méthode est extrêmement sensible au choix du découpage de
la base de données. Par ailleurs, elle recquiert également un nombre d’observations très
important, ce qui est rarement le cas lorsque l’on utilise des séries temporelles au sein d’une
entreprise. C’est pourquoi nous choisissons d’utiliser la deuxième méthode.
Cette deuxième méthode est basée sur le fait que les réseaux de neurones sont des
modèles statistiques à part entière et que, par conséquent, des critères usuels en séries
temporelles peuvent être utilisés. Mangeas et Yao (1997) et Rinkiewicz et al (2001) montrent
que deux critères consistant théoriquement peuvent être utilisés dans la recherche du modèle
dominant. Il s’agit des critères BIC et BIC* définis ci-dessous :
Soit :
- CR le carré des résidus engendré par le minimum de la fonction d’erreur
- N le nombre d’observation
- m le nombre de paramètres estimés par le modèle
(7)
8
(8)
Avec une constante.
La méthode de sélection du nombre de neurones avec cette technique est similaire à
celle de l’ « early stopping ». Un neurone est ajouté à la couche cachée tant que cela fait
baisser le critère d’infomation. Ainsi, théoriquement, comme Mangeas et Yao (1997) le
montrent, le modèle converge presque sûrement vers le modèle dominant. Mangeas (1996) a
montré par expérimentation que le critère d’information est une fonction convexe du nombre
d’unités cachés. Nous ne risquons pas de tomber sur un minimum local. Par la suite, c’est à
nouveau la méthode d’élagage backward qui est appliquée.
On remarque que ces deux critères pénalisent plus ou moins fortement le nombre de
paramètres du modèle. C’est cette pénalisation qui va permettre d’éviter un sur-apprentissage.
En pratique, est fixé comme étant de même ordre de grandeur que la variance de l’erreur
résiduelle. Rinkiewicz (2011) montre cependant que lorsque le nombre d’observations est trop
faible (N < 500), autoriser ce paramètre à bouger à chaque étape de l’estimation revient très
souvent à surparamétrer le modèle. Ainsi, si N < 500, nous considérons dans notre
programme ce paramètre comme fixé et déterminé par la variance de l’erreur résiduelle de la
première étape d’estimation (un seul neurone caché). Dans le cas contraire, évolue à chaque
étape du processus d’estimation. Dans notre programme, la macro score à chaque étape la
table sur laquelle le réseau a appris pour calculer cette erreur résiduelle. Grâce aux résidus
estimés, il est ainsi possible de calculer aisément ces deux critères d’information.
- &d.=1 et &c.=1 si une constante et/ou une constante cachée sont respectivement
choisies en option de la macro, 0 sinon.
- &nbentrees. est le nombre d’input, c’est une information que l’utilisateur doit saisir
dans l’appel de la macro.
- &freq. est le nombre d’observation de la base, calculé automatiquement par la macro.
/*******Compute the BIC*******/ %if &criterion.=bic %then %do; data bic_&z.; set pred_&z.; CR= (R_&target.)**2; keep CR; run; proc sql ; create table bic_neural as
9
select count(CR) as n, ((&nbentrees.+&d.)*(&z.)+(&z.+&c.)) as nb_param, sum(CR) as SCR from bic_&z.; create table selection_&z. as select log(sum(SCR)/n)+((log(n)/n)*nb_param)as bic, &z. as hiddenlayer from bic_neural ; quit; %end; /****** End of BIC computation ******/ /*********Compute the corrected BIC*************/ %if &criterion.=bic_corr %then %do; proc sql; create table SCR_&z. as select sum((R_&target.)**2) as SCR from pred_&z.; create table bic_&z. as select (avg(R_&target.))**2 as esp_square, R_&target. as R_&target. from pred_&z.; %if %sysevalf(&freq. < 500) %then %do; create table bic_neural as select count(R_&target.) as n, ((&nbentrees.+&d.)*(&z.)+(&z.+&c.)) as nb_param, (sum((R_&target.-esp_square)**2))as VAR from bic_1; %end; %if %sysevalf(&freq. ge 500) %then %do; create table bic_neural as select count(R_&target.) as n, ((&nbentrees.+&d.)*(&z.)+(&z.+&c.)) as nb_param, (sum((R_&target.-esp_square)**2))as VAR from bic_&z.; %end; create table selection_&z. as select ((SCR/n)+(VAR/n)*(log(n)/n)*nb_param) as bic, &z. as hiddenlayer, (VAR/n)as gamma from bic_neural, SCR_&z. ; quit; %if %sysevalf(&freq. < 500) %then %do; data bic_neural0; set bic_neural; drop nb_param; run; %end; %end; /**********End of corrected BIC computation*************/
Rinkiewicz (2011) montre également un troisième critère d’information consistant qui
pénalise plus fortement le nombre de paramètres. Celui-ci est défini ci-dessous :
(9)
Pour le moment, la macro ne permet pas d’estimer le modèle via cette technique. Il
s’agit là d’un premier axe d’évolution possible.
10
4. Techniques de programmation
4.1. Définition d’une architecture
Pour établir l’architecture du réseau, nous utilisons la procédure « Neural » du module
SAS Enterprise Miner. Nous choisissons d’identifier toutes les variables en entrée du réseau,
comme dans l’équation 2 .
Ainsi, i&j. est l’input numéro j et h&z. le neurone caché numéro z du réseau. On
observe dans l’extrait de la macro qui suit que la fonction d’activation est bien de la forme
tangente hyperbolique (cf équation 3). On observe également que l’on a choisi de ne
La macro utilise par défaut un nombre de neurones cachés maximum tel que le nombre
de connexions soit inférieur au nombre d’observations. Le nombre de neurones cachés
maximum est ainsi défini par la règle suivante :
(10)
Avec P le nombre d’inputs, Kmax le nombre de neurones maximum et N le nombre
d’observations de la base. si une constante est ajoutée dans la couche cachée,
si une constante est ajoutée en input. Pour simplifier notre macro programme,
nous fixons ces variables binaires à 1.
En pratique, il est assez rare de voir un réseau dépassant plus de 10 unités sur la
couche cachée. Si ce nombre est supérieur, les temps de calcul peuvent devenir extrêmement
longs.
/*define the maximum number of hidden neurons for the loop*/ data _null_; call symputx ("maxhiddenneural",int(%sysevalf((&freq.-1-1)/(&nbentrees.+1+1)))); run; /********************************************************/
Le calcul du critère d’information tel qu’il est décrit est effectué dans une boucle allant
de 1 jusqu’au nombre de neurones autorisé (cf équation 10). Dans le cas où le critère
d’information à l’étape suivante remonte, une procédure de sortie est alors activée pour que la
macro ne retienne que le modèle dominant.
%do z=1 %to &maxhiddenneural.;
… /*retain best BIC or BICC at each step*/ data _null_; set selection_&z.; call symputx ("bic&z.",bic); run; /******************************/ /*escape procedure*/ %if &z. ne 1 %then %do; %if %sysevalf (&&bic&lagz.. <= &&bic&z..) %then %do; %let hiddenlayer=&lagz.;/*retain the number of hidden layer for next stage*/ %let connected_bic&lagz.=&&bic&lagz..; %goto next; %end;
12
%end;
… %let lagz=&z.; %end; %next:
Nous avons donc réussi à estimer un modèle dominant. Le problème est désormais
d’initialiser l’élagage du réseau suivant les critères que nous avons déjà choisis.
4.3. Elagage
Nous avons choisi d’élaguer le réseau suivant une méthode de sélection dite backward.
La technique consiste à éliminer à chaque fois une connexion dans le réseau et à récalculer le
critère d’information tant que celui-ci décroît. Le programme prend en compte le cas
particulier où l’élimination d’une seule connexion n’améliorerait pas le critère d’information
pour sortir immédiatement de la boucle.
Pour bien comprendre l’extrait de programme qui suit, rapellons que le processus
d’élagage se déroule en plusieurs étapes successives :
- Dans la première étape, (p-1)K modèles sont estimés (on supprime une connexion
différente à chaque fois) et un critère d’information est calculé.
- Le minimum ces critères d’informations est comparé au critère du modèle
dominant. Si ce dernier est inférieur, on passe à l’étape suivante, sinon, on sort de
la boucle et on valide le modèle dominant comme étant le modèle optimal.
- Dans l’autre cas, la connexion précédemment éliminée est retenue. On estime dans
la seconde étape (p-2)K modèles. En effet, on teste une seconde élimination dans
le réseau. Un critère d’information par modèle est à chaque fois calculé.
- On retient à nouveau le minimum de ces critères en le comprant à celui retenu en
première étape. Si celui-ci est inférieur, la boucle continue de s’exécuter et une
nouvelle itération est faite. Dans le cas contraire, le modèle avec une connexion
La représentation graphique permet d’analyser rapidement comment est construit le
réseau et d’en donner une première interprétation.
La première partie du programme permet de créer une table regroupant les noms des
inputs, des neurones cachés (de H1 à Hk), de l’output et de positionner ces noms au bon
endroit sur le futur graphique. Pour que le réseau soit représenté de manière bien symétrique,
il faut déterminer la position graphique de chaque neurone. Sur l’axe des abcisses, la couche
inputs prend la valeur 1, la couche cachée la valeur 2 et la couche de sortie la valeur 3. Sur
l’axe des ordonnées, les positions des différents neurones sont déterminées ainsi :
Rappel : P est déterminé par une analyse linéaire, K par la recherche du modèle
dominant.
/*retain labels to plot the network*/ %let positionf= %sysevalf((&nbentrees.+1)/2); data my_labels; retain xsys ysys '2' function 'label' position '1' style "'Arial/bo'" color 'black' ; text="Intercept";x=1;y=0;output; text="HidIntercept";x=2;y=0;output; %do i=1 %to &nbentrees.; text=" &var&i.. "; x=1; y=&i.; output; %let positionh= %sysevalf((&nbentrees./2)+1-(&hiddenlayer./2)); %do j=1 %to &hiddenlayer.;/*nombre hidden*/ text=" H&j. ";x=2; y=&positionh.;output; %let trans=%sysevalf(&positionh.); %let positionh=%sysevalf(&trans.+1); %end; %end; text=" &target. ";x=3; y=&positionf.;output; run; /**************************************/
La seconde étape est de créer dans une table les chemins parcourus par chaque input
jusqu’à l’output. La variable sur l’axe des abcisses, y, prend les valeurs 1, 2 et 3. Sur l’axe des
ordonnées, chaque chemin a donc trois positions à déterminer : input, neurone caché et output.
Il s’agit des mêmes positions que celles détaillées précédemment. Pour plus de
représentativité, on graphe chaque neurone par un cercle. Il est important de signaler à cette
étape que les connexions éliminées par l’élagage ne seront pas représentées. Ces connexions
15
sont en effet supprimées par la macro grâce à une macro-variable de contrôle. Par la suite, on
inscrit dans une macro variable une chaine de caractère définie comme étant
« chemin_1*y….. chemin_k*y » avec k le nombre de chemins finaux retenus par le modèle.
L’extrait de programme ci-dessous permet de comprendre la structure algorithmique utilisée
pour la représentation graphique.
……… %let positionf= %sysevalf((&nbentrees.+1)/2);/*enter the data*/ data graph; set graph; %do i=1 %to &nbentrees.; %let positionh= %sysevalf((&nbentrees./2)+1-(&hiddenlayer./2)); %do j=1 %to &hiddenlayer.; if _N_=1 then e&i.&j.=&i. ; if _N_=2 then e&i.&j.=&positionh. ; if _N_=3 then e&i.&j.=&positionf.; %if &constante.=bias %then %do; if _N_=1 then c&j.= 0; if _N_=2 then c&j.= &positionh. ; if _N_=3 then c&j.= &positionf.; %end; %let trans=%sysevalf(&positionh.); %let positionh=%sysevalf(&trans.+1); %end; %end; %if &constantehid.=bias %then %do; if _N_=2 then c= 0 ; if _N_=3 then c= &positionf.; %end; run; proc contents data= graph out=contents noprint; run; ……… data contents; set contents; %do k=1 %to &number.; if name= "e&&controle&k.." then delete; %end; run; ……… DATA _null_ ; SET contents; /* each value is in a macro variable namei... */ call symput ("name"||compress(i),compress(name)) ; RUN ; ……… %let string_plot=; %do k=1 %to &count_loop.; %let s=&&name&k.. * Y; %let string_plot=&string_plot. &s.; %end; %if &constante.=bias %then %do; %do j=1 %to &hiddenlayer.; %let s=c&j. * Y;