- This release fixes the build failure on macOS and a few bugs in
UpliftTreeClassifier
. - We have two new contributors, @lee-junseok and @IanDelbridge. Thanks for your contributions!
- Relax
pandas
version requirement by @jeongyoonlee in #743 - Remove undefined variables in
match.__main__()
by @jeongyoonlee in #749 - Fix
distr_plot_single_sim()
by @jeongyoonlee in #750 - Add
with_std
,with_counts
tocreate_table_one
by @lee-junseok in #748 - fix stratified sampling call by @IanDelbridge in #756
- 20240207 honest leaf size by @IanDelbridge in #753
- 757: add
return_ci=True
in sensitivity by @lee-junseok in #758 - Update sensitivity tests with more meta-learners by @jeongyoonlee in #759
- manually specify
multiprocessing
usefork
insetup.py
by @IanDelbridge in #754
- @lee-junseok made their first contribution in #748
- @IanDelbridge made their first contribution in #756
- In this release, we revamped documentation, cleaned up dependencies, and improved installation - in addition to the long list of bug fixes.
- We have three new contributors, @peterloleungyau, @SuperBo, and @ZiJiaW, who submitted their first PRs to CausalML. @erikcs also contributed to @ras44's PR #729 to add the wrapper for his MAQ implementation to CausalML. Thanks for your contributions!
- Update python-publish.yml by @jeongyoonlee in #673
- Add build.[os, tools.python] to .readthedocs.yml by @jeongyoonlee in #676
- Update notebook example with causal trees interpretation by @alexander-pv in #683
- Remove the numpy and pandas version restriction in pyproject.toml by @jeongyoonlee in #681
- Add governance documents by @jeongyoonlee in #688
- Update GOVERNANCE.md by @ras44 in #691
- Dev/governance docs to snake-case by @ras44 in #693
- Reduce sklearn dependency in causalml by @alexander-pv in #686
- Update MAINTAINERS.md by @jeongyoonlee in #696
- Modified to speed up UpliftTreeClassifier.growDecisionTreeFrom. by @peterloleungyau in #695
- Update README.md by @ras44 in #698
- Add notebook examples to docs by @jeongyoonlee in #697
- resolves change requests in #166 by @ras44 in #701
- Fix the readthedocs build error by @jeongyoonlee in #702
- Replace Stack and PriorityHeap with cpp stack/heap methods in trees by @SuperBo in #700
- Hotfix for #701 by @jeongyoonlee in #705
- Dev/699 win build fix by @ras44 in #710
- expose n_jobs for rlearner by @ZiJiaW in #714
- minimal fix to resolve #707 by @ras44 in #720
- Add Python 3.10, 3.11, 3.12 to the testing by @cclauss in #454
- Remove Python 3.12 from the build tests in python-test.yaml by @jeongyoonlee in #726
- fix plot_std_diffs, add bal_tol, condense to one plot by @ras44 in #723
- Dev/677 documentation by @ras44 in #725
- documentation updates by @ras44 in #728
- resolves #730, docs clean conda install by @ras44 in #731
- minimal wrapper of MAQ #662 by @ras44 in #729
- Temporary fix for causal trees missing values support #733 by @alexander-pv in #734
- resolves #639, credit due to Dong Liu by @ras44 in #722
- @peterloleungyau made their first contribution in #695
- @SuperBo made their first contribution in #700
- @ZiJiaW made their first contribution in #714
- This release mainly addressed installation issues and updated documentation accordingly.
- We have 4 new contributors. @bsaunders27, @xhulianoThe1, @zpppy, and @bsaunders23. Thanks for your contributions!
- Update the python-publish workflow file to fix the package publish Gi… by @jeongyoonlee in #633
- Update Cython dependency by @alexander-pv in #640
- Fix for builds on Mac M1 infrastructure by @bsaunders27 in #641
- code cleanups by @xhulianoThe1 in #634
- support valid error early stopping by @zpppy in #614
- fix: update to
envs/
conda build for precompiled M1 installs by @bsaunders27 in #646 - Installation updates to README and .github/workflows by @ras44 in #637
- fix: simulate_randomized_trial by @bsaunders23 in #656
- issue 252 by @vincewu51 in #660
- ras44/651 graph viz, resolves #651 by @ras44 in #661
- linted with black by @ras44 in #663
- Fix issue 650 by @vincewu51 in #659
- Install graphviz in the workflow builds by @jeongyoonlee in #668
- Update docs/installation.rst by @jeongyoonlee in #667
- Schedule monthly PyPI install tests by @jeongyoonlee in #670
- @bsaunders27 made their first contribution in #641
- @xhulianoThe1 made their first contribution in #634
- @zpppy made their first contribution in #614
- @bsaunders23 made their first contribution in #656
- CausalML surpassed 2MM downloads on PyPI and 4,100 stars on GitHub. Thanks for choosing CausalML and supporting us on GitHub.
- We have 7 new contributors: @darthtrevino, @ras44, @AbhishekVermaDH, @joel-mcmurry, @AlxClt, @kklein, and @volico. Thanks for your contributions!
- Fix the readthedocs build failure by @jeongyoonlee in #545
- Add
pyproject.toml
with basic build dependencies for PEP518 compliance by @darthtrevino in #553 - bump
numpy
from 1.20.3 to 1.23.2 inenvironment-py38.yml
#338 by @ras44 in #550 - CausalTree split criterions fix and fit optimization by @alexander-pv in #557
- fixing math notations for proper rendering by @AbhishekVermaDH in #558
- Update
methodology.rst
by @joel-mcmurry in #568 - Causal trees bootstrapping and
max_leaf_nodes
fixes with minor update by @alexander-pv in #583 - Fix #596 by @AlxClt in #597
- Add
**kwargs
toExplainer.plot_shap_values()
by @jeongyoonlee in #603 - Make the Adam optimization optional and learning rate/epochs configurable in DragonNet by @jeongyoonlee in #604
- Fix bug in variance calculation in drivlearner. by @huigangchen in #606
- Bug Fix in Dragonnet: Adam parameter name lr depreciation by @huigangchen in #617
- Fix AttributeError in builds with
numpy>=1.24
andpandas>=2.0
by @jeongyoonlee in #631 - Pass on
**kwargs
inplot_shap_values
of base meta leaner by @kklein in #627 - Bump
scipy
from 1.4.1 to 1.10.0 by @dependabot in #629 - Feature/ttest criterion by @volico in #570
- Added Interaction Tree (IT), Causal Inference Tree (CIT), and Invariant DDP (IDDP) by @jroessler in #562
- Causal trees option to return counterfactual outcomes by @alexander-pv in #623
- @darthtrevino made their first contribution in #553
- @ras44 made their first contribution in #550
- @AbhishekVermaDH made their first contribution in #558
- @joel-mcmurry made their first contribution in #568
- @AlxClt made their first contribution in #597
- @kklein made their first contribution in #627
- @volico made their first contribution in #570
- CausalML surpassed 1MM downloads on PyPI and 3,200 stars on GitHub. Thanks for choosing CausalML and supporting us on GitHub.
- We have 7 new contributors @saiwing-yeung, @lixuan12315, @aldenrogers, @vincewu51, @AlkanSte, @enzoliao, and @alexander-pv. Thanks for your contributions!
- @alexander-pv revamped CausalTreeRegressor and added CausalRandomForestRegressor with more seamless integration with scikit-learn's Cython tree module. He also added integration with shap for causal tree/ random forest interpretation. Please check out the example notebook.
- We dropped the support for Python 3.6 and removed its test workflow.
- Fix typo
(% -> $)
by @saiwing-yeung in #488 - Add function for calculating PNS bounds by @t-tte in #482
- Fix hard coding bug by @t-tte in #492
- Update README of
conda
install and instruction of maintain inconda-forge
by @ppstacy in #485 - Update
examples.rst
by @lixuan12315 in #496 - Fix incorrect
effect_learner_objective
inXGBRRegressor
by @jeongyoonlee in #504 - Fix Filter F doesn't work with latest
statsmodels
' F test f-value format by @paullo0106 in #505 - Exclude tests in
setup.py
by @aldenrogers in #508 - Enabling higher orders feature importance for F filter and LR filter by @zhenyuz0500 in #509
- Ate pretrain 0506 by @vincewu51 in #511
- Update
methodology.rst
by @AlkanSte in #518 - Fix the bug of incorrect result in qini for multiple models by @enzoliao in #520
- Test
get_qini()
by @enzoliao in #523 - Fixed typo in
uplift_trees_with_synthetic_data.ipynb
by @jroessler in #531 - Remove Python 3.6 test from workflows by @jeongyoonlee in #535
- Causal trees update by @alexander-pv in #522
- Causal trees interpretation example by @alexander-pv in #536
This patch is to release a version without the constraint for Shap to be abled to use for Conda.
- #483 by @ppstacy: Modify the requirement version of Shap
This patch includes three updates by @tonkolviktor and @heiderich as follows. We also start using black, a Python formatter. Please check out the updated contribution guideline to learn how to use it.
- #473 by @tonkolviktor: Open up the scipy dependency version
- #476 by @heiderich: Use preferred backend for joblib instead of hard-coding it
- #477 by @heiderich: Allow parallel prediction for UpliftRandomForestClassifier and make the joblib's preferred backend configurable
This patch includes two bug fixes for UpliftRandomForestClassifier as follows:
- #462 by @paullo0106: Use the correct treatment_idx for fillTree() when applying validation data set
- #468 by @jeongyoonlee: Switch the joblib backend for UpliftRandomForestClassifier to threading to avoid memory copy across trees
- CausalML surpassed 637K downloads on PyPI and 2,500 stars on Github!
- We have 4 new community contributors, Luis (@lgmoneda), Ravi (@raviksharma), Louis (@LouisHernandez17) and JackRab (@JackRab). Thanks for the contribution!
- We refactored and speeded up UpliftTreeClassifier/UpliftRandomForestClassifier by 5x with Cython (#422 #440 by @jeongyoonlee)
- We revamped our API documentation, it now includes the latest methodology, references, installation, notebook examples, and graphs! (#413 by @huigangchen @t-tte @zhenyuz0500 @jeongyoonlee @paullo0106)
- Our team gave talks at 2021 Conference on Digital Experimentation @ MIT (CODE@MIT), Causal Data Science Meeting 2021, and KDD 2021 Tutorials on CausalML introduction and applications. Please take a look if you missed them! Full list of publications and talks can be found here.
- Update documentation on Instrument Variable methods @huigangchen (#447)
- Add benchmark simulation studies example notebook by @t-tte (#443)
- Add sample_weight support for R-learner by @paullo0106 (#425)
- Fix incorrect binning of numeric features in UpliftTreeClassifier by @jeongyoonlee (#420)
- Update papers, talks, and publication info to README and refs.bib by @zhenyuz0500 (#410 #414 #433)
- Add instruction for contributing.md doc by @jeongyoonlee (#408)
- Fix incorrect feature importance calculation logic by @paullo0106 (#406)
- Add parallel jobs support for NearestNeighbors search with n_jobs parameter by @paullo0106 (#389)
- Fix bug in simulate_randomized_trial by @jroessler (#385)
- Add GA pytest workflow by @ppstacy (#380)
- CausalML surpassed 2K stars!
- We have 3 new community contributors, Jannik (@jroessler), Mohamed (@ibraaaa), and Leo (@lleiou). Thanks for the contribution!
- Make tensorflow dependency optional and add python 3.9 support by @jeongyoonlee (#343)
- Add delta-delta-p (ddp) tree inference approach by @jroessler (#327)
- Add conda env files for Python 3.6, 3.7, and 3.8 by @jeongyoonlee (#324)
- Fix inconsistent feature importance calculation in uplift tree by @paullo0106 (#372)
- Fix filter method failure with NaNs in the data issue by @manojbalaji1 (#367)
- Add automatic package publish by @jeongyoonlee (#354)
- Fix typo in unit_selection optimization by @jeongyoonlee (#347)
- Fix docs build failure by @jeongyoonlee (#335)
- Convert pandas inputs to numpy in S/T/R Learners by @jeongyoonlee (#333)
- Require scikit-learn as a dependency of setup.py by @ibraaaa (#325)
- Fix AttributeError when passing in Outcome and Effect learner to R-Learner by @paullo0106 (#320)
- Fix error when there is no positive class for KL Divergence filter by @lleiou (#311)
- Add versions to cython and numpy in setup.py for requirements.txt accordingly by @maccam912 (#306)
- CausalML surpassed 235,000 downloads!
- We have 5 new community contributors, Suraj (@surajiyer), Harsh (@HarshCasper), Manoj (@manojbalaji1), Matthew (@maccam912) and Václav (@vaclavbelak). Thanks for the contribution!
- Add Policy learner, DR learner, DRIV learner by @huigangchen (#292)
- Add wrapper for CEVAE, a deep latent-variable and variational autoencoder based model by @ppstacy(#276)
- Add propensity_learner to R-learner by @jeongyoonlee (#297)
- Add BaseLearner class for other meta-learners to inherit from without duplicated code by @jeongyoonlee (#295)
- Fix installation issue for Shap>=0.38.1 by @paullo0106 (#287)
- Fix import error for sklearn>= 0.24 by @jeongyoonlee (#283)
- Fix KeyError issue in Filter method for certain dataset by @surajiyer (#281)
- Fix inconsistent cumlift score calculation of multiple models by @vaclavbelak (#273)
- Fix duplicate values handling in feature selection method by @manojbalaji1 (#271)
- Fix the color spectrum of SHAP summary plot for feature interpretations of meta-learners by @paullo0106 (#269)
- Add IIA and value optimization related documentation by @t-tte (#264)
- Fix StratifiedKFold arguments for propensity score estimation by @paullo0106 (#262)
- Refactor the code with string format argument and is to compare object types, and change methods not using bound instance to static methods by @harshcasper (#256, #260)
- CausalML won the 1st prize at the poster session in UberML'20
- DoWhy integrated CausalML starting v0.4 (release note)
- CausalML team welcomes new project leadership, Mert Bay
- We have 4 new community contributors, Mario Wijaya (@mwijaya3), Harry Zhao (@deeplaunch), Christophe (@ccrndn) and Georg Walther (@waltherg). Thanks for the contribution!
- Add feature importance and its visualization to UpliftDecisionTrees and UpliftRF by @yungmsh (#220)
- Add feature selection example with Filter methods by @paullo0106 (#223)
- Implement propensity model abstraction for common interface by @waltherg (#223)
- Fix bug in BaseSClassifier and BaseXClassifier by @yungmsh and @ppstacy (#217), (#218)
- Fix parentNodeSummary for UpliftDecisionTrees by @paullo0106 (#238)
- Add pd.Series for propensity score condition check by @paullo0106 (#242)
- Fix the uplift random forest prediction output by @ppstacy (#236)
- Add functions and methods to init for optimization module by @mwijaya3 (#228)
- Install GitHub Stale App to close inactive issues automatically @jeongyoonlee (#237)
- Update documentation by @deeplaunch, @ccrndn, @ppstacy(#214, #231, #232)
CausalML surpassed 100,000 downloads! Thanks for the support.
- Add value optimization to optimize by @t-tte (#183)
- Add counterfactual unit selection to optimize by @t-tte (#184)
- Add sensitivity analysis to metrics by @ppstacy (#199, #212)
- Add the iv estimator submodule and add 2SLS model to it by @huigangchen (#201)
- Add GradientBoostedPropensityModel by @yungmsh (#193)
- Add covariate balance visualization by @yluogit (#200)
- Fix bug in the X learner propensity model by @ppstacy (#209)
- Update package dependencies by @jeongyoonlee (#195, #197)
- Update documentation by @jeongyoonlee, @ppstacy and @yluogit (#181, #202, #205)
Special thanks to our new community contributor, Katherine (@khof312)!
- Adjust matching distances by a factor of the number of matching columns in propensity score matching by @yungmsh (#157)
- Add TMLE-based AUUC/Qini/lift calculation and plotting by @ppstacy (#165)
- Fix typos and update documents by @paullo0106, @khof312, @jeongyoonlee (#150, #151, #155, #163)
- Fix error in UpliftTreeClassifier.kl_divergence() for pk == 1 or 0 by @jeongyoonlee (#169)
- Fix error in BaseRRegressor.fit() without propensity score input by @jeongyoonlee (#170)
Special thanks to our new community contributor, Steve (@steveyang90)!
- Add a new nn inference submodule with DragonNet implementation by @yungmsh
- Add a new feature selection submodule with filter feature selection methods by @zhenyuz0500
- Make propensity scores optional in all meta-learners by @ppstacy
- Replace eli5 permutation importance with sklearn's by @yluogit
- Replace ElasticNetCV with LogisticRegressionCV in propensity.py by @yungmsh
- Fix the normalized uplift curve plot with negative ATE by @jeongyoonlee
- Fix the TravisCI FOSSA error for PRs from forked repo by @steveyang90
- Add documentation about tree visualization by @zhenyuz0500
Special thanks to our new community contributors, Fritz (@fritzo), Peter (@peterfoley) and Tomasz (@TomaszZamacinski)!
- Improve UpliftTreeClassifier's speed by 4 times by @jeongyoonlee
- Fix impurity computation in CausalTreeRegressor by @TomaszZamacinski
- Fix XGBoost related warnings by @peterfoley
- Fix typos and improve documentation by @peterfoley and @fritzo
Special thanks to our new community contributors, Paul (@paullo0106) and Florian (@FlorianWilhelm)!
- Add TMLELearner, targeted maximum likelihood estimator to inference.meta by @huigangchen
- Add an option to DGPs for regression to simulate imbalanced propensity distribution by @huigangchen
- Fix incorrect edge connections, and add more information in the uplift tree plot by @paullo0106
- Fix an installation error related to Cython and numpy by @FlorianWilhelm
- Drop Python 2 support from setup.py by @jeongyoonlee
- Update causaltree.pyx Cython code to be compatible with scikit-learn>=0.21.0 by @jeongyoonlee
- Add uplift_tree_plot() to inference.tree to visualize UpliftTreeClassifier by @zhenyuz0500
- Add the Explainer class to inference.meta to provide feature importances using SHAP and eli5's PermutationImportance by @yungmsh
- Add bootstrap confidence intervals for the average treatment effect estimates of meta learners by @ppstacy
- Extend meta-learners to support classification by @t-tte
- Extend meta-learners to support multiple treatments by @yungmsh
- Fix a bug in uplift curves and add Qini curves/scores to metrics by @jeongyoonlee
- Add inference.meta.XGBRRegressor with early stopping and ranking optimization by @yluogit
- Add optimize.PolicyLearner based on Athey and Wager 2017 :cite:`athey2017efficient`
- Add the CausalTreeRegressor estimator based on Athey and Imbens 2016 :cite:`athey2016recursive` (experimental)
- Add missing imports in features.py to enable label encoding with grouping of rare values in LabelEncoder()
- Fix a bug that caused the mismatch between training and prediction features in inference.meta.tlearner.predict()
- Initial release with the Uplift Random Forest, and S/T/X/R-learners.