从模型输出

也许你已经训练了你的模型,并且你正在寻找从模型输出开始的校准不确定性估计。

如果是这种情况,你来对地方了。 在这种情况下, Fortuna 可以校准你的模型输出, 估计不确定性, 计算指标并获得保形预测集。 你的模型可能是用任何语言编写和训练的; Fortuna 只需要模型输出和目标变量以 numpy.ndarrayjax.numpy.ndarray 格式提供。

分类

让我们展示如何在校准模型输出、估计不确定性、计算指标和分类中的符合集。

构建校准分类器

首先,让我们构建一个校准分类器。 这定义了附加到模型输出的输出校准器, 以及用于校准和计算预测统计的最终概率输出层。 默认的输出校准器是温度缩放,这就是我们在这个例子中使用的。

from fortuna.output_calib_model import OutputCalibClassifier
output_calib_model = OutputCalibClassifier()

校准模型输出

让我们校准模型输出。 Fortuna 需要一些校准输入上计算的模型输出数组,以及相应的校准目标变量数组。 我们将这些分别表示为 calib_outputscalib_targets。 您可以使用 calibration configuration 对象来配置校准过程。 在这个例子中,我们将坚持使用默认的配置选项。

status = output_calib_model.calibrate(
    calib_outputs=calib_outputs,
    calib_targets=calib_targets
)

估计统计

给定一些测试模型输出 test_outputs, 以及可能的一组测试目标变量 test_targets, 我们准备估计预测统计量。 这些包括预测模式、均值、对数概率密度函数、方差、熵等; 请查阅 predictive 参考。

注意

在分类中,预测模式给出标签预测,即为某个输入预测的标签,而预测均值给出概率预测,即每个标签的概率。

References: log_prob(), mode(), mean()
test_logprob = output_calib_model.predictive.log_prob(
    outputs=test_outputs, targets=test_targets
)
test_modes = output_calib_model.predictive.mode(
    outputs=test_outputs
)
test_means = output_calib_model.predictive.mean(
    outputs=test_outputs
)

计算指标

Fortuna 支持一些分类指标, 例如准确率、预期校准误差和 Brier 分数。 我们鼓励您从其他框架引入指标并将其应用于 Fortuna 的预测, 因为后者与操作在 numpy.ndarray 上的指标兼容。

from fortuna.metric.classification import accuracy, expected_calibration_error
acc = accuracy(
    preds=test_modes,
    targets=test_targets
)
ece = expected_calibration_error(
    preds=test_modes,
    probs=test_means,
    targets=test_targets
)

计算共形集

最后, 就像在分类中一样, 从预测统计开始,你可以计算符合集。 同样,我们需要模型输出和数据来实现这一目的。 我们将val_outputs表示为验证模型输出, 并将val_targets表示为相应的验证目标变量。

References: conformal_set()
from fortuna.conformal import AdaptivePredictionConformalClassifier
val_means = calib_model.predictive.mean(
    outputs=val_outputs
)
conformal_sets = AdaptivePredictionConformalClassifier().conformal_set(
    val_probs=val_means,
    test_probs=test_means,
    val_targets=val_targets,
    error=0.05
)

回归

分类示例类似, 让我们展示如何在校准模型输出、估计不确定性、 计算指标并在回归中获得保形区间。

注意

在回归中, Fortuna 要求模型输出为高斯似然函数的均值和对数方差模型的连接。 数学上, 假设 \(\mu(\theta, x)\) 是均值模型, \(\sigma^2(\theta, x)\) 是方差模型, \(N\Big(y|\mu(\theta, x), \sigma^2(\theta, x)\Big)\) 是似然函数, 其中 \(\theta\) 是模型参数, \(x\) 是输入变量,\(y\) 是输出变量。 那么对于每个输入,模型输出应该是 \([\mu(\theta, x), \log\sigma^2(\theta, x)]\) 的连接。

构建一个校准回归器

首先,让我们构建一个校准回归器。 这定义了要附加到模型输出的输出校准器, 以及用于校准和计算预测统计的最终概率输出层。 默认的输出校准器是温度缩放,这就是我们在这个例子中使用的。

References: OutputCalibRegressor
from fortuna.calib_model import CalibRegression
output_calib_model = OutputCalibRegressor()

校准模型输出

让我们校准模型输出。 Fortuna 需要一些校准输入上计算的模型输出数组,以及相应的校准目标变量数组。 我们将这些分别表示为 calib_outputscalib_targets。 您可以使用 calibration configuration 对象来配置校准过程。 在这个例子中,我们将坚持使用默认的配置选项。

status = output_calib_model.calibrate(
    calib_outputs=calib_outputs,
    calib_targets=calib_targets
)

估计统计

给定一些测试模型输出 test_outputs, 以及可能的一组测试目标变量 test_targets, 我们准备估计预测统计量。 这些包括预测模式、均值、对数概率密度函数、方差、熵等; 请查阅 predictive 参考。

注意

与分类相比,在回归中,预测的均值和预测的众数都为目标变量提供预测,并不代表不确定性的度量。

test_logprob = output_calib_model.predictive.log_prob(
    outputs=test_outputs, targets=test_targets
)
test_means = output_calib_model.predictive.mean(
    outputs=test_outputs
)
test_cred_intervals = output_calib_model.predictive.credible_interval(
    outputs=test_outputs
)

计算指标

Fortuna 支持一些回归指标,例如均方根误差 (RMSE) 和预测区间覆盖概率 (PICP)。我们鼓励您从其他框架引入指标并将其应用于 Fortuna 的预测,因为后者与操作在 numpy.ndarray 上的指标兼容。

from fortuna.metric.regression import root_mean_squared_error, prediction_interval_coverage_probability
rmse = root_mean_squared_error(
    preds=test_modes,
    targets=test_targets
)
picp = prediction_interval_coverage_probability(
    lower_bounds=test_cred_intervals[:, 0],
    upper_bounds=test_cred_intervals[:, 1],
    targets=test_targets
)

计算保形区间

最后, 就像在从置信或可信区间得到的保形区间中一样, 从预测统计量出发,你可以计算保形区间。 同样,我们需要模型输出和数据来实现这一目的。 我们将val_outputs表示为验证模型输出, 并将val_targets表示为相应的验证目标变量。

from fortuna.conformal import QuantileConformalRegressor
val_cred_intervals = calib_model.predictive.credible_interval(
    outputs=val_outputs
)
conformal_intervals = QuantileConformalRegressor().conformal_intervals(
    val_lower_bounds=val_cred_intervals[:, 0],
    val_upper_bounds=valcalib_cred_intervals[:, 1],
    test_lower_bounds=test_cred_intervals[:, 0],
    test_upper_bounds=test_cred_intervals[:, 1],
    val_targets=val_targets
)