Skip to main content

PIT-CP conformal prediction with pivotal scores

Project description

🎯 PIT-CP

pitcp is a Python package for conformal prediction using probability integral transform (PIT) pivotal scores. Given any black-box nonconformity score, it fits a conditional density estimator on the score distribution and maps raw scores to PIT values, yielding valid marginal coverage at any user-specified level.


✨ Features

  • PIT Conformal Prediction: Maps base nonconformity scores through a learned conditional CDF, producing asymptotically exact conditional coverage.
  • Model-agnostic: Works with any callable nonconformity score s(x, y), including distance, residual, or likelihood-based scores.
  • Flexible Density Estimation: Supports normalizing flows and mixture density networks from the zuko library.
  • Marginal Coverage Guarantee: Provably valid conformal coverage at any target level via finite-sample calibration.
  • scikit-learn: Native BaseEstimator integration with a familiar fit / conformalize / predict API.

🚀 Installation

pip install pitcp

🔧 Usage

Example

import torch
import zuko
from pitcp import PITCP


def std(x):
    return torch.where((x > -0.9) & (x < 0.9), torch.cos(torch.pi * x / 2), 1.0)


def gen_data(n):
    x = torch.rand(n, 1) * 2 - 1
    return x, torch.randn(n, 1) * std(x)


torch.manual_seed(42)

(X_train, y_train), (X_cal, y_cal), (X_test, y_test) = [
    gen_data(5000) for _ in range(3)
]


# Define a nonconformity score
def score(x, y):
    return y.abs()


# Build a normalizing flow density estimator
model = zuko.flows.NSF(features=1, context=1, bins=4, hidden_features=(32, 32, 32))
optimizer = torch.optim.Adam(model.parameters(), lr=1e-2)

# Compute nonconformity scores
s_train = score(X_train, y_train)
s_cal = score(X_cal, y_cal)
s_test = score(X_test, y_test)

# Fit and conformalize
pitcp = PITCP(model, optimizer, n_epochs=10, batch_size=128)
pitcp.fit(X_train, s_train)
pitcp.conformalize(X_cal, s_cal)

# Predict conformal regions (max score thresholds) at multiple quantiles
limits = pitcp.predict(X_test, quantile=[0.7, 0.8, 0.9])

# Predict conformal coverage
covered = pitcp.predict_coverage(X_test, s_test, quantile=[0.7, 0.8, 0.9])
print(f"Empirical coverages: {covered.mean(axis=0)}")

📖 Learn More

For tutorials, API reference, visit the official site:
👉 pitcp's documentation


📊 Reproducing Results

To reproduce the experiments and figures presented in the paper, navigate to the scripts/ directory and run the corresponding Python scripts. Note that the scripts expect to be run from within the scripts/ directory to correctly access data and output paths.

cd scripts
python <script_name>.py

Script Descriptions

Script Description
convergence-plots.py Evaluates the convergence of the PIT-CP procedure across different training sample sizes using various density estimators (SOSPF, GMM).
kolmogorov-illustration.py Visualizes the Kolmogorov-Smirnov distance between conditional and marginal score distributions, illustrating the challenge PIT-CP addresses.
optimal-transport-illustration.py Illustrates the transformation of conditional score distributions into a uniform target via the Probability Integral Transform (PIT).
real-data-diagnostics.py Benchmarks PIT-CP against other conformal prediction methods (SCP, CQR, HPD, CONTRA) on real-world datasets, calculating coverage gaps and prediction interval volumes.
synthetic-plots.py Compares the conformal regions and conditional coverage of PIT-CP, CQR, and SCP on synthetic heteroscedastic data.

Figures and results will be saved in the figures/ directory.

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

pitcp-0.10.0.tar.gz (11.3 MB view details)

Uploaded Source

Built Distribution

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

pitcp-0.10.0-py3-none-any.whl (20.0 kB view details)

Uploaded Python 3

File details

Details for the file pitcp-0.10.0.tar.gz.

File metadata

  • Download URL: pitcp-0.10.0.tar.gz
  • Upload date:
  • Size: 11.3 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for pitcp-0.10.0.tar.gz
Algorithm Hash digest
SHA256 0a75b1d18508b4e2fc044eb4944b1ce85b993a83226aebd58f59c708455f279e
MD5 eceda1a94c3fca6134b6af2e001cc6d8
BLAKE2b-256 dc03ef5d74a694e0044b568d4580d33815937932e023410194e85fbdabcf865f

See more details on using hashes here.

File details

Details for the file pitcp-0.10.0-py3-none-any.whl.

File metadata

  • Download URL: pitcp-0.10.0-py3-none-any.whl
  • Upload date:
  • Size: 20.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.13

File hashes

Hashes for pitcp-0.10.0-py3-none-any.whl
Algorithm Hash digest
SHA256 1b8efd9705237186ccf0f5a47d1b5510e2551f9ef722b5879c37f8d14994015d
MD5 56df1a2c06e58bea5408bfc51d4f2a49
BLAKE2b-256 76d709689e5e9f2f7c88365acbad9436ddb8c7fcb44d1fe255333036f3dd4d32

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