Skip to main content

conformalpy

codecov CI Docs PyPI - Version Python Version Shield: Buy me a coffee

A Python library for Conformal Prediction with a focus on operational deployment, visualization, and explainability.

Features

  • Classification: Binary and multiclass with ICP, CV+, and Mondrian methods
  • Regression: Split conformal, CQR, Normalized, and Jackknife+ methods
  • Runtime Alpha: Change confidence level at prediction time without recalibration
  • Operational Framework: Outcome categorization (SC/SI/TS0/TS1 for binary; SC/SI/MC/MU for multiclass), decision rules, cost-benefit analysis
  • Rich Visualization: Coverage analysis, prediction intervals, FCODs (Feature-Conditioned Outcome Distributions)
  • sklearn Compatible: Follows scikit-learn API conventions

Installation

pip install conformalpy

For development:

pip install conformalpy[dev]

Quick Start

Classification

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier

from conformalpy.classifier import ConformalClassifier
from conformalpy.nonconformity.classification import lac_nonconformity

# Load data and split
X, y = load_iris(return_X_y=True)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_calib, X_test, y_calib, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# Train your model
model = RandomForestClassifier(random_state=42)
model.fit(X_train, y_train)

# Create conformal classifier
conformal = ConformalClassifier(
    model=model,
    alpha=0.1,  # 90% coverage target
    nonconformity_function=lac_nonconformity
)

# Calibrate on held-out data
conformal.calibrate(X_calib, y_calib)

# Get prediction sets
prediction_sets = conformal.predict(X_test)
# Example output: [[0], [1, 2], [2], ...]

# Runtime alpha: get sets at different confidence levels without recalibration
sets_95 = conformal.predict(X_test, alpha=0.05)  # 95% coverage
sets_80 = conformal.predict(X_test, alpha=0.20)  # 80% coverage

Regression

from sklearn.datasets import fetch_california_housing
from sklearn.ensemble import GradientBoostingRegressor

from conformalpy.regressor import ConformalRegressor

# Load data
X, y = fetch_california_housing(return_X_y=True)
X_train, X_temp, y_train, y_temp = train_test_split(X, y, test_size=0.4, random_state=42)
X_calib, X_test, y_calib, y_test = train_test_split(X_temp, y_temp, test_size=0.5, random_state=42)

# Train model
model = GradientBoostingRegressor(random_state=42)
model.fit(X_train, y_train)

# Create conformal regressor
conformal = ConformalRegressor(model=model, alpha=0.1)
conformal.calibrate(X_calib, y_calib)

# Get prediction intervals
intervals = conformal.predict_interval(X_test)
# intervals.shape = (n_samples, 2) -> [lower, upper]

# Runtime alpha: multiple confidence levels at once
intervals_multi = conformal.predict_interval(X_test, alpha=[0.05, 0.10, 0.20])
# intervals_multi.shape = (n_samples, 2, 3)

Main Components

Classification

from conformalpy.classifier import ConformalClassifier
from conformalpy.nonconformity.classification import (
    lac_nonconformity,    # LAC (Least Ambiguous Classifier): smallest sets
    aps_nonconformity,    # APS (Adaptive Prediction Sets): no empty sets
    raps_nonconformity,   # RAPS (Regularized APS): balanced
    saps_nonconformity,   # SAPS (Sorted Adaptive Prediction Sets): sorted variant
    hinge_nonconformity,  # Hinge: margin-based scores
)

# Standard ICP
icp = ConformalClassifier(model, alpha=0.1, nonconformity_function=lac_nonconformity)

# Mondrian (class-conditional coverage)
mondrian = ConformalClassifier(model, alpha=0.1, nonconformity_function=lac_nonconformity, mondrian=True)

# Flexible Mondrian (arbitrary groups)
conformal.calibrate(X_calib, y_calib, groups=group_labels)
conformal.predict(X_test, groups=test_groups)

# CV+ (cross-validation based)
from conformalpy.classifier import CVPlusClassifier
cv_plus = CVPlusClassifier(model, alpha=0.1, n_splits=5)
cv_plus.fit(X_train, y_train)  # No separate calibration needed

Regression

from conformalpy.regressor import ConformalRegressor, CQR, NormalizedConformalRegressor

# Split conformal (symmetric intervals)
split = ConformalRegressor(model, alpha=0.1)

