hmm
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 !
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`.
| 1 | DATA 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; |
| 14 | RUN; |
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.
| 1 | PROC 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}}; |
| 7 | RUN; |
Résultat Attendu :
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.
| 1 | PROC 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; |
| 12 | RUN; |