hiddenMarkovModel

hmm

##set_hiddenmarkovmodel

Description

Apprend et infère des modèles de Markov cachés (Hidden Markov Models - HMM). Ces modèles puissants sont parfaits pour modéliser des séries temporelles où les distributions dépendent de processus ou de régimes non observables. Autrement dit, c'est l'outil idéal pour deviner ce qui se trame en coulisses à partir d'observations visibles, comme tenter de deviner si un marché financier est en phase haussière ou baissière juste en observant les prix !

Syntaxe Officielle
hiddenMarkovModel.hmm <result=results> <status=rc> /
data={caslib="string", computedOnDemand=TRUE|FALSE, name="table-name", ...},
decode={out={caslib="string", name="table-name", replace=TRUE|FALSE, ...}},
display={caseSensitive=TRUE|FALSE, exclude=TRUE|FALSE, names={"string-1", ...}, ...},
evaluate={out={caslib="string", name="table-name", replace=TRUE|FALSE, ...}},
filter={out={caslib="string", name="table-name", replace=TRUE|FALSE, ...}},
forecast={alpha=double, back=integer, lead=integer, method="ANALYTIC"|"SIMULATION", nSim=integer, online=TRUE|FALSE, out={name="table-name", ...}, outAll={name="table-name", ...}},
id={section="variable-name", time="variable-name"},
initial={"string-1", ...},
labelSwitch={out={name="table-name", ...}, reorder={integer-1, ...}, sort="ASC"|"DESC"|"NONE", sortBy="SIGMA"|"MU"|...},
learn={in={name="table-name", ...}, out={name="table-name", ...}, outAll={name="table-name", ...}},
model={arMean="ADJUSTED"|"STANDARD", depvars={"var1", ...}, estIspv=TRUE|FALSE, indepvars={"var1", ...}, method="MAP"|"ML", nComponent=integer, noCurrentX=TRUE|FALSE, noInt=TRUE|FALSE, nSeason=integer, nState=integer, nStateTo=integer, sCenter=TRUE|FALSE, stateIndependent={"AR", "CONST", "COV", "MU", "SIGMA", ...}, trend="LINEAR"|"NONE"|"QUAD", type="AR"|"FINITE"|"GAUSSIAN"|"GAUSSIANMIXTURE"|"POISSON"|"REG", xLag=integer, yLag=integer, yLagTo=integer},
optimize={algorithm="ACTIVESET"|"EM"|"INTERIORPOINT"|"IPDIRECT"|"SGD", chain={buffer=integer, length=integer}, covOfParm=TRUE|FALSE, feasTol=double, maxIter=integer, maxTime=double, minIter=integer, msMaxStarts=integer, multiStart=integer, objLimit=double, optTol=double, printIterFreq=integer, printLevel=integer, sgdOpt={...}, single=TRUE|FALSE, solType=integer},
outputTables={groupByVarsRaw=TRUE|FALSE, includeAll=TRUE|FALSE, names={"string-1", ...}, repeated=TRUE|FALSE, replace=TRUE|FALSE},
outstat={caslib="string", name="table-name", replace=TRUE|FALSE, ...},
prior={"string-1", ...},
score={inmodel={name="table-name", ...}, outmodel={name="table-name", ...}},
seed=integer,
smooth={out={name="table-name", ...}},
store={out={name="table-name", replace=TRUE|FALSE, ...}};

Paramètres Clés

Nom du paramètre Description
data Spécifie la table d'entrée contenant vos séries temporelles. C'est la base de tout : sans elle, votre modèle n'a rien à observer .
model Le cœur du réacteur ! Définit vos variables dépendantes (`depvars`), le nombre d'états cachés présumés (`nState`), et le type de distribution sous-jacente (`type` comme GAUSSIAN, POISSON ou AR). C'est ici que vous spécifiez la structure de votre HMM .
id Indispensable pour identifier l'ordre séquentiel de chaque observation via la variable spécifiée dans `time`, et optionnellement regrouper les séries via `section` (pour des données de panel) .
learn Pilote l'apprentissage des paramètres du modèle. Vous pouvez y définir les tables pour stocker les estimations (`out`) ou reprendre des estimations précédentes (`in`) .
decode Permet de résoudre le problème de décodage global, souvent via l'algorithme de Viterbi, en cherchant le chemin (la séquence) d'états cachés le plus probable au vu des observations .
forecast La boule de cristal ! Calcule et exporte les prévisions (`lead`) sur plusieurs périodes futures, que ce soit par méthode analytique ou par simulation de scénarios .
optimize Configure le moteur mathématique d'optimisation (ex: EM, ACTIVESET) utilisé pour maximiser la vraisemblance (ML) ou la probabilité a posteriori (MAP) .
store Permet d'enregistrer le modèle entraîné sous la forme d'un objet analytique (ASTORE), pratique pour le recharger et scorer de nouvelles données ultérieurement sans réapprentissage .

Préparation des données

Création d'une série temporelle simulant deux régimes cachés

Nous allons créer un jeu de données fictif nommé `machine_data` dans la librairie active. Il simulera une machine qui fonctionne avec deux régimes distincts (état 1 : moyenne de 10, état 2 : moyenne de 20), mais on n'observera que la variable `y`.

1DATA mycas.machine_data;
2 call streaminit(12345);
3 DO time = 1 to 200;
4 IF time <= 100 THEN DO;
5 etat_vrai = 1;
6 y = 10 + rand("Normal") * 2;
7 END;
8 ELSE DO;
9 etat_vrai = 2;
10 y = 20 + rand("Normal") * 4;
11 END;
12 OUTPUT;
13 END;
14RUN;

Exemples d'utilisation

Modèle de Markov Caché Gaussien Basique

Entraînement d'un HMM simple avec 2 états cachés supposés pour modéliser notre série `y`. Le modèle devinera de lui-même les deux moyennes et les probabilités de transition.

1PROC CAS;
2 hiddenMarkovModel.hmm /
3 DATA={name="machine_data"}
4 id={time="time"}
5 model={depvars={"y"}, type="GAUSSIAN", nState=2}
6 learn={out={name="hmm_estimates", replace=true}};
7RUN;
Résultat Attendu :
Le modèle va converger et générer une table CAS `hmm_estimates` contenant les estimations des moyennes (~10 et ~20), des variances, et de la matrice de transition entre les deux états cachés.
HMM Complet : Optimisation, Décodage de Viterbi, Prévision et ASTORE

Dans cet exemple exhaustif, on entraîne un HMM à 2 états, on force l'optimiseur Active-Set, on décode le chemin d'état le plus probable pour notre historique, on prévoit 5 pas dans le futur et on sauvegarde le modèle final.

1PROC CAS;
2 hiddenMarkovModel.hmm /
3 DATA={name="machine_data"}
4 id={time="time"}
5 model={depvars={"y"}, type="GAUSSIAN", nState=2, method="ML"}
6 optimize={algorithm="ACTIVESET", maxIter=150}
7 learn={out={name="hmm_estimates", replace=true}}
8 decode={out={name="hmm_decode", replace=true}}
9 forecast={lead=5, out={name="hmm_forecast", replace=true}}
10 store={out={name="hmm_astore", replace=true}}
11 seed=42;
12RUN;
Résultat Attendu :
Quatre nouvelles tables CAS seront créées. `hmm_estimates` comportera les probabilités, `hmm_decode` indiquera l'état le plus probable (1 ou 2) pour chaque point de `time`, `hmm_forecast` contiendra les projections sur `time` 201 à 205, et `hmm_astore` sera le modèle binaire prêt au déploiement.