# CQR (adaptive intervals via quantile regression)
cqr = CQR(model_lower=quantile_lower, model_upper=quantile_upper, alpha=0.1)

# Normalized (scaled by predicted uncertainty)
normalized = NormalizedConformalRegressor(model, sigma_model, alpha=0.1)

Evaluation

from conformalpy.evaluation import (
    coverage_score,
    average_set_size,
    class_conditional_coverage,
    interval_coverage_score,
    average_interval_width,
    winkler_score,
)

# Classification metrics
coverage = coverage_score(prediction_sets, y_test)
avg_size = average_set_size(prediction_sets)
class_cov = class_conditional_coverage(prediction_sets, y_test)

# Regression metrics
cov = interval_coverage_score(y_test, intervals)
width = average_interval_width(intervals)
winkler = winkler_score(y_test, intervals, alpha=0.1)

Operational Framework

from conformalpy.outcomes import categorize_outcomes, outcome_summary
from conformalpy.framework import classify_zones, compute_expected_cost

# Binary: SC (correct), SI (incorrect), TS0/TS1 (two-set)
# Multiclass: SC (correct), SI (incorrect), MC (multi-covered), MU (multi-uncovered)
outcomes = categorize_outcomes(prediction_sets, y_test)

# Operational zones: Safe, Uncertain, Problematic
zones = classify_zones(prediction_sets, y_test)

# Cost-benefit analysis
from conformalpy.framework import CostMatrix
costs = CostMatrix(false_negative_cost=1000, false_positive_cost=100, manual_review_cost=50)
y_pred = model.predict(X_test)
cost_report = compute_expected_cost(prediction_sets, y_pred, y_test, costs)  # dict with cost breakdown

Score Function Comparison

Method Empty Sets Set Size Best For
LAC Possible Smallest When empty sets are acceptable
APS Never Larger When adaptiveness is important
RAPS Never Small General use (recommended)
SAPS Never Small Sorted variant of APS
Hinge Possible Smallest Margin-based scoring

Additional Features

Time Series

Adaptive Conformal Inference (ACI) for sequential data under distribution shift.

from conformalpy.timeseries import AdaptiveConformalRegressor

aci = AdaptiveConformalRegressor(model=model, target_coverage=0.9, gamma=0.01)

Risk Control

Conformal Risk Control (CRC), RCPS, and Learn-then-Test (LTT) for multi-label and custom loss functions.

from conformalpy.risk_control import ConformalRiskController

FCODs (Feature-Conditioned Outcome Distributions)

Visualize how prediction outcomes (SC, SI, MC, MU, etc.) vary as a function of input features — an original contribution of conformalpy.

from conformalpy.fcod import compute_fcod, plot_fcod

Multi-Output Regression

Marginal, Bonferroni-corrected, and max-residual strategies for multi-target regression.

from conformalpy.regressor import MultiOutputConformalRegressor

Jackknife+

Leave-one-out conformal regressor with finite-sample coverage guarantees.

from conformalpy.regressor import JackknifePlusRegressor

Conformal Predictive Distributions

Full predictive distributions (CDFs) via conformal prediction.

from conformalpy.regressor import ConformalPredictiveDistribution

Deep Learning Integration

Adapters for PyTorch and TensorFlow models.

from conformalpy.deep_learning import TorchClassifierWrapper

Diagnostics

Exchangeability testing via martingales and plugin methods.

from conformalpy.diagnostics import ExchangeabilityTest

Also available and documented on the docs site: weighted / clustered / group-balanced classifiers, fairness metrics, SHAP dependence plots, model persistence, MLflow integration, and optional GPU backends.

Citation

The conformalpy library paper is in preparation. If you use the FCOD or p-value-margin SHAP functionality, please cite:

