effector


Nameeffector JSON
Version 0.1.12 PyPI version JSON
download
home_pageNone
SummaryAn eXplainable AI package for tabular data.
upload_time2025-07-12 21:11:14
maintainerNone
docs_urlNone
authorNone
requires_python>=3.10
licenseNone
keywords explainability interpretability machine learning deep learning regional xai feature effect
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # Effector

<p align="center">
  <img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/effector_logo.png" width="500"/>
</p>

[![PyPI version](https://badge.fury.io/py/effector.svg?icon=si%3Apython)](https://badge.fury.io/py/effector)
![Execute Tests](https://github.com/givasile/effector/actions/workflows/run_tests.yml/badge.svg)
[![codecov](https://codecov.io/gh/givasile/effector/branch/main/graph/badge.svg)](https://codecov.io/gh/givasile/effector)
![Publish Documentation](https://github.com/givasile/effector/actions/workflows/publish_documentation.yml/badge.svg)
[![PyPI Downloads](https://static.pepy.tech/badge/effector)](https://pepy.tech/projects/effector)
[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)

---

`effector` an eXplainable AI package for **tabular data**. It:

- creates [global and regional](https://xai-effector.github.io/quickstart/global_and_regional_effects/) effect plots
- has a [simple API](https://xai-effector.github.io/quickstart/simple_api/) with smart defaults, but can become [flexible](https://xai-effector.github.io/quickstart/flexible_api/) if needed
- is model agnostic; can explain [any underlying ML model](https://xai-effector.github.io/)
- integrates easily with popular ML libraries, like [Scikit-Learn, Tensorflow and Pytorch](https://xai-effector.github.io/quickstart/simple_api/#__tabbed_2_2)
- is fast, for both [global](https://xai-effector.github.io/notebooks/guides/efficiency_global/) and [regional](https://xai-effector.github.io/notebooks/guides/efficiency_global/) methods
- provides a large collection of [global and regional effects methods](https://xai-effector.github.io/#supported-methods)

---

πŸ“– [Documentation](https://xai-effector.github.io/) | πŸ” [Intro to global and regional effects](https://xai-effector.github.io/quickstart/global_and_regional_effects/) | πŸ”§ [API](https://xai-effector.github.io/api/) | πŸ— [Examples](https://xai-effector.github.io/examples)

---

## Installation

Effector requires Python 3.10+:

```bash
pip install effector
```

Dependencies: `numpy`, `scipy`, `matplotlib`, `tqdm`, `shap`.

---

## Quickstart

### Train an ML model

```python
import effector
import keras
import numpy as np
import tensorflow as tf

np.random.seed(42)
tf.random.set_seed(42)

# Load dataset
bike_sharing = effector.datasets.BikeSharing(pcg_train=0.8)
X_train, Y_train = bike_sharing.x_train, bike_sharing.y_train
X_test, Y_test = bike_sharing.x_test, bike_sharing.y_test

# Define and train a neural network
model = keras.Sequential([
    keras.layers.Dense(1024, activation="relu"),
    keras.layers.Dense(512, activation="relu"),
    keras.layers.Dense(256, activation="relu"),
    keras.layers.Dense(1)
])
model.compile(optimizer="adam", loss="mse", metrics=["mae", keras.metrics.RootMeanSquaredError()])
model.fit(X_train, Y_train, batch_size=512, epochs=20, verbose=1)
model.evaluate(X_test, Y_test, verbose=1)
```

### Wrap it in a callable

```python
def predict(x):
    return model(x).numpy().squeeze()
```

### Explain it with global effect plots

```python
# Initialize the Partial Dependence Plot (PDP) object
pdp = effector.PDP(
    X_test,  # Use the test set as background data
    predict,  # Prediction function
    feature_names=bike_sharing.feature_names,  # (optional) Feature names
    target_name=bike_sharing.target_name  # (optional) Target variable name
)

# Plot the effect of a feature
pdp.plot(
    feature=3,  # Select the 3rd feature (feature: hour)
    nof_ice=200,  # (optional) Number of Individual Conditional Expectation (ICE) curves to plot
    scale_x={"mean": bike_sharing.x_test_mu[3], "std": bike_sharing.x_test_std[3]},  # (optional) Scale x-axis
    scale_y={"mean": bike_sharing.y_test_mu, "std": bike_sharing.y_test_std},  # (optional) Scale y-axis
    centering=True,  # (optional) Center PDP and ICE curves
    show_avg_output=True,  # (optional) Display the average prediction
    y_limits=[-200, 1000]  # (optional) Set y-axis limits
)
```

![Feature effect plot](https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_3_0.png)

### Explain it with regional effect plots

```python
# Initialize the Regional Partial Dependence Plot (RegionalPDP)
r_pdp = effector.RegionalPDP(
    X_test,  # Test set data
    predict,  # Prediction function
    feature_names=bike_sharing.feature_names,  # Feature names
    target_name=bike_sharing.target_name  # Target variable name
)

# Summarize the subregions of the 3rd feature (temperature)
r_pdp.summary(
    features=3,  # Select the 3rd feature for the summary
    scale_x_list=[  # scale each feature with mean and std
        {"mean": bike_sharing.x_test_mu[i], "std": bike_sharing.x_test_std[i]}
        for i in range(X_test.shape[1])
    ]
)
```

```
Feature 3 - Full partition tree:
🌳 Full Tree Structure:
───────────────────────
hr πŸ”Ή [id: 0 | heter: 0.43 | inst: 3476 | w: 1.00]
    workingday = 0.00 πŸ”Ή [id: 1 | heter: 0.36 | inst: 1129 | w: 0.32]
        temp ≀ 6.50 πŸ”Ή [id: 3 | heter: 0.17 | inst: 568 | w: 0.16]
        temp > 6.50 πŸ”Ή [id: 4 | heter: 0.21 | inst: 561 | w: 0.16]
    workingday β‰  0.00 πŸ”Ή [id: 2 | heter: 0.28 | inst: 2347 | w: 0.68]
        temp ≀ 6.50 πŸ”Ή [id: 5 | heter: 0.19 | inst: 953 | w: 0.27]
        temp > 6.50 πŸ”Ή [id: 6 | heter: 0.20 | inst: 1394 | w: 0.40]
--------------------------------------------------
Feature 3 - Statistics per tree level:
🌳 Tree Summary:
─────────────────
Level 0πŸ”Ήheter: 0.43
    Level 1πŸ”Ήheter: 0.31 | πŸ”»0.12 (28.15%)
        Level 2πŸ”Ήheter: 0.19 | πŸ”»0.11 (37.10%)
```

The summary of feature `hr` (hour) says that its effect on the output is highly dependent on the value of features:
- `workingday`, wheteher it is a workingday or not
- `temp`, what is the temperature the specific hour

Let's see how the effect changes on these subregions!

---
#### Is it workingday or not?

```python
# Plot regional effects after the first-level split (workingday vs non-workingday)
for node_idx in [1, 2]:  # Iterate over the nodes of the first-level split
    r_pdp.plot(
        feature=3,  # Feature 3 (temperature)
        node_idx=node_idx,  # Node index (1: workingday, 2: non-workingday)
        nof_ice=200,  # Number of ICE curves
        scale_x_list=[  # Scale features by mean and std
            {"mean": bike_sharing.x_test_mu[i], "std": bike_sharing.x_test_std[i]}
            for i in range(X_test.shape[1])
        ],
        scale_y={"mean": bike_sharing.y_test_mu, "std": bike_sharing.y_test_std},  # Scale the target
        y_limits=[-200, 1000]  # Set y-axis limits
    )
```

<table>
  <tr>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_5_0.png" alt="Feature effect plot"></td>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_5_1.png" alt="Feature effect plot"></td>
  </tr>
</table>


#### Is it hot or cold?

```python
# Plot regional effects after second-level splits (workingday vs non-workingday and hot vs cold temperature)
for node_idx in [3, 4, 5, 6]:  # Iterate over the nodes of the second-level splits
    r_pdp.plot(
        feature=3,  # Feature 3 (temperature)
        node_idx=node_idx,  # Node index (hot/cold temperature and workingday/non-workingday)
        nof_ice=200,  # Number of ICE curves
        scale_x_list=[  # Scale features by mean and std
            {"mean": bike_sharing.x_test_mu[i], "std": bike_sharing.x_test_std[i]}
            for i in range(X_test.shape[1])
        ],
        scale_y={"mean": bike_sharing.y_test_mu, "std": bike_sharing.y_test_std},  # Scale target
        y_limits=[-200, 1000]  # Set y-axis limits
    )

```

<table>
  <tr>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_0.png" alt="Feature effect plot"></td>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_1.png" alt="Feature effect plot"></td>
  </tr>
  <tr>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_2.png" alt="Feature effect plot"></td>
    <td><img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_3.png" alt="Feature effect plot"></td>
  </tr>
</table>

---

## Supported Methods

`effector` implements global and regional effect methods:

| Method  | Global Effect  | Regional Effect | Reference | ML model          | Speed                                        |
|---------|----------------|-----------------|-----------|-------------------|----------------------------------------------|
| PDP     | `PDP`          | `RegionalPDP`   | [PDP](https://projecteuclid.org/euclid.aos/1013203451) | any               | Fast for a small dataset                     |
| d-PDP   | `DerPDP`       | `RegionalDerPDP`| [d-PDP](https://arxiv.org/abs/1309.6392) | differentiable    | Fast for a small dataset      |
| ALE     | `ALE`          | `RegionalALE`   | [ALE](https://academic.oup.com/jrsssb/article/82/4/1059/7056085) | any | Fast                                         |
| RHALE   | `RHALE`        | `RegionalRHALE` | [RHALE](https://ebooks.iospress.nl/doi/10.3233/FAIA230354) | differentiable    | Very fast                                    |
| SHAP-DP | `ShapDP`       | `RegionalShapDP`| [SHAP](https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions) | any | Fast for a small dataset and a light ML model |

---

## Method Selection Guide

From the runtime persepective there are three criterias:

- is the dataset `small` (N<10K) or `large` (N>10K instances) ? 
- is the ML model `light` (runtime < 0.1s) or `heavy` (runtime > 0.1s) ?
- is the ML model `differentiable` or `non-differentiable` ?

Trust us and follow this guide:

- `light` + `small` + `differentiable` = `any([PDP, RHALE, ShapDP, ALE, DerPDP])` 
- `light` + `small` + `non-differentiable`: `[PDP, ALE, ShapDP]`
- `heavy` + `small` + `differentiable` = `any([PDP, RHALE, ALE, DerPDP])`
- `heavy` + `small` + `non differentiable` = `any([PDP, ALE])`
- `big` +  `not differentiable` = `ALE`
- `big` +  `differentiable` = `RHALE` 

---

## Citation

If you use `effector`, please cite it:

```bibtex
@misc{gkolemis2024effector,
  title={effector: A Python package for regional explanations},
  author={Vasilis Gkolemis et al.},
  year={2024},
  eprint={2404.02629},
  archivePrefix={arXiv},
  primaryClass={cs.LG}
}
```

---

## Spotlight on `effector`

### πŸ“š Featured Publications  
- **Gkolemis, Vasilis, et al.**  
  *"Fast and Accurate Regional Effect Plots for Automated Tabular Data Analysis."*  
  [Proceedings of the VLDB Endowment](https://vldb.org/workshops/2024/proceedings/TaDA/TaDA.5.pdf) | ISSN 2150-8097  

### 🎀 Talks & Presentations  
- **LMU-IML Group Talk**  
  [Slides & Materials](https://github.com/givasile/effector-paper/tree/main/presentation-general) | [LMU-IML Research](https://www.slds.stat.uni-muenchen.de/research/explainable-ai.html)  
- **AIDAPT Plenary Meeting**  
  [Deep dive into effector](https://github.com/givasile/presentation-aidapt-xai-effector/tree/main)  
- **XAI World Conference 2024**  
  [Poster](https://github.com/givasile/effector-paper/blob/main/poster-general/main.pdf) | [Paper](https://github.com/givasile/effector-paper/blob/main/xai-conference-submission/effector_xai_conf.pdf)  

### 🌍 Adoption & Collaborations  
- **[AIDAPT Project](https://www.ai-dapt.eu/effector/)**  
  Leveraging `effector` for explainable AI solutions.  

### πŸ” Additional Resources  

- **Medium Post**  
  [Effector: An eXplainability Library for Global and Regional Effects](https://medium.com/@ntipakos/effector-bfe17206672c)

- **Courses & Lists**:  
  [IML Course @ LMU](https://slds-lmu.github.io/iml/)  
  [Awesome ML Interpretability](https://github.com/jphall663/awesome-machine-learning-interpretability)  
  [Awesome XAI](https://github.com/wangyongjie-ntu/Awesome-explainable-AI)  
  [Best of ML Python](https://github.com/ml-tooling/best-of-ml-python)  

### πŸ“š Related Publications

Papers that have inspired `effector`:

- **REPID: Regional Effects in Predictive Models**  
  Herbinger et al., 2022 - [Link](https://proceedings.mlr.press/v151/herbinger22a)  

- **Decomposing Global Feature Effects Based on Feature Interactions**  
  Herbinger et al., 2023 - [Link](https://arxiv.org/pdf/2306.00541.pdf)  

- **RHALE: Robust Heterogeneity-Aware Effects**  
  Gkolemis Vasilis et al., 2023 - [Link](https://ebooks.iospress.nl/doi/10.3233/FAIA230354)  

- **DALE: Decomposing Global Feature Effects**  
  Gkolemis Vasilis et al., 2023 - [Link](https://proceedings.mlr.press/v189/gkolemis23a/gkolemis23a.pdf)  

- **Greedy Function Approximation: A Gradient Boosting Machine**  
  Friedman, 2001 - [Link](https://projecteuclid.org/euclid.aos/1013203451)  

- **Visualizing Predictor Effects in Black-Box Models**  
  Apley, 2016 - [Link](https://arxiv.org/abs/1612.08468)  

- **SHAP: A Unified Approach to Model Interpretation**  
  Lundberg & Lee, 2017 - [Link](https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions)  

- **Regionally Additive Models: Explainable-by-design models minimizing feature interactions**  
  Gkolemis Vasilis et al., 2023 - [Link](https://arxiv.org/abs/2309.12215)

---

## License

`effector` is released under the [MIT License](https://github.com/givasile/effector/blob/main/LICENSE).



---

## Powered by:

- **[AIDAPT](https://www.ai-dapt.eu/)**  
  <img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/aidapt_logo.png" width="130"/>

- **XMANAI**  
<img src="https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/xmanai_logo.jpg" width="70"/>

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "effector",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.10",
    "maintainer_email": "Christos Diou <cdiou@hua.gr>, Julia Herbinger <julia.herbinger@gmail.com>, Giuseppe Casalicchio <giuseppe.casalicchio@gmail.com>, Hubert Baniecki <h.baniecki@uw.edu.pl>, Dimitris Kyriakopoulos <dimitrisskyriakopoulos@gmail.com>, Dimitrios Rontogiannis <dimronto@gmail.com>",
    "keywords": "explainability, interpretability, machine learning, deep learning, regional XAI, feature effect",
    "author": null,
    "author_email": "Vasilis Gkolemis <ntipakos@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/67/31/e679519d4d003d5bc5684c370034e15857b9454934192a9f29b3c7c0b22c/effector-0.1.12.tar.gz",
    "platform": null,
    "description": "# Effector\n\n<p align=\"center\">\n  <img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/effector_logo.png\" width=\"500\"/>\n</p>\n\n[![PyPI version](https://badge.fury.io/py/effector.svg?icon=si%3Apython)](https://badge.fury.io/py/effector)\n![Execute Tests](https://github.com/givasile/effector/actions/workflows/run_tests.yml/badge.svg)\n[![codecov](https://codecov.io/gh/givasile/effector/branch/main/graph/badge.svg)](https://codecov.io/gh/givasile/effector)\n![Publish Documentation](https://github.com/givasile/effector/actions/workflows/publish_documentation.yml/badge.svg)\n[![PyPI Downloads](https://static.pepy.tech/badge/effector)](https://pepy.tech/projects/effector)\n[![Code style: black](https://img.shields.io/badge/code%20style-black-000000.svg)](https://github.com/ambv/black)\n\n---\n\n`effector` an eXplainable AI package for **tabular data**. It:\n\n- creates [global and regional](https://xai-effector.github.io/quickstart/global_and_regional_effects/) effect plots\n- has a [simple API](https://xai-effector.github.io/quickstart/simple_api/) with smart defaults, but can become [flexible](https://xai-effector.github.io/quickstart/flexible_api/) if needed\n- is model agnostic; can explain [any underlying ML model](https://xai-effector.github.io/)\n- integrates easily with popular ML libraries, like [Scikit-Learn, Tensorflow and Pytorch](https://xai-effector.github.io/quickstart/simple_api/#__tabbed_2_2)\n- is fast, for both [global](https://xai-effector.github.io/notebooks/guides/efficiency_global/) and [regional](https://xai-effector.github.io/notebooks/guides/efficiency_global/) methods\n- provides a large collection of [global and regional effects methods](https://xai-effector.github.io/#supported-methods)\n\n---\n\n\ud83d\udcd6 [Documentation](https://xai-effector.github.io/) | \ud83d\udd0d [Intro to global and regional effects](https://xai-effector.github.io/quickstart/global_and_regional_effects/) | \ud83d\udd27 [API](https://xai-effector.github.io/api/) | \ud83c\udfd7 [Examples](https://xai-effector.github.io/examples)\n\n---\n\n## Installation\n\nEffector requires Python 3.10+:\n\n```bash\npip install effector\n```\n\nDependencies: `numpy`, `scipy`, `matplotlib`, `tqdm`, `shap`.\n\n---\n\n## Quickstart\n\n### Train an ML model\n\n```python\nimport effector\nimport keras\nimport numpy as np\nimport tensorflow as tf\n\nnp.random.seed(42)\ntf.random.set_seed(42)\n\n# Load dataset\nbike_sharing = effector.datasets.BikeSharing(pcg_train=0.8)\nX_train, Y_train = bike_sharing.x_train, bike_sharing.y_train\nX_test, Y_test = bike_sharing.x_test, bike_sharing.y_test\n\n# Define and train a neural network\nmodel = keras.Sequential([\n    keras.layers.Dense(1024, activation=\"relu\"),\n    keras.layers.Dense(512, activation=\"relu\"),\n    keras.layers.Dense(256, activation=\"relu\"),\n    keras.layers.Dense(1)\n])\nmodel.compile(optimizer=\"adam\", loss=\"mse\", metrics=[\"mae\", keras.metrics.RootMeanSquaredError()])\nmodel.fit(X_train, Y_train, batch_size=512, epochs=20, verbose=1)\nmodel.evaluate(X_test, Y_test, verbose=1)\n```\n\n### Wrap it in a callable\n\n```python\ndef predict(x):\n    return model(x).numpy().squeeze()\n```\n\n### Explain it with global effect plots\n\n```python\n# Initialize the Partial Dependence Plot (PDP) object\npdp = effector.PDP(\n    X_test,  # Use the test set as background data\n    predict,  # Prediction function\n    feature_names=bike_sharing.feature_names,  # (optional) Feature names\n    target_name=bike_sharing.target_name  # (optional) Target variable name\n)\n\n# Plot the effect of a feature\npdp.plot(\n    feature=3,  # Select the 3rd feature (feature: hour)\n    nof_ice=200,  # (optional) Number of Individual Conditional Expectation (ICE) curves to plot\n    scale_x={\"mean\": bike_sharing.x_test_mu[3], \"std\": bike_sharing.x_test_std[3]},  # (optional) Scale x-axis\n    scale_y={\"mean\": bike_sharing.y_test_mu, \"std\": bike_sharing.y_test_std},  # (optional) Scale y-axis\n    centering=True,  # (optional) Center PDP and ICE curves\n    show_avg_output=True,  # (optional) Display the average prediction\n    y_limits=[-200, 1000]  # (optional) Set y-axis limits\n)\n```\n\n![Feature effect plot](https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_3_0.png)\n\n### Explain it with regional effect plots\n\n```python\n# Initialize the Regional Partial Dependence Plot (RegionalPDP)\nr_pdp = effector.RegionalPDP(\n    X_test,  # Test set data\n    predict,  # Prediction function\n    feature_names=bike_sharing.feature_names,  # Feature names\n    target_name=bike_sharing.target_name  # Target variable name\n)\n\n# Summarize the subregions of the 3rd feature (temperature)\nr_pdp.summary(\n    features=3,  # Select the 3rd feature for the summary\n    scale_x_list=[  # scale each feature with mean and std\n        {\"mean\": bike_sharing.x_test_mu[i], \"std\": bike_sharing.x_test_std[i]}\n        for i in range(X_test.shape[1])\n    ]\n)\n```\n\n```\nFeature 3 - Full partition tree:\n\ud83c\udf33 Full Tree Structure:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nhr \ud83d\udd39 [id: 0 | heter: 0.43 | inst: 3476 | w: 1.00]\n    workingday = 0.00 \ud83d\udd39 [id: 1 | heter: 0.36 | inst: 1129 | w: 0.32]\n        temp \u2264 6.50 \ud83d\udd39 [id: 3 | heter: 0.17 | inst: 568 | w: 0.16]\n        temp > 6.50 \ud83d\udd39 [id: 4 | heter: 0.21 | inst: 561 | w: 0.16]\n    workingday \u2260 0.00 \ud83d\udd39 [id: 2 | heter: 0.28 | inst: 2347 | w: 0.68]\n        temp \u2264 6.50 \ud83d\udd39 [id: 5 | heter: 0.19 | inst: 953 | w: 0.27]\n        temp > 6.50 \ud83d\udd39 [id: 6 | heter: 0.20 | inst: 1394 | w: 0.40]\n--------------------------------------------------\nFeature 3 - Statistics per tree level:\n\ud83c\udf33 Tree Summary:\n\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\nLevel 0\ud83d\udd39heter: 0.43\n    Level 1\ud83d\udd39heter: 0.31 | \ud83d\udd3b0.12 (28.15%)\n        Level 2\ud83d\udd39heter: 0.19 | \ud83d\udd3b0.11 (37.10%)\n```\n\nThe summary of feature `hr` (hour) says that its effect on the output is highly dependent on the value of features:\n- `workingday`, wheteher it is a workingday or not\n- `temp`, what is the temperature the specific hour\n\nLet's see how the effect changes on these subregions!\n\n---\n#### Is it workingday or not?\n\n```python\n# Plot regional effects after the first-level split (workingday vs non-workingday)\nfor node_idx in [1, 2]:  # Iterate over the nodes of the first-level split\n    r_pdp.plot(\n        feature=3,  # Feature 3 (temperature)\n        node_idx=node_idx,  # Node index (1: workingday, 2: non-workingday)\n        nof_ice=200,  # Number of ICE curves\n        scale_x_list=[  # Scale features by mean and std\n            {\"mean\": bike_sharing.x_test_mu[i], \"std\": bike_sharing.x_test_std[i]}\n            for i in range(X_test.shape[1])\n        ],\n        scale_y={\"mean\": bike_sharing.y_test_mu, \"std\": bike_sharing.y_test_std},  # Scale the target\n        y_limits=[-200, 1000]  # Set y-axis limits\n    )\n```\n\n<table>\n  <tr>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_5_0.png\" alt=\"Feature effect plot\"></td>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_5_1.png\" alt=\"Feature effect plot\"></td>\n  </tr>\n</table>\n\n\n#### Is it hot or cold?\n\n```python\n# Plot regional effects after second-level splits (workingday vs non-workingday and hot vs cold temperature)\nfor node_idx in [3, 4, 5, 6]:  # Iterate over the nodes of the second-level splits\n    r_pdp.plot(\n        feature=3,  # Feature 3 (temperature)\n        node_idx=node_idx,  # Node index (hot/cold temperature and workingday/non-workingday)\n        nof_ice=200,  # Number of ICE curves\n        scale_x_list=[  # Scale features by mean and std\n            {\"mean\": bike_sharing.x_test_mu[i], \"std\": bike_sharing.x_test_std[i]}\n            for i in range(X_test.shape[1])\n        ],\n        scale_y={\"mean\": bike_sharing.y_test_mu, \"std\": bike_sharing.y_test_std},  # Scale target\n        y_limits=[-200, 1000]  # Set y-axis limits\n    )\n\n```\n\n<table>\n  <tr>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_0.png\" alt=\"Feature effect plot\"></td>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_1.png\" alt=\"Feature effect plot\"></td>\n  </tr>\n  <tr>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_2.png\" alt=\"Feature effect plot\"></td>\n    <td><img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/notebooks/quickstart/readme_example_files/readme_example_6_3.png\" alt=\"Feature effect plot\"></td>\n  </tr>\n</table>\n\n---\n\n## Supported Methods\n\n`effector` implements global and regional effect methods:\n\n| Method  | Global Effect  | Regional Effect | Reference | ML model          | Speed                                        |\n|---------|----------------|-----------------|-----------|-------------------|----------------------------------------------|\n| PDP     | `PDP`          | `RegionalPDP`   | [PDP](https://projecteuclid.org/euclid.aos/1013203451) | any               | Fast for a small dataset                     |\n| d-PDP   | `DerPDP`       | `RegionalDerPDP`| [d-PDP](https://arxiv.org/abs/1309.6392) | differentiable    | Fast for a small dataset      |\n| ALE     | `ALE`          | `RegionalALE`   | [ALE](https://academic.oup.com/jrsssb/article/82/4/1059/7056085) | any | Fast                                         |\n| RHALE   | `RHALE`        | `RegionalRHALE` | [RHALE](https://ebooks.iospress.nl/doi/10.3233/FAIA230354) | differentiable    | Very fast                                    |\n| SHAP-DP | `ShapDP`       | `RegionalShapDP`| [SHAP](https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions) | any | Fast for a small dataset and a light ML model |\n\n---\n\n## Method Selection Guide\n\nFrom the runtime persepective there are three criterias:\n\n- is the dataset `small` (N<10K) or `large` (N>10K instances) ? \n- is the ML model `light` (runtime < 0.1s) or `heavy` (runtime > 0.1s) ?\n- is the ML model `differentiable` or `non-differentiable` ?\n\nTrust us and follow this guide:\n\n- `light` + `small` + `differentiable` = `any([PDP, RHALE, ShapDP, ALE, DerPDP])` \n- `light` + `small` + `non-differentiable`: `[PDP, ALE, ShapDP]`\n- `heavy` + `small` + `differentiable` = `any([PDP, RHALE, ALE, DerPDP])`\n- `heavy` + `small` + `non differentiable` = `any([PDP, ALE])`\n- `big` +  `not differentiable` = `ALE`\n- `big` +  `differentiable` = `RHALE` \n\n---\n\n## Citation\n\nIf you use `effector`, please cite it:\n\n```bibtex\n@misc{gkolemis2024effector,\n  title={effector: A Python package for regional explanations},\n  author={Vasilis Gkolemis et al.},\n  year={2024},\n  eprint={2404.02629},\n  archivePrefix={arXiv},\n  primaryClass={cs.LG}\n}\n```\n\n---\n\n## Spotlight on `effector`\n\n### \ud83d\udcda Featured Publications  \n- **Gkolemis, Vasilis, et al.**  \n  *\"Fast and Accurate Regional Effect Plots for Automated Tabular Data Analysis.\"*  \n  [Proceedings of the VLDB Endowment](https://vldb.org/workshops/2024/proceedings/TaDA/TaDA.5.pdf) | ISSN 2150-8097  \n\n### \ud83c\udfa4 Talks & Presentations  \n- **LMU-IML Group Talk**  \n  [Slides & Materials](https://github.com/givasile/effector-paper/tree/main/presentation-general) | [LMU-IML Research](https://www.slds.stat.uni-muenchen.de/research/explainable-ai.html)  \n- **AIDAPT Plenary Meeting**  \n  [Deep dive into effector](https://github.com/givasile/presentation-aidapt-xai-effector/tree/main)  \n- **XAI World Conference 2024**  \n  [Poster](https://github.com/givasile/effector-paper/blob/main/poster-general/main.pdf) | [Paper](https://github.com/givasile/effector-paper/blob/main/xai-conference-submission/effector_xai_conf.pdf)  \n\n### \ud83c\udf0d Adoption & Collaborations  \n- **[AIDAPT Project](https://www.ai-dapt.eu/effector/)**  \n  Leveraging `effector` for explainable AI solutions.  \n\n### \ud83d\udd0d Additional Resources  \n\n- **Medium Post**  \n  [Effector: An eXplainability Library for Global and Regional Effects](https://medium.com/@ntipakos/effector-bfe17206672c)\n\n- **Courses & Lists**:  \n  [IML Course @ LMU](https://slds-lmu.github.io/iml/)  \n  [Awesome ML Interpretability](https://github.com/jphall663/awesome-machine-learning-interpretability)  \n  [Awesome XAI](https://github.com/wangyongjie-ntu/Awesome-explainable-AI)  \n  [Best of ML Python](https://github.com/ml-tooling/best-of-ml-python)  \n\n### \ud83d\udcda Related Publications\n\nPapers that have inspired `effector`:\n\n- **REPID: Regional Effects in Predictive Models**  \n  Herbinger et al., 2022 - [Link](https://proceedings.mlr.press/v151/herbinger22a)  \n\n- **Decomposing Global Feature Effects Based on Feature Interactions**  \n  Herbinger et al., 2023 - [Link](https://arxiv.org/pdf/2306.00541.pdf)  \n\n- **RHALE: Robust Heterogeneity-Aware Effects**  \n  Gkolemis Vasilis et al., 2023 - [Link](https://ebooks.iospress.nl/doi/10.3233/FAIA230354)  \n\n- **DALE: Decomposing Global Feature Effects**  \n  Gkolemis Vasilis et al., 2023 - [Link](https://proceedings.mlr.press/v189/gkolemis23a/gkolemis23a.pdf)  \n\n- **Greedy Function Approximation: A Gradient Boosting Machine**  \n  Friedman, 2001 - [Link](https://projecteuclid.org/euclid.aos/1013203451)  \n\n- **Visualizing Predictor Effects in Black-Box Models**  \n  Apley, 2016 - [Link](https://arxiv.org/abs/1612.08468)  \n\n- **SHAP: A Unified Approach to Model Interpretation**  \n  Lundberg & Lee, 2017 - [Link](https://papers.nips.cc/paper/7062-a-unified-approach-to-interpreting-model-predictions)  \n\n- **Regionally Additive Models: Explainable-by-design models minimizing feature interactions**  \n  Gkolemis Vasilis et al., 2023 - [Link](https://arxiv.org/abs/2309.12215)\n\n---\n\n## License\n\n`effector` is released under the [MIT License](https://github.com/givasile/effector/blob/main/LICENSE).\n\n\n\n---\n\n## Powered by:\n\n- **[AIDAPT](https://www.ai-dapt.eu/)**  \n  <img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/aidapt_logo.png\" width=\"130\"/>\n\n- **XMANAI**  \n<img src=\"https://raw.githubusercontent.com/givasile/effector/main/docs/docs/static/xmanai_logo.jpg\" width=\"70\"/>\n",
    "bugtrack_url": null,
    "license": null,
    "summary": "An eXplainable AI package for tabular data.",
    "version": "0.1.12",
    "project_urls": {
        "documentation": "https://xai-effector.github.io",
        "source": "https://github.com/givasile/effector",
        "tracker": "https://github.com/givasile/effector/issues"
    },
    "split_keywords": [
        "explainability",
        " interpretability",
        " machine learning",
        " deep learning",
        " regional xai",
        " feature effect"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "436cf52f8bf32757f9299f82234d244f2efa4f8628529e3f18c9a2fe05ee2302",
                "md5": "f650d4db5c4c0db13eb597e2520f063a",
                "sha256": "51108fa8e42d28cde7c07dbe5e854380eb400697d3cd1b6fc601a32cfb0d5605"
            },
            "downloads": -1,
            "filename": "effector-0.1.12-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "f650d4db5c4c0db13eb597e2520f063a",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.10",
            "size": 63626,
            "upload_time": "2025-07-12T21:11:12",
            "upload_time_iso_8601": "2025-07-12T21:11:12.836680Z",
            "url": "https://files.pythonhosted.org/packages/43/6c/f52f8bf32757f9299f82234d244f2efa4f8628529e3f18c9a2fe05ee2302/effector-0.1.12-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "6731e679519d4d003d5bc5684c370034e15857b9454934192a9f29b3c7c0b22c",
                "md5": "7fb0676733c05e857ec390c0f8a82b81",
                "sha256": "ecdc5810bcd1bb5825fbe1e68e24838fd763dfe3f697be9b5158549124148e0f"
            },
            "downloads": -1,
            "filename": "effector-0.1.12.tar.gz",
            "has_sig": false,
            "md5_digest": "7fb0676733c05e857ec390c0f8a82b81",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.10",
            "size": 55007,
            "upload_time": "2025-07-12T21:11:14",
            "upload_time_iso_8601": "2025-07-12T21:11:14.177372Z",
            "url": "https://files.pythonhosted.org/packages/67/31/e679519d4d003d5bc5684c370034e15857b9454934192a9f29b3c7c0b22c/effector-0.1.12.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-07-12 21:11:14",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "givasile",
    "github_project": "effector",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "effector"
}
        
Elapsed time: 1.29390s