从不确定性估计

Fortuna 提供了一些 保形预测方法。这些方法从不确定性估计和一些校准数据开始,构建保形预测集,即高于某个阈值的严格预测集。

注意

如果您提供的不确定性估计不准确,保形预测集可能会非常大且信息量不足。 如果可能,请考虑让Fortuna估计不确定性 - 参见From Flax models

分类

在分类中,conformal sets 是高于某个阈值的可能标签的集合。在下面的示例中,我们将展示如何使用 Fortuna 来构建它们。

分类示例:从概率预测中得到的置信区间

我们假设你已经训练了一个模型,并且对于每个输入,你都有一种方法来估计每个标签的概率。我们称这些在验证和测试数据集上计算出的概率为val_probstest_probs。我们进一步要求与验证概率相对应的验证目标变量数组val_targets。然后,以下代码为每个测试输入提供了一个95%的符合集。请参考AdaptivePredictionConformalClassifier

References: conformal_set()
from fortuna.conformal import AdaptivePredictionConformalClassifier
conformal_sets = AdaptivePredictionConformalClassifier().conformal_set(
    val_probs=val_probs,
    test_probs=test_probs,
    val_targets=val_targets,
    error=0.05
)

通常,您应该期望您的测试预测被包含在符合集中,因为它们根据您的验证数据和验证概率估计包含了最可能的标签。您还应该期望,总体上,对于分类良好的输入,集合会更小,而对于分类错误的输入,集合会更大,因为后者可能更加不确定。请注意,如果您估计的概率非常不具信息性或高度错误,符合集可能包括几乎所有标签,这表明模型中的高度不确定性。

回归

对于具有标量目标变量的回归任务,Fortuna 提供了构建保形区间的保形方法。你可以将这些视为置信区间或可信区间的校准版本。在以下示例中,我们将展示如何使用 Fortuna 来构建它们。

对于这两个例子,您通常应该期望您的测试预测包含在 保形区间内, 因为它们根据您的验证数据和验证区间包含了最可能的预测范围。 您还应该期望,总体而言,分类良好的输入范围较小,而分类错误的输入范围较大, 因为后者可能更加不确定。请注意,如果您的区间没有信息或错误, 保形区间可能会很大。

从置信区间或可信区间得到的保形区间

对于这个例子, 我们假设你已经训练了一个模型,并且有一种方法来估计每个预测的置信区间或可信区间。 我们称val_lower_boundsval_upper_boundstest_lower_boundstest_upper_bounds为这些区间在验证和测试数据集上计算的下限和上限。我们假设这些区间有一个由error给出的错误级别;例如,95%的区间有error=0.05。 我们进一步要求与验证区间对应的验证目标变量数组val_targets。 然后,以下代码为每个测试输入提供了一个错误级别为error的符合区间。 请参考QuantileConformalRegressor

from fortuna.conformal import QuantileConformalRegressor
conformal_intervals = QuantileConformalRegressor().conformal_interval(
    val_lower_bounds=val_lower_bounds,
    val_upper_bounds=val_upper_bounds,
    test_lower_bounds=test_lower_bounds,
    test_upper_bounds=test_upper_bounds,
    val_targets=val_targets,
    error=error
)

从置信度或标量不确定性估计得出的保形区间

对于这个例子, 我们假设你已经训练了一个模型,你有办法进行预测并估计预测不确定性的标量度量, 例如标准差。 我们称val_predsval_uncertaintiestest_predstest_uncertainties为在某些验证和测试数据集上计算的预测和不确定性。 我们进一步要求与验证预测相对应的验证目标变量数组val_targets。 然后,以下代码为每个测试输入提供了一个95%的保形区间。 请参阅OneDimensionalUncertaintyConformalRegressor作为参考。

from fortuna.conformal import OneDimensionalUncertaintyConformalRegressor
conformal_intervals = OneDimensionalUncertaintyConformalRegressor().conformal_interval(
    val_preds=val_preds,
    val_uncertainties=val_uncertainties,
    test_preds=test_preds,
    test_uncertainties=test_uncertainties,
    val_targets=val_targets
)