@inproceedings{caparrini2026explaining,
  author    = {Antonio Caparrini and Miller-Janny Ariza-Garz{\'o}n and Javier Arroyo},
  title     = {Explaining Conformal Prediction: Diagnosing Reliability through Feature-Conditioned Outcomes and p-Value Margins},
  booktitle = {Proceedings of the Fifteenth Symposium on Conformal and Probabilistic Prediction with Applications},
  series    = {Proceedings of Machine Learning Research},
  volume    = {329},
  year      = {2026},
  publisher = {PMLR},
  note      = {Conditionally accepted}
}

Benchmarks

conformalpy achieves equivalent coverage to established libraries while being faster:

Library Avg Time (Classification) Coverage
conformalpy 0.04s Valid
Crepes 0.11s Valid

See benchmarks/ for full comparison.

Documentation

Full documentation: caparrini.github.io/conformalpy

To build and preview the documentation locally:

# Install documentation dependencies
uv sync --extra dev --extra docs --extra explainability

# Build the documentation
cd docs && uv run quarto render

# Preview the documentation (in another terminal)
cd docs && uv run quarto preview

The documentation uses Quarto with quartodoc for API reference generation. See docs/_quarto.yml for the full configuration.

References

Conformal Prediction:

  • Vovk, V., Gammerman, A., & Shafer, G. (2005). Algorithmic Learning in a Random World. Springer.
  • Angelopoulos, A. N., & Bates, S. (2023). Conformal Prediction: A Gentle Introduction. Foundations and Trends in ML.

FCOD and SHAP Margins:

  • Caparrini, A., Ariza-Garzón, M.-J., & Arroyo, J. (2026). Explaining Conformal Prediction: Diagnosing Reliability through Feature-Conditioned Outcomes and p-Value Margins. COPA, PMLR 329. (Conditionally accepted)

Score Functions:

  • Sadinle, M., Lei, J., & Wasserman, L. (2019). Least Ambiguous Set-Valued Classifiers With Bounded Error Levels. JASA. (LAC)
  • Romano, Y., Sesia, M., & Candès, E. J. (2020). Classification with Valid and Adaptive Coverage. NeurIPS. (APS)
  • Angelopoulos, A. N., et al. (2021). Uncertainty Sets for Image Classifiers using Conformal Prediction. ICLR. (RAPS)
  • Huang, J., et al. (2024). Conformal Prediction for Deep Classifier via Label Ranking. ICML. (SAPS)
  • Romano, Y., Patterson, E., & Candès, E. J. (2019). Conformalized Quantile Regression. NeurIPS. (CQR)

Additional Methods:

  • Gibbs, I. & Candès, E. (2021). Adaptive Conformal Inference Under Distribution Shift. NeurIPS. (ACI)
  • Barber, R. F., et al. (2021). Predictive Inference with the Jackknife+. Annals of Statistics.
  • Bates, S., et al. (2021). Distribution-Free, Risk-Controlling Prediction Sets. Journal of the ACM.

Contributing

Contributions are welcome! See CONTRIBUTING.md for the full workflow.

# Clone the repository
git clone https://github.com/Caparrini/conformalpy.git
cd conformalpy

# Install with uv
uv sync --extra dev --extra docs --extra explainability

# Run tests
uv run pytest tests/

# Build API reference from Python docstrings
cd docs && uv run quartodoc build

# Render docs website
cd docs && uv run quarto render

# Preview docs (in another terminal)
cd docs && uv run quarto preview

License

This project is licensed under the MIT License.

See CHANGELOG.md for release history.

Download files

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

Source Distribution

conformalpy-1.0.0.tar.gz (195.0 kB view details)

Uploaded Source

Built Distribution

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

conformalpy-1.0.0-py3-none-any.whl (225.4 kB view details)

Uploaded Python 3

File details

Details for the file conformalpy-1.0.0.tar.gz.

File metadata

  • Download URL: conformalpy-1.0.0.tar.gz
  • Upload date:
  • Size: 195.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for conformalpy-1.0.0.tar.gz
Algorithm Hash digest
SHA256 3f5ea4c6e77516a6be2714838a1683b14f8611a7c7e8a97072b3ebe4d4382c28
MD5 9506d07866970547ed3c1b0813ae74a5
BLAKE2b-256 439f79fe17300825bf7040f363517dc58e4483b6f2c9b123395e9bf0b2c03a4a

See more details on using hashes here.

File details

Details for the file conformalpy-1.0.0-py3-none-any.whl.

File metadata

  • Download URL: conformalpy-1.0.0-py3-none-any.whl
  • Upload date:
  • Size: 225.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for conformalpy-1.0.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2d31ea8bb5efd6a33d953b84a8e0e3c4b00b42ef7ea6407820560ef317ce6c78
MD5 8d50405261464e009147feba97e77b92
BLAKE2b-256 b96e5d95b9a7316843a837c644fb6237f79b2ac8a767ddd0752d4465c92ab828

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 Sentry Error logging StatusPage Status page