proxyml
Python SDK for the ProxyML API.
Why ProxyML?
Most explainability tools require sending your data to a third-party server. ProxyML never sees your training data. You generate synthetic data locally, score it with your own model, and only the surrogate model and summary statistics are uploaded — your data stays yours.
Installation
pip install proxyml
Want to train a challenger model locally, with no round-trip to the API? Install the local extra (adds scikit-learn and scipy):
pip install 'proxyml[local]'
Setup
ProxyML requires an API key. Set it as an environment variable before importing the package:
export PROXYML_API_KEY="your-api-key"
Optionally override the base URL (defaults to https://api.proxyml.ai/api/v1):
export PROXYML_BASE_URL="https://api.proxyml.ai/api/v1"
Quick Start
import pandas as pd
import proxyml
from proxyml import get_schema
# 1. Load your dataset and generate a schema
df = pd.read_csv("data.csv")
schema = get_schema(df, immutable_cols=["age", "gender"])
# 2. Upload the schema under a name — synthesis and training reference it by name
SCHEMA_NAME = "my_schema"
proxyml.put_schema(schema, name=SCHEMA_NAME)
# 3. Generate synthetic training data
synth_df = proxyml.synthesize_data(num_points=500, schema_name=SCHEMA_NAME)
# 4. Score synthetic data with your black-box model
predictions = my_model.predict(synth_df.values.tolist())
# 5. Train a surrogate model
proxyml.train_surrogate(
samples=synth_df.values.tolist(),
predictions=predictions,
feature_names=list(synth_df.columns),
schema_name=SCHEMA_NAME,
)
# 6. Find a counterfactual explanation
sample = df.iloc[0].tolist()
cf = proxyml.find_counterfactual(sample=sample, target=1, version=None)
if cf is not None:
original = synth_df.iloc[0].to_dict()
cf_dict = cf.iloc[0].to_dict()
current_pred = my_model.predict([sample])[0]
cf_pred = my_model.predict([cf.values.tolist()[0]])[0]
explanation = proxyml.interpret_counterfactual(
sample=original,
counterfactual=cf_dict,
prediction_changed=(current_pred != cf_pred),
)
print(explanation)
See docs/quickstart.md for a full walkthrough and docs/api.md for complete API reference.
Core Concepts
Surrogate model — A fast, interpretable model trained to approximate your black-box model's behavior on synthetic data. Once trained, it can be queried directly via the ProxyML API.
Challenger model — Trained the same way as a surrogate, but locally (proxyml.local, no round-trip to the API) and against either real ground-truth labels (a genuine challenger to compare against a champion model) or a black box's predictions (a surrogate/explainer). Its export is structurally identical to a server-trained surrogate's, so the two can be compared and scored with the exact same arithmetic.
Counterfactual explanation — Given a prediction, a counterfactual is the minimal change to input features that would produce a different prediction. It answers: "What would have to be different for the outcome to change?"
Schema — Describes the statistical properties of each feature (type, range, distribution). Used to generate realistic synthetic data and constrain counterfactual search.
API Reference
| Function | Description |
|---|---|
get_schema(df, immutable_cols) |
Infer a FeatureSchema from a DataFrame |
put_schema(schema, name) |
Upload a schema to the API under a name |
synthesize_data(num_points, sample, as_df, schema_name) |
Generate synthetic data points |
train_surrogate(samples, predictions, feature_names, task, test_size, schema_name) |
Train a surrogate model |
train_auto_surrogate(data, target_col, ...) |
Load data + train a surrogate in one call, skipping synthesis |
export_surrogate(version) |
Export a surrogate for offline scoring via predict_from_export |
predict(sample, version) |
Score a single sample with the surrogate model |
find_counterfactual(sample, target, ...) |
Find a counterfactual for a given sample |
interpret_counterfactual(sample, counterfactual, ...) |
Generate a human-readable explanation |
proxyml.local.train_challenger(df, target, schema, ...) |
Train a challenger model locally — no API round-trip (pip install 'proxyml[local]') |
proxyml.local.train_auto_challenger(data, target_col, ...) |
Load data + train a local challenger in one call |
upload_challenger(payload, ci_token=None) |
Upload a challenger comparison headlessly, e.g. from CI (PROXYML_CI_TOKEN, not PROXYML_API_KEY) |
get_challenger_summary(ci_token=None) |
Fetch a CI-ready summary of the latest challenger comparison |
proxyml.ci.post_challenger_comment(...) |
Post/update a sticky PR comment with the challenger comparison |
Full documentation: docs/api.md
Examples
examples/basic_usage.py— Schema upload, data synthesis, surrogate trainingexamples/counterfactual_example.py— Counterfactual search and interpretationexamples/regression_example.py— Regression with immutable featuresexamples/multiclass_example.py— Multi-class classification with per-class feature importancesexamples/testing_example.py— Using a surrogate as a reference model in CIexamples/surrogate_export_example.py— Exporting a surrogate and reproducing its predictions locallyexamples/ci_challenger_example.py+examples/github_actions_challenger.yml— Training a challenger and posting the comparison as a PR comment from CI
License
Apache 2.0 — see LICENSE.
Metadata
Release files for proxyml 0.10.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| proxyml-0.10.0.tar.gz | 43.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| proxyml-0.10.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 72.7 kB
Release files / proxyml-0.10.0.tar.gz
| Download URL | proxyml-0.10.0.tar.gz |
|---|---|
| Size | 43.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
654e1c77054a6d74195a626a3aea9213cd76e9f14532376399e627c81d325283
|
|
BLAKE2b-256 checksum How to use checksums |
2d96fa0cc4419026d3abb73a41b34df15455df1830155bc64bcfe4cd10647d57
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|
Release files / proxyml-0.10.0-py3-none-any.whl
| Download URL | proxyml-0.10.0-py3-none-any.whl |
|---|---|
| Size | 29.5 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
0a74b1a8f07f977fd05e1a25b97fe2204deccd5391025f6d11f6e6609343a0f3
|
|
BLAKE2b-256 checksum How to use checksums |
7236cdd412fd61a269750d72cf81ed7881d3a03d07e4619a6a94fb19aa53688b
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.12.3
|