Skip to content

v0.17.0

Latest

Choose a tag to compare

@jeongyoonlee jeongyoonlee released this 04 Jul 06:50
dff8ec3

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() and rate_score() by @jeongyoonlee in #891
  • Add post-fit confidence intervals to BaseTLearner via store_bootstraps and return_ci by @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: read on 4 workflows by @arpitjain099 in #900

⚠️ Breaking Changes

  • Meta-learner __init__ signatures (#912): to become scikit-learn BaseEstimators, each learner now stores its constructor arguments verbatim and builds models in fit(). Most visibly, XGBRRegressor no longer accepts arbitrary **kwargs — pass XGBoost parameters via the explicit xgb_kwargs=<dict> argument.

Full Changelog: v0.16.0...v0.17.0