Conformal Prediction
保形预测可将任意模型的分数转换为预测集合或区间,使其以指定的概率(例如 95%)包含真实答案。
保形预测是一种不确定性量化框架,可将任意训练模型的分数转换为预测集合或区间,并保证其以用户指定的比例(例如 95%)包含真实答案。保形图像分类器会返回所有仍有可能的标签:清晰图像对应一个标签,模糊图像则对应多个标签;保形回归器则会返回一个区间。只要校准数据与新数据具有可交换性,这种保证就适用于任何模型和任何数据分布;来自同一来源的独立样本就具有这种性质。Vladimir Vovk、Alexander Gammerman 和 Glenn Shafer 从 20 世纪 90 年代末开始发展这一方法,并在 2005 年出版的《随机世界中的算法学习》中加以阐述;Anastasios Angelopoulos 和 Stephen Bates 于 2021 年发表的教程《保形预测简明入门》介绍了机器学习中使用的现代方法。
拆分保形预测的工作原理#
原始的完整保形方法会针对每个候选答案重新拟合模型,这对于深度学习来说太慢了。由 Harris Papadopoulos 及其同事于 2002 年提出的拆分式(或归纳式)保形预测只需要一个训练好的模型和一个留出的校准集:
- 像往常一样,使用训练数据训练模型。
- 在模型未见过的 n 个带标签校准样例上运行模型,并为每个样例计算一个非一致性分数。这个数值越大,表示模型认为真实答案越不典型。对于分类器,一个常见的分数是 1 减去模型分配给真实类别的概率。
- 取这些分数的 ceil((n + 1) x (1 - alpha)) / n 分位数,称为 qhat。其中的 (n + 1) 项是一种有限样本修正,可使保证精确成立。
- 对于新的输入,将分数不超过 qhat 的所有候选标签都纳入集合。
由此得到的集合以至少 1 - alpha 的概率包含真实标签。由于新样例的分数与 n 个校准分数可交换,因此它在这些分数中的任意排名上出现的可能性相同,所以它至少有 1 - alpha 的概率落在 qhat 以内。
保证的适用范围#
这项保证是边际性的:它在所有输入上取平均后成立。模型可能对容易分类的类别覆盖过多,却对罕见类别覆盖不足,因此按类别条件(Mondrian)的保形预测会为每个类别单独校准一个 qhat。可交换性是唯一的假设;当发生数据漂移,即生产环境中的图像与校准图像不同时,这个假设就会失效。因此,校准集必须来自部署数据,并在数据变化时更新。校准集中的数据集偏差会直接反映在预测集合中。
集合大小是有用的信号。所有有效方法都能达到目标覆盖率,因此方法之间比拼的是集合有多小,而准确度更高的模型会得到更小的集合。自适应预测集(APS)和正则化自适应预测集(RAPS)——后者在ImageNet分类器上经过测试——使用累积概率,使集合大小能反映难度;保形化分位数回归则会在数据噪声较大的区域生成更宽的区间。
保形预测与三个相关概念有所不同。置信度分数是一个不附带任何保证的单一数值。温度缩放等校准方法能让分数更好地匹配观测到的准确率,从而缩小保形集合,但它们本身不保证覆盖率。统计置信区间描述的是总体参数(例如均值)的不确定性,而保形集合描述的是单个新结果可能落入的范围。
实践中的预测集合#
下面使用 scikit-learn 实现上述步骤,并刻意使用较小的训练集,让分类器产生一些错误:
import numpy as np
from sklearn.datasets import load_digits
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# Split handwritten digits into training, calibration, and test sets
X, y = load_digits(return_X_y=True)
X_train, X_rest, y_train, y_rest = train_test_split(X, y, train_size=100, random_state=0)
X_cal, X_test, y_cal, y_test = train_test_split(X_rest, y_rest, train_size=500, random_state=0)
model = LogisticRegression(max_iter=2000).fit(X_train, y_train)
# Nonconformity score: 1 minus the probability given to the true class
scores = 1 - model.predict_proba(X_cal)[np.arange(len(y_cal)), y_cal]
# Finite-sample corrected quantile for 95% coverage
alpha, n = 0.05, len(y_cal)
qhat = np.quantile(scores, np.ceil((n + 1) * (1 - alpha)) / n, method="higher")
# Prediction set: every class whose score is at most qhat
sets = 1 - model.predict_proba(X_test) <= qhat
coverage = sets[np.arange(len(y_test)), y_test].mean()
print(f"Top-1 accuracy: {model.score(X_test, y_test):.3f}")
print(f"Set coverage: {coverage:.3f}, average set size: {sets.sum(axis=1).mean():.2f}")单独看排名最高的预测时,正确率为 91.6%;在 1,197 张测试图像中,保形集合有 96.5% 包含真实数字,高于 95% 的目标覆盖率,平均每个集合包含 1.27 个标签。MAPIE 等库将这些步骤封装起来,支持分类、回归和时间序列任务。
应用场景#
- 医学图像分析:一组具有已知错误率的可能诊断结果,能在扫描结果含糊时提醒医疗保健临床医生;而只包含一个标签的集合则标示出模型能够可靠处理的病例。
- 大型语言模型 (LLMs):保形方法会校准应返回多少个采样答案,或应保留哪些主张,使输出以指定概率包含正确答案;这可与语义熵互为补充,作为防范幻觉的手段。
- 目标检测:围绕预测的边界框设置保形边界,可得到一个以指定概率包含真实框的区域,这有助于自动驾驶汽车在行人周围规划路线。
图像分类器提供的输入与 scikit-learn 示例相同。Ultralytics YOLO26分类模型会为 results[0].probs.data 中的每张图像返回完整的 softmax 向量,因此只要对留出的带标签图像集评分,就能得到 qhat;所有概率至少为 1 - qhat 的类别都会纳入预测集合。










