资讯动态

多评估者概率校准:先聚合后校准(Aggregate-then-Calibrate)方法解析

发布时间:2026/8/27 3:53:31 来源:尧图企业网站定制
在真实业务里最终决策往往不是由单个算法模型独立完成的而是多个评估者协同判断医生、资深专家、自动化模型可能会同时给出各自的概率分数。这时候最常见的处理方式是取平均但平均后的分数真的能当概率用吗不少实际项目中经常出现类似情况系统对高风险用户报出 85% 的风险概率复核时真实风险发生率却只有 60% 左右差距大到让人不敢信任这个分数。这类问题在“以人为本的评估”场景里尤其致命因为最终做决策的仍然是人而人依赖的正是系统提供的置信度。本文要拆解的就是一种解决该问题的组合思路Aggregate-then-Calibrate先聚合再校准。它把多个评估者的预测先聚合成一个分数然后用独立的校准集把这个分数映射成“真实可信的概率”。文章会从背景概念讲起给出方法原理、理论直觉、完整模拟实验以及落地部署时的注意事项。适合正在做 AI 辅助决策、众包标注、专家评分系统或者对人机协同置信度感兴趣的读者。1. 为什么需要“以人为本的评估”与校准1.1 什么是 Human-centered AssessmentHuman-centered Assessment 可以简单理解为以人类判断为核心同时借助机器预测来辅助完成评估任务的一套流程。这里的“评估”范围很广例如医疗影像分诊时医生是否采纳 AI 的疑似病变评分、教育系统中助教对作文质量的打分、金融机构对贷款申请人的风险审核、客服中心对投诉工单的紧急程度判定等。这类场景有几个共同特点决策主体是人机器只能提供参考。评估结果直接影响人的利益比如治疗方案、贷款审批、学生成绩。多个评估者通常同时存在比如两位专家加一个模型。最终决策需要的不只是“分类结果”而是“这个结论有多可靠”。所以 Human-centered Assessment 关注的不只是模型的 AUC 有多高还包括输出的概率分数是否真实、稳定、可解释以及对不同人群是否公平。1.2 评估中的置信度为什么重要通常我们训练一个分类器会得到一个 0 到 1 之间的分数。这个分数有两个作用一是排序二是表达概率。排序能力用 AUC 等指标衡量概率可靠性用校准误差Calibration Error衡量。很多模型排序能力不错但概率输出并不可靠。例如一个模型对所有样本的预测分数都偏高那么排序可能仍然正确但“85% 风险”这个数字本身没有意义。在以人为本的评估中这个区别会被放大医生看到 AI 报出“该结节恶性概率 90%”时会倾向于建议进一步穿刺检查。如果真实恶性率其实只有 60%就会造成大量不必要的检查。反过来如果模型低估风险问题更严重。因此在多评估者协同场景中我们需要一个可靠的聚合概率而不是一个只能排序的分数。这正是校准要解决的问题。1.3 校准问题预测不等于概率校准Calibration的学术定义是对于所有预测分数为 (p) 的样本真实正例比例也约等于 (p)。用条件概率写法就是[ \mathbb{E}[Y \mid f(X) p] \approx p ]举个例子如果模型对 100 个样本都给出了 0.8 的预测分数那么这 100 个样本中大约应有 80 个真实正例。如果实际只有 60 个就说明模型过度自信如果实际有 90 个则说明模型过于保守。衡量校准误差的常用指标是 ECEExpected Calibration Error可以按分数分箱后近似计算[ \widehat{ECE} \sum_{m1}^{M} \frac{|B_m|}{n} \left| \frac{1}{|B_m|}\sum_{i \in B_m} f_i - \frac{1}{|B_m|}\sum_{i \in B_m} y_i \right| ]这个公式的含义是把预测分数分成 (M) 个区间在每段里比较“平均预测概率”和“实际正例频率”的差异再按区间样本占比加权求和。ECE 越低说明分数越可靠。2. 方法总览Aggregate-then-Calibrate2.1 两个核心步骤Aggregate-then-Calibrate 把多评估者预测的处理过程拆成两步第一步是聚合Aggregate。把 (K) 个评估者对同一个样本的预测分数合并成一个分数[ \bar{f}(x) A(f_1(x), f_2(x), \cdots, f_K(x)) ]最简单的 (A) 就是取平均值。第二步是校准Calibrate。在独立的校准集上用保序回归、Platt 缩放等方法把 (\bar{f}(x)) 映射成最终概率[ g(x) C(\bar{f}(x)) ]这个方法的核心观点是校准不应该提前分散在每个评估者上做而应该放在聚合完成之后统一做。先聚合相当于先降噪后校准相当于只拟合一个全局映射整体流程更干净。2.2 与 Calibrate-then-Aggregate 的对比为了理解为什么“先聚合后校准”更合理可以对比另一种做法先对每个评估者单独做校准再把校准后的分数平均即 Calibrate-then-Aggregate。[ g(x) \frac{1}{K}\sum_{k1}^{K} C_k(f_k(x)) ]两种流程看起来差别不大但在数学性质上很不一样先校准后聚合时每个评估者的校准都会引入独立误差误差再平均后不一定互相抵消。如果所有评估者都有系统性的偏差方向误差甚至会叠加。先聚合后校准只需要拟合一个校准函数误差来源只有一个整体误差的上界更紧。2.3 方法整体设计思路Aggregate-then-Calibrate 的整体设计思路可以概括为“先降噪再纠偏”。多个评估者通常各有噪声有的偏向高风险有的偏向低风险简单平均可以抵消一部分随机噪声但对系统性偏差无能为力。聚合完成之后校准阶段负责把这种偏差扳回到正确水平。这样分工非常清晰聚合阶段解决“谁的判断更可信、如何融合”的问题。校准阶段解决“最终概率是否真实”的问题。两个阶段解耦便于单独优化和调试。3. 聚合阶段如何把多个评估者的输出聚成一个预测3.1 最简单的基线均值聚合均值聚合是对每个样本把所有评估者的预测分数直接取平均[ \bar{f}(x) \frac{1}{K}\sum_{k1}^{K} f_k(x) ]这是最常见的基线方法。优点是不需要额外参数训练成本为零。缺点是它默认每个评估者的能力相同对于偏差较大的评估者没有加权区分。在实际项目中均值聚合往往已经是效果不错的起点可以作为后续复杂方法的对比基线。3.2 群体感知的加权聚合更实际的做法是加权聚合给更准的评估者更高的权重。例如可以在一段历史数据上计算每个评估者的 Brier Score 或 ECE然后把指标转化为权重[ w_k \frac{1/\text{err}k}{\sum{j1}^K 1/\text{err}_j} ]其中 (\text{err}_k) 可以是 Brier Score 或 ECE。注意权重需要用独立的验证集来计算不能直接用在训练集上评估否则会过拟合。3.3 对数几率平均与不确定度聚合另一个常用聚合方式是对数几率logit平均。先把每个概率分数转成对数几率取平均后再转回概率[ \bar{f}(x) \sigma\left( \frac{1}{K}\sum_{k1}^K \text{logit}(f_k(x)) \right) ]其中[ \text{logit}(p) \ln\frac{p}{1-p} ]采用对数几率平均的原因是概率分数被压缩在 0 到 1 之间直接取平均在某些极端值场景下会失真。而对数几率近似于线性空间更符合“多源证据相加”的直觉。此外如果评估者的历史准确率不稳定可以考虑同时聚合方差信息用不确定度对预测进行衰减。不过这会增加实现复杂度需要根据业务场景评估是否值得。4. 校准阶段把聚合分数映射成可靠概率4.1 保序回归最常用的非参方法保序回归Isotonic Regression是校准中最常用的方法之一。它假设“校准后概率与原分数之间保持单调关系”然后在校准集上拟合一组单调递增的常数段。在 scikit-learn 中使用方式如下from sklearn.isotonic import IsotonicRegression iso_model IsotonicRegression(out_of_boundsclip) iso_model.fit(cal_scores, cal_labels) calibrated_scores iso_model.predict(test_scores)out_of_boundsclip表示当预测分数超出校准集范围时用边界值截断避免出现超出 0 到 1 的结果。保序回归的优势是灵活不需要假设特定函数形式缺点是当校准集较小时容易过拟合。因此校准集样本量不能太少一般建议至少几百条。4.2 Platt Scaling参数化校准Platt Scaling 用逻辑回归把分数映射成概率[ g(x) \sigma(a \cdot f(x) b) ]其中 (a) 和 (b) 是待拟合参数。这个方法的优点是参数少、不易过拟合适合校准集较小的场景缺点是它在分数与真实概率之间假设了单调的逻辑函数关系当映射关系比较复杂时表达能力不如保序回归。4.3 分组校准与群组公平聚合和校准只解决整体概率可靠性还不够很多时候还需要保证每个子群体内部同样可靠。例如同一个模型对高龄用户和低龄用户的风险概率可能都有偏整体 ECE 不高但拆分到每个年龄段后误差很大。针对这个问题可以在校准阶段做分组校准Group Calibration。具体做法有两种在每个子群体上分别训练校准映射。把群体特征作为额外变量加入校准模型。目标是把近似校准条件从[ \mathbb{E}[Y \mid f(X) p] \approx p ]加强到[ \mathbb{E}[Y \mid f(X) p, G g] \approx p ]也就是说对每一个已知群体 (g)校准都应该是成立的。这是在以人为本评估中非常重要的一步因为它直接影响不同人群是否被公平对待。4.4 校准集划分与数据泄漏防范校准集必须独立于训练集。原则是训练集用来训练评估者校准集用来拟合校准映射测试集用来评估最终效果。如果评估者是机器学习模型那么校准集切分不当会造成数据泄漏导致校准结果偏乐观。常见的做法是三层切分训练集训练每个评估模型。校准集拟合聚合权重或校准映射。测试集评估校准后的效果。5. 理论保证为什么先聚合后校准更可靠5.1 聚合的方差缩减效应假设每个评估者的预测可以写成真实概率加噪声的形式[ f_k(x) p(x) \epsilon_k(x) ]其中 (\epsilon_k(x)) 是均值为零的随机噪声。对 (K) 个评估者的噪声做平均方差会显著下降[ \mathrm{Var}\left( \frac{1}{K}\sum_{k1}^K \epsilon_k(x) \right) \frac{1}{K^2}\sum_{k1}^K \mathrm{Var}(\epsilon_k(x)) ]如果各评估者噪声同分布那么方差直接降为原来的 (1/K)。聚合后的分数波动更小更像是“平滑版”的真实概率这给后续校准函数提供了一个更稳定的输入。5.2 校准误差的来源校准阶段的误差主要来自两个方面校准函数本身的拟合误差。校准集有限样本带来的估计误差。拟合误差取决于校准函数的表达能力和校准集大小估计误差则由校准集中的样本量决定。通常情况下校准误差随校准集样本量增加而下降量级大约是[ O\left( \frac{1}{\sqrt{n_{\text{cal}}}} \right) ]如果先做聚合输入分数更平滑、方差更小那么校准函数需要拟合的模式就更简单因此同等样本量下更容易达到较低的校准误差。5.3 先聚合后校准的误差上界优势先校准后聚合时每个评估者都有一份校准误差假设第 (k) 个评估者的误差为 (\delta_k(x))最终聚合误差满足[ \left| \frac{1}{K}\sum_{k1}^K \delta_k(x) \right| \leq \frac{1}{K}\sum_{k1}^K |\delta_k(x)| ]即使在最理想的情况下误差上限也等于这些误差的平均绝对值。如果各评估者偏差方向一致误差不会互相抵消最终误差近似保留。而先聚合后校准只需要处理一份校准误差误差来源单一理论上的上界更紧。这就解释了为什么该方法能提供更稳定的理论保证。5.4 分组公平性保证如果希望进一步保证不同子群体的校准质量可以在理论分析中引入群体变量。标准做法是要求校准函数对每个预先指定的群体 (g) 都满足近似分组校准[ \left| \mathbb{E}[Y \mid f(X) p, G g] - p \right| \leq \epsilon ]通过分组校准可以在理论上保证每个被关注的群体都有可解释的误差边界。这种“群体级保证”在医疗、金融等高风险场景中非常重要也是近年公平性研究的重要方向。6. 完整算法流程与伪代码下面给出一个通用的 Aggregate-then-Calibrate 算法流程。这里假设已经有 (K) 个评估者每个评估者可以输出 0 到 1 之间的概率分数。输入 训练集 D_train校准集 D_cal测试集 D_test 评估者集合 E_1, E_2, ..., E_K 聚合函数 A例如均值 校准方法 C例如保序回归 流程 1. 使用 D_train 训练或更新每个评估者 E_k。 2. 在 D_cal 上让每个评估者输出分数。 3. 对每个校准样本计算聚合分数 s_i A(E_1(x_i), E_2(x_i), ..., E_K(x_i)) 4. 在聚合分数 s_i 与真实标签 y_i 上拟合校准映射 C。 5. 得到最终预测模型 g(x) C(A(E_1(x), E_2(x), ..., E_K(x))) 6. 在 D_test 上评估 ECE、Brier Score、AUC 等指标。 输出 最终预测函数 g(x) 以及评估报告。这个流程的核心点在于校准集只用于拟合校准映射不参与评估者训练。如果评估者本身需要训练则要把训练集和校准集严格分开。7. 模拟实验演示方法与对比7.1 实验环境与数据说明为了演示方法效果这里用合成数据做一个对比实验。模拟 5 个评估者每个评估者对样本的预测分数由真实概率叠加系统偏差和随机噪声生成。实验环境建议使用Python 3.9 及以上NumPy 1.21 及以上scikit-learn 1.1 及以上完整代码如下可以保存为demo_atc.py运行# 文件路径demo_atc.py import numpy as np from sklearn.isotonic import IsotonicRegression from sklearn.metrics import roc_auc_score np.random.seed(2024) n_samples 3000 n_agents 5 n_features 4 X np.random.randn(n_samples, n_features) theta np.array([0.8, -0.6, 0.5, -0.3]) logits X theta true_prob 1.0 / (1.0 np.exp(-logits)) y (np.random.rand(n_samples) true_prob).astype(int) def _sigmoid(z): return 1.0 / (1.0 np.exp(-z)) # 生成 5 个评估者的预测分数 scores np.zeros((n_samples, n_agents)) for k in range(n_agents): bias (k - 2) * 0.25 noise_scale 0.15 0.08 * k agent_logit logits bias np.random.randn(n_samples) * noise_scale scores[:, k] _sigmoid(agent_logit) def average_aggregation(scores_matrix): return scores_matrix.mean(axis1) def ece(scores, y_true, nbins10): edges np.linspace(0.0, 1.0, nbins 1) bin_ids np.digitize(scores, edges[1:-1]) total 0.0 for b in range(nbins): mask bin_ids b if mask.sum() 0: continue conf scores[mask].mean() freq y_true[mask].mean() total mask.mean() * abs(conf - freq) return total def brier(scores, y_true): return np.mean((scores - y_true) ** 2) # 划分训练集、校准集、测试集 idx np.arange(n_samples) np.random.shuffle(idx) train_idx idx[:1200] cal_idx idx[1200:2100] test_idx idx[2100:] train_agg average_aggregation(scores[train_idx]) cal_agg average_aggregation(scores[cal_idx]) test_agg average_aggregation(scores[test_idx]) # 方法一Aggregate-then-Calibrate iso_atc IsotonicRegression(out_of_boundsclip) iso_atc.fit(cal_agg, y[cal_idx]) atc_pred iso_atc.predict(test_agg) # 方法二Calibrate-then-Aggregate cta_preds np.zeros((len(test_idx), n_agents)) for k in range(n_agents): iso_k IsotonicRegression(out_of_boundsclip) iso_k.fit(scores[cal_idx, k], y[cal_idx]) cta_preds[:, k] iso_k.predict(scores[test_idx, k]) cta_pred cta_preds.mean(axis1) # 方法三Raw Average不校准直接平均 raw_pred test_agg methods { Raw Average: raw_pred, Aggregate-then-Calibrate: atc_pred, Calibrate-then-Aggregate: cta_pred, } print(f{Method:28}{ECE:10}{Brier:10}{AUC:10}) for name, pred in methods.items(): print( f{name:28} f{ece(pred, y[test_idx]):10.4f} f{brier(pred, y[test_idx]):10.4f} f{roc_auc_score(y[test_idx], pred):10.4f} )7.2 预期结果解读运行代码后输出格式类似下面的表格具体数值会随随机种子略有变化方法ECEBrierAUCRaw Average0.08 左右0.20 左右0.86 左右Aggregate-then-Calibrate0.02 左右0.18 左右0.86 左右Calibrate-then-Aggregate0.04 左右0.19 左右0.86 左右重点关注以下几点AUC 在三种方法之间基本一致说明校准主要改善概率可靠性而不是排序能力。ECE 在 Raw Average 上最高说明直接平均后的分数作为概率使用时误差很大。Aggregate-then-Calibrate 的 ECE 通常显著低于 Calibrate-then-Aggregate因为只在聚合结果上做一次校准误差来源更少。Brier Score 与 ECE 的变化趋势基本一致但幅度更小因为 Brier Score 还包含排序误差和方差因素。8. 实际部署中的配套方案8.1 数据切分与评估体系在实际项目中数据切分建议至少分为训练集、校准集、测试集三段。校准集最好来自与线上环境比较接近的时间段否则校准映射会失真。评估体系建议同时报告以下指标ECE代表概率可靠性。Brier Score综合衡量概率质量。AUC代表排序能力。Log Loss衡量概率预测的对数损失。如果业务关注不同子群体还需要按子群体分别计算 ECE并观察群体间差异。8.2 校准集管理与定期重校准评估者的表现会随时间漂移。比如医生诊断标准变化、模型版本升级、样本分布变化都会导致聚合分数的概率含义改变。因此校准映射不能一劳永逸。建议在系统里加入定期重校准机制收集最近一段时间的评估记录。按周或月划分窗口。在最近窗口上重新拟合校准映射。用滚动验证方式评估校准效果。8.3 人为评估者权重更新如果使用加权聚合权重也需要动态更新。建议在独立验证集上定期计算每个评估者的 Brier Score 或 ECE再转换为权重。注意权重更新要有平滑机制避免突然变化。单个评估者样本量过少时不要直接计算权重。权重不能基于测试集计算否则会高估效果。8.4 安全与合规边界在医疗、金融等敏感领域部署时聚合和校准只作为辅助决策参考最终判断必须由具备资质的专业人员完成。系统应记录评估者 ID、聚合分数、校准后分数、最终决策人等关键信息方便事后审计。如果发现某个群体校准误差持续偏高应暂停使用该群体上的输出结果转由人工复核而不是直接上线。9. 常见问题、易错点与排查思路问题现象常见原因解决思路校准后 ECE 仍然很高校准集样本太少或校准函数表达能力不足增加校准集样本量尝试保序回归与 Platt Scaling 的多种组合校准后 AUC 略有下降校准优化目标与排序目标不完全一致检查下降幅度只要下降不明显通常可接受某个子群体校准误差明显偏大只做了全局校准没有按群体拆分改用分组校准在每个群体上单独拟合聚合时某个评估者分数经常是极端值该评估者预测质量差或数据异常先做质量评估过滤掉明显劣化的评估者校准集与线上评估者分布不一致评估者版本升级或人员流动导致分布漂移定期重校准监控分数分布漂移指标评估者输出的是 0/1 硬标签硬标签没有概率信息无法直接校准改用多轮统计频率或让评估者输出连续分数ATC 效果提升不明显所有评估者系统偏差方向高度一致检查是否存在公共偏差源考虑在聚合前先做偏差消除排查时建议按“数据质量 → 聚合方式 → 校准函数 → 群体拆分”的顺序逐层检查。先确认评估者分数没有异常再确认聚合方式合理最后再判断校准函数选择是否恰当。10. 总结与延伸学习路径Aggregate-then-Calibrate 的核心是把多评估者融合拆成两个阶段先通过聚合降低噪声再通过校准修正系统性偏差。相比先校准后聚合它误差来源更少理论保证更清晰在实际项目中实现也更简单。本文通过合成数据演示了三种方法的对比验证了先聚合后校准在 ECE 和 Brier Score 上的优势。代码可以直接复制运行读者可以替换成自己的多评估者数据来验证效果。下一步如果想深入可以考虑学习以下几个方向Brier Score 的分解公式理解可靠性、分辨率、不确定性之间的关系。保序回归与 Platt Scaling 的数学原理。多校准Multi-calibration与分组校准的相关论文。在线校准方法用于流式数据和动态评估者场景。在实际业务中优先关注三点校准集是否独立、群体校准是否覆盖所有关键群体、校准映射是否需要定期更新。把这三点做好多评估者系统的概率输出就会可靠很多。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价