Quick Start#

This guide provides quick examples to get you started with incerto’s main features.

Calibration#

Calibrate your model’s confidence scores to match empirical accuracy:

import torch
from incerto.calibration import TemperatureScaling, ece_score

# Assume you have a trained model and validation data
model = YourModel()
val_logits, val_labels = get_validation_data()

# Post-hoc calibration
calibrator = TemperatureScaling()
calibrator.fit(val_logits, val_labels)

# Get calibrated predictions
test_logits = model(test_data)
calibrated = calibrator.predict(test_logits)

# Evaluate calibration
ece_before = ece_score(test_logits, test_labels)
ece_after = ece_score(calibrated.logits, test_labels)
print(f"ECE before: {ece_before:.4f}, after: {ece_after:.4f}")

Out-of-Distribution Detection#

Detect when inputs are outside the training distribution:

from incerto.ood import Energy
from incerto.ood import auroc

# Initialize OOD detector
detector = Energy(model, temperature=1.0)

# Get scores (higher = more OOD)
id_scores = detector.score(in_distribution_data)
ood_scores = detector.score(out_of_distribution_data)

# Evaluate
auc = auroc(id_scores, ood_scores)
print(f"OOD Detection AUROC: {auc:.4f}")

Conformal Prediction#

Generate prediction sets with coverage guarantees:

from incerto.conformal import inductive_conformal

# Calibrate conformal predictor
alpha = 0.1  # Desired coverage: 1 - alpha = 90%
predictor = inductive_conformal(
    model,
    calibration_loader,
    alpha=alpha
)

# Get prediction sets
prediction_sets = predictor(test_data)

# Each set is guaranteed to contain the true label
# with probability >= 90%
for i, pred_set in enumerate(prediction_sets[:5]):
    print(f"Sample {i}: Classes {pred_set}")

Selective Prediction#

Abstain from uncertain predictions:

from incerto.sp import SoftmaxThreshold
from incerto.sp import selective_risk

# Create selective predictor
selector = SoftmaxThreshold(threshold=0.9)

# Make predictions with abstention
logits = model(test_data)
predictions, abstention = selector.predict(logits)

# Predictions is None where abstention is True
coverage = (~abstention).float().mean()
risk = selective_risk(predictions[~abstention], labels[~abstention])
print(f"Coverage: {coverage:.2%}, Risk: {risk:.4f}")

LLM Uncertainty#

Quantify uncertainty in language model outputs:

from incerto.llm import TokenEntropy, SelfConsistency

# Token-level uncertainty
logits = llm(input_ids)  # shape: (batch, seq_len, vocab)
token_entropy = TokenEntropy.compute(logits)

# Sampling-based uncertainty
responses = [
    llm.generate(prompt, do_sample=True, temperature=1.0)
    for _ in range(10)
]

sc_result = SelfConsistency.compute(responses)
print(f"Agreement rate: {sc_result['agreement_rate']:.2f}")
print(f"Unique answers: {sc_result['num_unique']}")

Bayesian Deep Learning#

Approximate Bayesian inference for epistemic uncertainty:

from incerto.bayesian import MCDropout

# Enable dropout during inference
mc_dropout = MCDropout(model, n_samples=10)

# Get uncertainty estimates
result = mc_dropout.predict(test_data)

mean_pred = result['mean']  # Average prediction
epistemic = result['epistemic']  # Model uncertainty
aleatoric = result['aleatoric']  # Data uncertainty

print(f"Total uncertainty: {epistemic + aleatoric}")

Active Learning#

Select informative samples for labeling:

from incerto.active import entropy_acquisition, UncertaintySampling

# Initialize active learning strategy
strategy = UncertaintySampling(
    model,
    acquisition_fn=entropy_acquisition
)

# Query most uncertain samples
unlabeled_pool = get_unlabeled_data()
query_indices = strategy.query(
    unlabeled_pool,
    n_samples=100
)

# Label and retrain with selected samples
labeled_samples = unlabeled_pool[query_indices]

Distribution Shift Detection#

Detect shifts between training and deployment data:

from incerto.shift import mmd_test, classifier_two_sample_test

# Maximum Mean Discrepancy test
mmd_result = mmd_test(train_features, deploy_features)
print(f"MMD test p-value: {mmd_result['p_value']:.4f}")

if mmd_result['p_value'] < 0.05:
    print("Significant distribution shift detected!")

# Classifier-based test
c2st_result = classifier_two_sample_test(
    train_features,
    deploy_features
)
print(f"C2ST accuracy: {c2st_result['accuracy']:.4f}")

Saving and Loading Models#

All calibrators, OOD detectors, and shift detectors support serialization:

from incerto.calibration import TemperatureScaling
from incerto.ood import Energy
from incerto.shift import MMDShiftDetector

# Calibrator example
calibrator = TemperatureScaling()
calibrator.fit(val_logits, val_labels)

# Save to file
calibrator.save('calibrator.pt')

# Load from file (need to create instance first)
new_calibrator = TemperatureScaling()
new_calibrator.load_state_dict(torch.load('calibrator.pt'))

# Or use state_dict directly
state = calibrator.state_dict()
torch.save(state, 'calibrator_state.pt')

# OOD detector example (model not saved, only detector state)
detector = Energy(model, temperature=2.0)
detector.save('detector_state.pt')

# When loading, provide the model again
loaded_detector = Energy(model)
loaded_detector.load_state_dict(torch.load('detector_state.pt'))

# Shift detector example
shift_detector = MMDShiftDetector(sigma=1.5)
shift_detector.fit(reference_loader)
shift_detector.save('shift_detector.pt')

# Load using class method
loaded_shift = MMDShiftDetector.load('shift_detector.pt')

Next Steps#

  • Explore detailed guides for each module

  • Check out the <no title> and other examples

  • Read the Calibration reference