y0
(prononcé « pourquoi pas ? ») est un code Python pour l'inférence causale.
y0
dispose d'un langage interne complet spécifique à un domaine pour représenter les expressions de probabilité :
from y0 . dsl import P , A , B
# The probability of A given B
expr_1 = P ( A | B )
# The probability of A given not B
expr_2 = P ( A | ~ B )
# The joint probability of A and B
expr_3 = P ( A , B )
Il peut également être utilisé pour manipuler des expressions :
from y0 . dsl import P , A , B , Sum
P ( A , B ). marginalize ( A ) == Sum [ A ]( P ( A , B ))
P ( A , B ). conditional ( A ) == P ( A , B ) / Sum [ A ]( P ( A , B ))
Les objets DSL peuvent être convertis en chaînes avec str()
et analysés à l'aide de y0.parser.parse_y0()
.
Une démo complète du DSL peut être trouvée dans ce Jupyter Notebook
y0
a une notion de graphes mixtes dirigés acycliques construits au-dessus de networkx
qui peuvent être utilisés pour modéliser la causalité :
from y0 . graph import NxMixedGraph
from y0 . dsl import X , Y , Z1 , Z2
# Example from:
# J. Pearl and D. Mackenzie (2018)
# The Book of Why: The New Science of Cause and Effect.
# Basic Books, p. 240.
napkin = NxMixedGraph . from_edges (
directed = [
( Z2 , Z1 ),
( Z1 , X ),
( X , Y ),
],
undirected = [
( Z2 , X ),
( Z2 , Y ),
],
)
y0
contient de nombreux exemples pré-écrits dans y0.examples
de Pearl, Shpitser, Bareinboim et d'autres.
y0
fournit des implémentations réelles de nombreux algorithmes qui sont restés non implémentés au cours des 15 dernières années de publications, notamment :
Algorithme | Référence |
---|---|
IDENTIFIANT | Shpitser et Pearl, 2006 |
IDC | Shpitser et Pearl, 2008 |
IDENTIFIANT* | Shpitser et Pearl, 2012 |
IDC* | Shpitser et Pearl, 2012 |
Résultats de substitution | Tikka et Karvanen, 2018 |
Appliquez un algorithme à un ADMG et une requête causale pour générer une estimation représentée dans le DSL comme :
from y0 . dsl import P , X , Y
from y0 . examples import napkin
from y0 . algorithm . identify import Identification , identify
# TODO after ID* and IDC* are done, we'll update this interface
query = Identification . from_expression ( graph = napkin , query = P ( Y @ X ))
estimand = identify ( query )
assert estimand == P ( Y @ X )
La version la plus récente peut être installée depuis PyPI avec :
$ pip install y0
Le code et les données les plus récents peuvent être installés directement depuis GitHub avec :
$ pip install git+https://github.com/y0-causal-inference/y0.git
Les contributions, qu'il s'agisse de déposer un problème, de faire une pull request ou de forker, sont appréciées. Voir CONTRIBUTING.md pour plus d'informations sur la manière de s'impliquer.
Le code de ce package est sous licence BSD-3-Clause.
Avant de publier une note d'application sur y0
, vous pouvez citer ce logiciel via notre fiche Zenodo (voir aussi le badge ci-dessus) :
@software { y0 ,
author = { Charles Tapley Hoyt and
Jeremy Zucker and
Marc-Antoine Parent } ,
title = { y0-causal-inference/y0 } ,
month = jun,
year = 2021 ,
publisher = { Zenodo } ,
version = { v0.1.0 } ,
doi = { 10.5281/zenodo.4950768 } ,
url = { https://doi.org/10.5281/zenodo.4950768 }
}
Ce projet a été soutenu par plusieurs organismes (par ordre alphabétique) :
Le développement du moteur d'inférence causale Y0 a été financé par les subventions suivantes :
Organisme de financement | Programme | Accorder |
---|---|---|
DARPA | Automatisation de l'extraction des connaissances scientifiques (ASKE) | HR00111990009 |
Initiative de convergence des modèles de données PNNL | Méthodes d'inférence causale et d'apprentissage automatique pour l'analyse de l'engagement des unités contraintes par la sécurité (SCY0) | 90001 |
DARPA | Automatisation de l'extraction et de la modélisation des connaissances scientifiques (ASKEM) | HR00112220036 |
Ce package a été créé avec le package cookiecutter de @audreyfeldroy en utilisant le modèle cookiecutter-snekpack de @ctoyt.
La dernière section du README est destinée si vous souhaitez vous impliquer en apportant une contribution au code.
Pour installer en mode développement, utilisez ce qui suit :
git clone git+https://github.com/y0-causal-inference/y0.git
cd y0
pip install -e .
Ce projet utilise cruft
pour maintenir le passe-partout (c'est-à-dire la configuration, les directives de contribution, la configuration de la documentation) à jour avec le package cookiecutter en amont. Mettez à jour avec ce qui suit :
pip install cruft
cruft update
Plus d'informations sur la commande de mise à jour de Cruft sont disponibles ici.
Après avoir cloné le référentiel et installé tox
avec pip install tox tox-uv
, les tests unitaires du dossier tests/
peuvent être exécutés de manière reproductible avec :
tox -e py
De plus, ces tests sont automatiquement réexécutés à chaque validation dans une action GitHub.
La documentation peut être construite localement en utilisant les éléments suivants :
git clone git+https://github.com/y0-causal-inference/y0.git
cd y0
tox -e docs
open docs/build/html/index.html
La documentation installe automatiquement le package ainsi que les docs
supplémentaires spécifiés dans le pyproject.toml
. Des plugins sphinx
comme texext
peuvent y être ajoutés. De plus, ils doivent être ajoutés à la liste extensions
dans docs/source/conf.py
.
La documentation peut être déployée sur ReadTheDocs à l'aide de ce guide. Le fichier YAML .readthedocs.yml
contient toute la configuration dont vous aurez besoin. Vous pouvez également configurer une intégration continue sur GitHub pour vérifier non seulement que Sphinx peut créer la documentation dans un environnement isolé (c'est-à-dire avec tox -e docs-test
), mais également que ReadTheDocs peut également la créer.
Zenodo est un système d'archivage à long terme qui attribue un DOI à chaque version de votre package.
Après ces étapes, vous êtes prêt à partir ! Après avoir effectué la « version » sur GitHub (les étapes à suivre sont ci-dessous), vous pouvez accéder à https://zenodo.org/account/settings/github/repository/y0-causal-inference/y0 pour voir le DOI de la version. et un lien vers l'enregistrement Zenodo pour cela.
Vous ne devez effectuer les étapes suivantes qu’une seule fois.
Vous devez effectuer les étapes suivantes une fois par machine. Créez un fichier dans votre répertoire personnel appelé .pypirc
et incluez les éléments suivants :
[distutils]
index-servers =
pypi
testpypi
[pypi]
username = __token__
password = <the API token you just got>
# This block is optional in case you want to be able to make test releases to the Test PyPI server
[testpypi]
repository = https://test.pypi.org/legacy/
username = __token__
password = <an API token from test PyPI>
Notez que puisque PyPI nécessite une authentification basée sur un jeton, nous utilisons __token__
comme utilisateur, textuellement. Si vous disposez déjà d'un fichier .pypirc
avec une section [distutils]
, assurez-vous simplement qu'il existe une clé index-servers
et que pypi
est dans sa liste associée. Plus d'informations sur la configuration du fichier .pypirc
peuvent être trouvées ici.
Après avoir installé le package en mode développement et installé tox
avec pip install tox tox-uv
, exécutez ce qui suit à partir du shell :
tox -e finish
Ce script effectue les opérations suivantes :
pyproject.toml
, CITATION.cff
, src/y0/version.py
et docs/source/conf.py
pour ne pas avoir le suffixe -dev
build
twine
.tox -e bumpversion -- minor
après. Cela incitera Zenodo à attribuer également un DOI à votre version.