Portage du package R CausalImpact de Google vers Python (échantillonneur de Gibbs en Rust)
(github.com/YuminosukeSato)J’ai porté le package R CausalImpact de Google vers Python.
L’échantillonneur de Gibbs est implémenté en Rust et appelé depuis Python via PyO3.
Aucun besoin de TensorFlow, et c’est environ 30 fois plus rapide que R.
Pourquoi l’avoir fait :
Les portages Python existants avaient des problèmes. pycausalimpact
utilise le MLE, donc les résultats diffèrent de ceux de R. tfcausalimpact
nécessite TensorFlow (3 Go+). Et aucun portage
n’implémentait la sélection de variables spike-and-slab.
C’est précisément la fonctionnalité clé par laquelle bsts de R
sélectionne automatiquement les séries temporelles de contrôle pertinentes parmi plusieurs.
Cette bibliothèque reproduit le même échantillonneur de Gibbs que le package bsts de R.
Le filtre de Kalman, le lisseur par simulation et le prior
spike-and-slab sont tous identiques. À chaque commit, des tests d’équivalence numérique avec R CausalImpact
1.4.1 sont exécutés en CI
(effet ponctuel ±3 %, intervalle de confiance ±5 %).
La partie la plus difficile a été le spike-and-slab.
Il m’a fallu plusieurs semaines pour faire correspondre à la sortie R
l’échantillonnage coordinate-wise et les valeurs par défaut de StudentSpikeSlabPrior
(expected.r2=0.8, prior.df=50).
Fonctionnalités prises en charge :
- Sélection de variables spike-and-slab (même prior que R bsts)
- Composants saisonniers (nseasons, season_duration)
- Régression dynamique (coefficients variables dans le temps)
- Tendance linéaire locale
Benchmark (T=1000, niter=1000) : - Sans covariables : 0,07 s (R : 2,1 s, 30x)
- 5 covariables : 0,20 s (R : 2,2 s, 11x)
pip install bsts-causalimpact
GitHub: https://github.com/YuminosukeSato/bsts-causalimpact
Documentation: https://yuminosukesato.github.io/bsts-causalimpact/
J’attends avec intérêt les retours des personnes qui font de l’inférence causale sur séries temporelles.
En particulier, s’il y a des edge cases à tester, n’hésitez pas à me le signaler.
1 commentaires
C’est chouette. Je n’ai pas de données à tester tout de suite, mais si j’en ai, je ferai un essai.