1. 题目
你已有一个点预测模型 f(x),但业务需要输出类似 [lower, upper] 的预测区间,并希望在置信水平 1 - alpha 下具有可解释的覆盖率。请设计 split conformal prediction 流程,说明训练集、校准集和测试点如何分工。
2. 约束与澄清
- 先讨论回归和绝对误差分数;分类集合、在线校准和条件覆盖率属于延伸。
- 训练模型后固定参数,校准集不能再用于拟合点预测器。
- 覆盖率是对一批可交换样本的边际保证,不承诺每个子群或每个单点都达到相同比例。
- 需要区分随机采样数据、时间序列和发生协变量漂移时的有效性。
3. 核心思路
将数据分为训练集和校准集。用训练集拟合点预测器,在校准集上计算非一致性分数 si = |yi - f(x_i)|。对目标覆盖率 1 - alpha,取校准分数的有限样本修正分位数 q;新样本 x 的区间为 [f(x) - q, f(x) + q]。
在交换性假设下,这个构造给出边际覆盖率保证:新标签落在区间内的概率至少接近 1 - alpha,有限样本版本需要按校准集大小选择保守的次序统计量。它不要求点预测器本身正确,但区间宽度会反映模型残差和数据噪声。
4. 参考实现
def fit_split_conformal(train, calibration, alpha):
model = fit_point_predictor(train.x, train.y)
scores = sorted(
abs(y - model.predict(x))
for x, y in zip(calibration.x, calibration.y)
)
# Use the finite-sample conformal quantile, not a naive percentile.
rank = ceil((len(scores) + 1) * (1 - alpha))
q = scores[min(rank, len(scores)) - 1]
def predict_interval(x):
center = model.predict(x)
return center - q, center + q
return predict_interval5. 正确性与评估
评估时必须在独立测试集上统计覆盖率与平均区间宽度,并按时间、地区或用户群检查差异。覆盖率低于目标可能来自非交换数据、校准集过小、分布漂移或实现错误;只报告平均覆盖率无法发现某个群体系统性失效。
区间宽度与分数定义有关:绝对残差给出对称区间,分位数回归或局部尺度分数可产生非对称或自适应区间。更窄的区间不自动代表更好,必须与覆盖率和业务损失一起比较。
6. 追问与陷阱
- “分布无关”不是“无条件任何分布都保证”;经典保证依赖校准样本与新样本满足交换性。
- 时间序列的顺序依赖会破坏朴素 split conformal,需使用滚动校准、加权方法或明确降低保证范围。
- 协变量漂移下可按密度比加权,但权重估计错误会影响覆盖率,不能继续宣称原始保证不变。
- 边际覆盖率不等于条件覆盖率;小群体或极端输入可能仍有很宽或很窄的区间。
7. 延伸阅读
可以比较 split、cross-conformal、在线 conformal 和加权 conformal:它们在数据复用、计算成本、适应漂移和理论保证之间取舍。生产系统还应监控覆盖率、区间宽度、残差漂移、校准集新鲜度和拒绝/人工复核比例。
8. 面试评分点
能正确拆分训练与校准
应说明点预测器只在训练集拟合,校准分数来自未参与拟合的样本,并使用有限样本分位数。
能解释覆盖率假设
应说清交换性、边际覆盖率与条件覆盖率的区别,不能把结果描述成每个样本的确定性保证。
能处理漂移与时间依赖
应提出滚动、加权或在线校准,并说明这些方法的额外假设和保证变化。
能平衡区间宽度
应同时报告覆盖率和宽度,按子群监控失效,并把统计指标与业务损失联系起来。