This release adds scikit-learn 1.9 support (fixing an import causalml.dataset failure present on the 0.16.0 wheel, #926), native Polars support across all meta-learners, a JAX/flax.nnx backend for DragonNet, and makes the meta-learners scikit-learn compliant (BaseEstimator, so clone() and get_params() work). It also adds the RATE evaluation metric and post-fit confidence intervals for BaseTLearner, plus numerous bug fixes.
New Features
- Add native Polars DataFrame, Series, and LazyFrame support for all meta-learners by @aman-coder03 in #901
- Polish Polars support and add bootstrap CI test coverage by @aman-coder03 in #921
- Add JAX/flax.nnx backend for DragonNet by @xrhd in #918
- docs: document JAX backend for DragonNet by @xrhd in #919
- Make meta-learners scikit-learn compliant via BaseEstimator by @aman-coder03 in #912
- Add Rank-weighted Average Treatment Effect (RATE) metric by @aman-coder03 in #887
- Add
rate_score()with bootstrap confidence intervals and p-values by @aman-coder03 in #890 - Add AIPW docstring warning to
get_toc()andrate_score()by @jeongyoonlee in #891 - Add post-fit confidence intervals to
BaseTLearnerviastore_bootstrapsandreturn_ciby @aman-coder03 in #886 - Support NaN values in UpliftTree and UpliftRandomForest by @aman-coder03 in #860
scikit-learn 1.9 Support
- Fix for compatibility with sklearn v1.9.0 by @jakevdp in #903
- Fix CausalRandomForestRegressor.fit() on scikit-learn 1.9 by @jeongyoonlee in #907
- Support CausalRandomForestRegressor.calculate_error() on scikit-learn >= 1.9 by @jeongyoonlee in #909
Bug Fixes
- Fix #904: Prevent deepcopy of fitted templates in bootstrap and correct predict validation ordering by @Saurav-Gupta-9741 in #910
- Optimised training, inference and memory for metalearners in multitreatment settings by @Ic3fr0g in #896
- Fix UpliftRandomForest predict shape mismatch with multiple treatments by @jeongyoonlee in #884
- Fix uplift tree p-value NaN from division by zero by @jeongyoonlee in #882
- Fix CausalRandomForestRegressor predicting inf from division by zero by @jeongyoonlee in #883
- Fix SensitivityPlaceboTreatment ignoring actual treatment groups by @jeongyoonlee in #880
- Fix seed parameter TypeError in BaseDRLearner bootstrap CI by @mohsinm-dev in #879
- Fix ValueError on read-only arrays in BaseSLearner.predict() by @mohsinm-dev in #878
- Add input validation to auuc_score for missing model columns by @jeongyoonlee in #881
- Make xgboost optional in synthetic dataset generation by @Si-ra-kri in #872
- Bug Fix: use iloc to index pd.Series by @bekojuniranjan in #877
Build / CI
- Make Cython line tracing opt-in to keep release wheels fast by @HSJung93 in #914
- Remove the PyPI token from GitHub Actions in favor of the Trusted Publishing by @jeongyoonlee in #871
- Upgrade GitHub Actions for Node 24 compatibility by @salmanmkc in #874
- Upgrade GitHub Actions to latest versions by @salmanmkc in #875
- ci: declare workflow-level
contents: readon 4 workflows by @arpitjain099 in #900
⚠️ Breaking Changes
- Meta-learner
__init__signatures (#912): to become scikit-learnBaseEstimators, each learner now stores its constructor arguments verbatim and builds models infit(). Most visibly,XGBRRegressorno longer accepts arbitrary**kwargs— pass XGBoost parameters via the explicitxgb_kwargs=<dict>argument.
Full Changelog: v0.16.0...v0.17.0