Skip to main content

PACE: Proposal Assembly for Counterfactual Explanations

Project description

PACE

Proposal Assembly for Counterfactual Explanations — a counterfactual explainer for tabular classifiers.

PACE generates counterfactual explanations — the smallest change to a data point that flips the model's prediction. It works with any binary classifier that exposes a predict_proba method, handles mixed numeric/categorical features natively, and supports actionability constraints.

Install

pip install pacex

Quick start

from sklearn.datasets import fetch_openml
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from pace import PACE, FeatureInfo
from pace.preprocessing import make_preprocessor, feature_info_from_preprocessor

# 1. Load the German credit dataset (1 000 rows, mixed features)
data = fetch_openml("credit-g", version=1, as_frame=True)
df = data.frame
y = (df["class"] == "good").astype(int)

num_cols = ["age", "duration", "credit_amount"]
cat_cols = ["checking_status", "credit_history", "purpose", "personal_status"]

X_train_df, X_test_df, y_train, y_test = train_test_split(
    df[num_cols + cat_cols], y, test_size=0.2, random_state=42
)

# 2. Preprocess
pre = make_preprocessor(num_cols, cat_cols)
X_tr_sc = pre.fit_transform(X_train_df)   # numpy array, model space
X_te_sc = pre.transform(X_test_df)
feature_info = feature_info_from_preprocessor(pre, num_cols, cat_cols)

# 3. Train your model (any sklearn-compatible classifier)
model = RandomForestClassifier(random_state=42).fit(X_tr_sc, y_train)

# 4. Fit PACE once per (dataset, model) pair
explainer = PACE(
    X_train=X_tr_sc,
    predict_proba=model.predict_proba,
    feature_info=feature_info,
    pre=pre,
    num_cols=num_cols,
    cat_cols=cat_cols,
)

# 5. Explain a single instance — with constraints and immutability
x_f = X_te_sc[0]
x_cf, report = explainer.explain(
    x_f,
    y_desired=1,                           # flip to "good credit"
    n_candidates=1200,                     # more candidates → better quality
    max_changed_features=2,               # change at most 2 features
    immutable=["age", "personal_status"], # these must not change
    constraints={
        "duration":      (None, 36),       # loan term ≤ 36 months
        "credit_amount": (0,    None),     # amount must stay non-negative
    },
)

print(report)
# {'status': 'ok', 'l0': 2, 'l2': 0.74, 'p_cf': 0.68, ...}

# 6. Decode back to human-readable values
print(explainer.decode(x_cf))
# {'age': 34.0, 'duration': 24.0, 'credit_amount': 2500.0, ...}

Constraints are specified in the original feature space (before scaling).

Purely numeric data

If your data has no categorical columns, skip feature_info:

explainer = PACE(X_train=X_tr_sc, predict_proba=model.predict_proba)
x_cf, report = explainer.explain(x_f, y_desired=1)

License

Apache 2.0

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pacex-0.1.2.tar.gz (18.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pacex-0.1.2-py3-none-any.whl (18.3 kB view details)

Uploaded Python 3

File details

Details for the file pacex-0.1.2.tar.gz.

File metadata

  • Download URL: pacex-0.1.2.tar.gz
  • Upload date:
  • Size: 18.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for pacex-0.1.2.tar.gz
Algorithm Hash digest
SHA256 0c517e947ccc15af18021566e85c03cf98198570e2f777c7d50cb035e2182ed1
MD5 279287f7e2a797af29bd4a7def17ded3
BLAKE2b-256 05a00aed95a27de84cb8231d3bfa6ad71306334e718ebbc0e835b57dd582cbaa

See more details on using hashes here.

File details

Details for the file pacex-0.1.2-py3-none-any.whl.

File metadata

  • Download URL: pacex-0.1.2-py3-none-any.whl
  • Upload date:
  • Size: 18.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.11.5

File hashes

Hashes for pacex-0.1.2-py3-none-any.whl
Algorithm Hash digest
SHA256 6d529c3b61a0c1f490f428645f6adec020ee0dc8435d9a56fcb8ac733e39548e
MD5 51af9f9d2dbfd65be6903bc5be33f776
BLAKE2b-256 8f90af70df7b9b924982d9ccd9eeac4d33a053201514550e4348beeb87acf66b

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page