Skip to content

Conditional Conformal Selection

This example shows how to use conditionally calibrated conformal p-values with FDR-controlled selection via detector.select(...).

Setup

from oddball import Dataset, load
from pyod.models.iforest import IForest

from nonconform import ConformalDetector, Split
from nonconform.metrics import false_discovery_rate, statistical_power
from nonconform.scoring import ConditionalEmpirical

x_train, x_test, y_test = load(Dataset.SHUTTLE, setup=True, seed=1)

Conditional Calibration + Selection

detector = ConformalDetector(
    detector=IForest(),
    strategy=Split(n_calib=1_000),
    estimation=ConditionalEmpirical(
        method="simes",
        delta=0.1,
        tie_break="classical",
    ),
    seed=1,
)

detector.fit(x_train)
discoveries = detector.select(x_test, alpha=0.2)

# Access p-values from the same selection pass
p_values = detector.last_result.p_values
print(f"P-value range: [{p_values.min():.4f}, {p_values.max():.4f}]")
print(f"Empirical FDR: {false_discovery_rate(y=y_test, y_hat=discoveries):.3f}")
print(f"Empirical Power: {statistical_power(y=y_test, y_hat=discoveries):.3f}")

Method Variants

methods = ["mc", "simes", "dkwm", "asymptotic"]

for method in methods:
    detector = ConformalDetector(
        detector=IForest(),
        strategy=Split(n_calib=1_000),
        estimation=ConditionalEmpirical(
            method=method,
            delta=0.1,
            tie_break="classical",
        ),
        seed=1,
    )
    detector.fit(x_train)
    discoveries = detector.select(x_test, alpha=0.2)
    p_values = detector.last_result.p_values
    print(f"{method}: {discoveries.sum()} discoveries, min p={p_values.min():.4f}")