从模型输出¶
也许你已经训练了你的模型,并且你正在寻找从模型输出开始的校准不确定性估计。
如果是这种情况,你来对地方了。
在这种情况下,
Fortuna 可以校准你的模型输出,
估计不确定性,
计算指标并获得保形预测集。
你的模型可能是用任何语言编写和训练的;
Fortuna 只需要模型输出和目标变量以 numpy.ndarray 或 jax.numpy.ndarray 格式提供。
分类¶
让我们展示如何在校准模型输出、估计不确定性、计算指标和分类中的符合集。
构建校准分类器¶
首先,让我们构建一个校准分类器。 这定义了附加到模型输出的输出校准器, 以及用于校准和计算预测统计的最终概率输出层。 默认的输出校准器是温度缩放,这就是我们在这个例子中使用的。
OutputCalibClassifier¶from fortuna.output_calib_model import OutputCalibClassifier
output_calib_model = OutputCalibClassifier()
校准模型输出¶
让我们校准模型输出。
Fortuna 需要一些校准输入上计算的模型输出数组,以及相应的校准目标变量数组。
我们将这些分别表示为 calib_outputs 和 calib_targets。
您可以使用 calibration configuration 对象来配置校准过程。
在这个例子中,我们将坚持使用默认的配置选项。
status = output_calib_model.calibrate(
calib_outputs=calib_outputs,
calib_targets=calib_targets
)
估计统计¶
给定一些测试模型输出 test_outputs,
以及可能的一组测试目标变量 test_targets,
我们准备估计预测统计量。
这些包括预测模式、均值、对数概率密度函数、方差、熵等;
请查阅 predictive 参考。
注意
在分类中,预测模式给出标签预测,即为某个输入预测的标签,而预测均值给出概率预测,即每个标签的概率。
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 上的指标兼容。
accuracy(), expected_calibration_error()¶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表示为相应的验证目标变量。
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)]\) 的连接。
构建一个校准回归器¶
首先,让我们构建一个校准回归器。 这定义了要附加到模型输出的输出校准器, 以及用于校准和计算预测统计的最终概率输出层。 默认的输出校准器是温度缩放,这就是我们在这个例子中使用的。
OutputCalibRegressor¶from fortuna.calib_model import CalibRegression
output_calib_model = OutputCalibRegressor()
校准模型输出¶
让我们校准模型输出。
Fortuna 需要一些校准输入上计算的模型输出数组,以及相应的校准目标变量数组。
我们将这些分别表示为 calib_outputs 和 calib_targets。
您可以使用 calibration configuration 对象来配置校准过程。
在这个例子中,我们将坚持使用默认的配置选项。
status = output_calib_model.calibrate(
calib_outputs=calib_outputs,
calib_targets=calib_targets
)
估计统计¶
给定一些测试模型输出 test_outputs,
以及可能的一组测试目标变量 test_targets,
我们准备估计预测统计量。
这些包括预测模式、均值、对数概率密度函数、方差、熵等;
请查阅 predictive 参考。
注意
与分类相比,在回归中,预测的均值和预测的众数都为目标变量提供预测,并不代表不确定性的度量。
log_prob(), mean(), credible_interval()¶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表示为相应的验证目标变量。
conformal_interval()¶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
)