1. 临床标注不确定性一个被忽视的评估陷阱在医疗AI领域我们花了大量时间调优模型架构、优化损失函数、清洗训练数据只为在某个公开数据集上让AUROC或AP指标提升哪怕0.5个百分点。排行榜上的名次常常直接决定了论文能否被顶会接收或者一个算法能否进入临床验证阶段。但有一个根本性的问题我们可能一直有意无意地忽略了我们用来评判模型好坏的“金标准”标签它本身真的那么“金”吗以我参与过的一个皮肤镜图像分类项目为例。我们收集了三位资深皮肤科医生对同一批黑色素瘤疑似病变的标注。理想情况下三位专家的判断应该高度一致。但现实是对于边缘清晰度、颜色均匀性这些主观性较强的特征三位医生给出完全相同评分比如都评为“高度可疑”的病例不到70%。更常见的情况是一位医生评为“中度可疑”另一位评为“轻度可疑”第三位可能认为是“良性”。按照通行做法我们采用了多数投票两人及以上认为“可疑”的就定为阳性标签。于是一个“2票可疑 vs 1票良性”的病例和一个“3票全票可疑”的病例在训练和评估时被一视同仁。这合理吗显然不合理。前者蕴含着显著的诊断不确定性而后者几乎是确定的。当模型对这两个病例都给出了0.85的恶性概率预测时传统评估指标会认为模型在两个病例上“表现”一样好。但事实上对于那个存在分歧的病例模型预测的0.85可能更接近“两位医生认为可疑”所隐含的概率比如0.67这其实是一个相当不错的、能反映临床现实的预测而对于那个确凿的病例0.85的预测可能反而低估了其恶性风险。如果我们只用二值化的“阳性/阴性”标签来评估这种细微而重要的差异就被彻底抹杀了。这就是临床标注不确定性的核心挑战。它并非数据噪声而是医学认知本身固有的模糊性在数据上的体现。忽视它意味着我们用一把本身就有弹性的尺子去测量模型的“精确度”。结果就是评估体系可能会系统性偏爱那些善于“猜”出我们人为制造的、脆弱的“确定性”标签的模型而惩罚那些试图诚实反映临床诊断概率分布的模型。长此以往我们筛选出的可能不是最能辅助医生的AI而是最会“应试”的AI。2. 从“硬指标”到“软指标”评估范式的转变要解决上述问题我们需要在评估环节引入“不确定性感知”的思维。这不仅仅是理念上的转变更有一套成熟的、可直接落地的数学工具支撑即“软指标”。2.1 传统“硬指标”的局限与多数投票的幻觉目前主流的评估指标如AUROC和AP我习惯称之为“硬指标”。它们运作的核心前提是每个样本都有一个确定的、非黑即白的真实标签0或1。模型输出一个连续的概率值例如0.73我们通过设定一个阈值如0.5将其转化为二值预测然后与“金标准”比较计算真阳性、假阳性等。在存在多位标注者的场景下为了得到这个二值“金标准”最常用的方法是多数投票。但这制造了一种“确定的幻觉”。举个例子在CheXpert数据集的“气胸”检测任务中一个病例可能获得8位放射科医生的标注[阳性 阳性 阴性 不确定 阳性 阴性 不确定 阳性]。经过多数投票忽略“不确定”4票阳性 vs 2票阴性该病例被标记为“阳性”。这个“阳性”标签的置信度与另一个8票全阳性的病例是天差地别的。然而在计算AUROC时它们对指标的贡献权重完全相同。这种处理方式会带来两个直接后果评估失真模型在那些专家分歧大的“模糊病例”上的表现被错误计量。一个能输出0.6反映4/6的阳性率的模型可能比一个武断输出0.95的模型更符合临床实际但后者在硬指标下得分可能更高。排名扭曲如原文实验所示使用硬指标AP/AUROC和软指标s-AP/s-AUROC对同一批模型进行排序结果会出现显著差异。这意味着基于硬指标的排行榜选出的“最优模型”可能并非最能稳健处理临床不确定性的模型。2.2 “软指标”的核心思想与数学实现“软指标”的思路非常直观既然标注本身是不确定的我们何不直接用这种不确定性来评估模型换句话说我们把每个样本的真实标签从一个确定的“0”或“1”扩展为一个在[0, 1]区间内的概率值p。这个p可以简单地是赞同“阳性”的标注者比例如上面例子中的 4/6 ≈ 0.667也可以是经过更复杂模型如项目反应理论校准后的置信度。有了概率形式的软标签传统指标就可以自然地扩展。其核心在于重新定义“累积计数”。假设我们有n个样本按照模型预测为阳性的分数从高到低排序。对于排在第i位的样本令p_i为其软标签值即其为阳性的概率。我们不再累加“阳性”的个数而是累加“阳性的概率”。定义截至第i个样本的累积阳性概率和为n_i Σ_{j1}^{i} p_j累积阴性概率和为n- _i Σ_{j1}^{i} (1 - p_j)。相应地真阳性率TPR和假阳性率FPR被重新定义为TPR_i n_i / n其中n是所有样本阳性概率的总和FPR_i n- _i / n-其中n-是所有样本阴性概率的总和精确率Precision和召回率Recall则定义为P_i n_i / iR_i n_i / n基于这些重新定义的“软”TPR/FPR和P/R软AUROCs-AUROC和软APs-AP的计算公式在形式上与硬指标完全一致只是内涵变成了对概率分布的度量。具体公式如原文所给其精妙之处在于一旦样本按分数排序这些指标都可以通过单次遍历的线性时间算法高效计算计算开销与硬指标无异。注意当所有p_i都是0或1时即标签是确定的软指标的计算结果会完全退化为传统的硬指标。这意味着软指标是硬指标的一个严格泛化而非一个全新的、不兼容的体系。2.3 软指标的优势与适用场景采用软指标进行评估至少带来三方面的重要提升评估更公平它承认了模糊病例的存在并给予其恰当的权重。一个在专家共识强的病例上预测正确、在专家分歧大的病例上预测接近概率均值的模型会获得比一个在后者上盲目输出极端值的模型更合理的评价。排名更稳健如原文中的Bootstrap分析通过对标注进行重采样来模拟标注波动所示使用软指标得出的模型排名在不同次的重采样中表现出更高的一致性平均排名相关系数更高。这说明软指标减少了因标注随机波动导致的排名摇摆评估结果更可靠。导向更正确它鼓励模型去学习并反映数据中固有的不确定性而不是去强行拟合一个被简化了的、过于确定的“伪目标”。这对于构建真正可信、可解释的临床AI系统至关重要。那么哪些场景尤其需要软指标呢根据我的经验主要取决于标注任务本身的“主观性”或“模糊性”程度高不确定性场景强烈推荐使用皮肤病学诊断如黑色素瘤的ABCDE特征不对称性、边界、颜色评估不同医生间差异显著。放射学细微征象判读如肺结节的良恶性鉴别、乳腺钼靶上的结构扭曲、某些肺炎的早期表现。病理学分级如前列腺癌的Gleason评分、肿瘤浸润程度的判定。眼科影像分析如糖尿病视网膜病变的分级。低不确定性场景软硬指标差异可能不大骨折检测X光片中是否存在骨折线通常共识度很高。大体积占位性病变检测如明显的肺部肿块、脑出血通常分歧较小。基于明确量化指标的任务如心室射血分数计算、骨骼长度测量。一个简单的判断方法是如果该诊断任务在资深医生间会经常发生会诊讨论那么其标注不确定性就高软指标的价值就大。3. 实操如何在你的项目中引入不确定性感知评估理解了“为什么”和“是什么”接下来就是“怎么做”。将软指标整合到你的医疗AI项目评估流程中并不需要推倒重来只需在现有流程上增加几个环节。3.1 数据准备获取与构建软标签软指标应用的前提是拥有概率形式的软标签。这通常来源于多标注者数据。从原始标注构建如果你的数据集包含了多位标注者对同一样本的独立标注例如CheXpert, ENHANCE那么构建软标签最直接的方法就是计算阳性比例。假设一个样本被k位标注者标注其中m位认为是阳性那么软标签p m / k。如果标注者还提供了置信度如1-5分则可以将其归一化到[0,1]区间后取平均。处理“不确定”标签许多医学标注框架如CheXpert的“Uncertain”允许标注者表达不确定。建议不要简单地忽略或随机分配这些标签。可以将“不确定”视为0.5或者根据任务特点将其分摊到阳性和阴性中例如如果有其他证据辅助可以按一定权重分配。关键是要在数据描述中明确你的处理方式。使用标注者响应模型对于更复杂的标注研究可以考虑使用项目反应理论IRT或GLADGenerative Model of Labels, Abilities, and Difficulties等模型从多标注者数据中同时估计样本的真实难度、标注者水平并得到校准后的样本为阳性的概率。这能更精细地处理不同标注者可靠性的差异。实操心得在项目启动的数据协议中就应明确要求合作方提供“未聚合的原始标注”。一份包含(sample_id, annotator_id, label)三元组的表格远比一个已经过多数投票处理的“干净”标签文件有价值得多。这是进行任何不确定性分析的基础。3.2 模型训练与预测输出校准的概率软指标评估要求模型输出的是经过良好校准的概率而非仅仅用于排序的分数。这意味着模型的输出应尽可能反映样本为阳性的真实可能性。使用合适的损失函数对于二分类任务二元交叉熵BCE损失是标准选择它直接优化概率输出的对数似然。确保你的模型最后一层是Sigmoid激活函数。进行概率校准即便使用BCE损失现代深度神经网络尤其是复杂模型的输出也常常存在“过度自信”或“自信不足”的问题。训练后可以使用Platt缩放或等渗回归等方法对模型输出进行校准。虽然校准不会改变基于排序的指标如AUROC的排名但它能让输出的概率值具有更好的解释性这对于后续的s-AP计算以及临床决策阈值的选择都有意义。考虑不确定性感知训练这属于更前沿的尝试。例如可以在训练时直接使用软标签概率作为目标用KL散度作为损失函数的一部分让模型学习预测分布而不仅仅是点估计。或者采用贝叶斯神经网络、蒙特卡洛Dropout等方法来估计模型本身的不确定性。原文也提到这类模型可能在软指标下表现更好但这需要进一步的实证研究。3.3 评估实施计算与解读软指标计算软指标的代码实现非常直接。以下是一个用Python基于NumPy计算s-AP的示例假设你已经有了模型预测的概率数组y_pred_scores和对应的软标签数组y_true_soft值在0到1之间。import numpy as np def soft_average_precision(y_true_soft, y_pred_scores): 计算软平均精度 (s-AP)。 参数: y_true_soft: np.ndarray, 形状 (n_samples,)软标签概率值。 y_pred_scores: np.ndarray, 形状 (n_samples,)模型预测的分数值越大越可能是阳性。 返回: s_ap: float, 软AP值。 # 1. 根据预测分数降序排列 desc_score_indices np.argsort(y_pred_scores)[::-1] y_true_soft_sorted y_true_soft[desc_score_indices] y_pred_scores_sorted y_pred_scores[desc_score_indices] # 2. 计算累积阳性概率和 cum_positive_soft np.cumsum(y_true_soft_sorted) # 总阳性概率和 total_positive_soft np.sum(y_true_soft_sorted) # 3. 计算每个位置排序后的精确率和召回率 # 位置索引从1开始计数 rank_indices np.arange(1, len(y_true_soft_sorted) 1) precision_at_k cum_positive_soft / rank_indices # 公式中的 P_i recall_at_k cum_positive_soft / total_positive_soft # 公式中的 R_i # 4. 计算s-AP (采用插值法通常取召回率增加点处的最大精确率) # 这里实现的是VOC风格的AP计算对软标签同样适用 # 我们需要找到召回率变化的位置 # 一种简单实现是计算精确率-召回率曲线下的面积 # 由于召回率是单调递增的我们可以用梯形法则积分 ap 0.0 # 在召回率轴上从0开始 previous_recall 0.0 # 遍历所有样本计算每个点对面积的贡献 for i in range(len(precision_at_k)): current_recall recall_at_k[i] recall_increment current_recall - previous_recall # 使用当前精确率作为矩形高VOC方式或使用插值更精确 # 这里采用当前精确率更简单的实现 ap precision_at_k[i] * recall_increment previous_recall current_recall # 另一种更严谨的写法是取每个召回率区间右侧的最大精确率插值 # 以下是插值法的实现 # 将精确率和召回率组合并按召回率排序 # 为了得到单调递减的精确率-召回率曲线通常取每个召回率点右侧的最大精确率 mrec np.concatenate(([0.], recall_at_k, [1.])) mpre np.concatenate(([0.], precision_at_k, [0.])) # 确保精确率是单调递减的从后向前取最大值 for i in range(len(mpre) - 2, -1, -1): mpre[i] np.maximum(mpre[i], mpre[i 1]) # 计算曲线下面积 ap 0.0 for i in range(len(mrec) - 1): ap (mrec[i 1] - mrec[i]) * mpre[i 1] return ap # 示例用法 # 假设有1000个样本 n_samples 1000 np.random.seed(42) # 生成模拟的软标签例如来自3位标注者的平均 y_true_soft np.random.beta(a2, b2, sizen_samples) # Beta分布可以模拟0-1之间的概率 # 生成模拟的模型预测分数与真实软标签有一定相关性 y_pred_scores y_true_soft np.random.normal(0, 0.2, sizen_samples) y_pred_scores np.clip(y_pred_scores, 0, 1) # 限制在[0,1]区间 s_ap_value soft_average_precision(y_true_soft, y_pred_scores) print(f软平均精度 (s-AP): {s_ap_value:.4f}) # 对比如果我们强行将软标签二值化例如阈值0.5 y_true_hard (y_true_soft 0.5).astype(float) # 使用sklearn计算传统AP from sklearn.metrics import average_precision_score ap_value average_precision_score(y_true_hard, y_pred_scores) print(f传统平均精度 (AP基于二值化标签): {ap_value:.4f})结果解读与报告 计算得到软指标后关键在于如何解读和报告。并行列报在论文或项目报告中永远不要只报告软指标而隐藏硬指标。最佳实践是同时报告传统AP/AUROC和s-AP/s-AUROC。这能让读者清楚地看到考虑不确定性后模型表现的绝对水平和相对排名发生了多大变化。关注排名变化如原文图1所示对于不同的模型架构VGG-16, ResNet-50等使用软硬指标可能会产生不同的排名顺序。你需要分析这种变化是某个模型在模糊病例上表现特别稳健还是另一个模型过度拟合了确定病例这种分析能为你选择最终部署模型提供更深层次的洞察。理解分数含义软AP的绝对值通常低于硬AP因为它对模型在低置信度区域的预测错误惩罚更重。一个0.6的s-AP可能代表着一个非常优秀的模型如果任务本身标注分歧很大。因此跨任务比较软AP的绝对值意义不大它更适用于同一任务下不同模型间的比较。4. 常见问题、挑战与应对策略在实际操作中你可能会遇到以下几个典型问题问题一我们没有多标注者数据只有单标注者提供的“硬标签”怎么办这是最常见的困境。没有原始的多标注者信息就无法构建软标签。此时软指标无从谈起。但这恰恰凸显了在数据收集阶段规划多标注的重要性。对于新启动的项目务必争取资源进行至少部分数据的多标注。对于已有数据集可以尝试数据增广与模拟通过引入基于领域知识的噪声例如对边界清晰的病变其标签翻转变异的概率极低对边界模糊的病变赋予一个标签翻转的概率来模拟不确定性。但这需要很强的领域先验且效果存疑。强调局限性在报告中明确声明评估是基于单标注者确定的“金标准”其结果可能高估了模型在真实临床模糊场景下的性能。这是一种负责任的学术态度。问题二计算软指标对模型输出有什么特殊要求模型输出需要是完美的校准概率吗软指标的核心是比较模型输出的排序与软标签概率值在排序上的匹配程度。因此模型输出只需要是单调的、与阳性概率正相关的分数即可不一定需要是完美校准的概率。s-AUROC作为排序指标对输出的绝对数值不敏感只关心顺序。s-AP虽然受数值影响但只要模型输出的分数能大致区分高概率阳性和低概率阳性样本其评估就是有意义的。当然一个经过良好校准的概率输出会使s-AP的解释性更强。问题三软标签的构建方式简单平均 vs. 复杂模型会对评估结果产生很大影响吗会而且这是一个尚未被充分探索的重要问题。简单地将多位标注者的投票取平均隐含了“所有标注者水平相同、彼此独立”的假设。现实中资深专家和新手医生的权重理应不同且他们的判断可能存在相关性。使用GLAD或IRT等模型可以估计标注者能力和样本难度从而得到更准确的软标签。原文也指出不同的聚合模型可能对最终评估排名产生影响。在条件允许时建议尝试不同的软标签构建方法并进行敏感性分析观察模型排名的稳健性。问题四在类别极度不平衡的数据集上软指标是否仍然有效是的软指标本身并不改变类别不平衡的问题。s-AUROC对类别不平衡不敏感这与传统AUROC一样。s-AP则对阳性类通常是少数类的预测质量更敏感。在极度不平衡的数据集上如VinDr中的气胸任务阳性率仅0.4%无论是硬AP还是软AP其绝对值都会非常小且不稳定。此时关注排名变化比关注绝对值更重要。同时可以考虑使用更稳定的替代指标如软标签下的加权F1分数或专门针对不平衡数据设计的软指标变体。问题五如何说服合作方或审稿人接受这种“非标准”的评估方式这可能是最大的非技术挑战。我的策略是诉诸临床现实强调医学诊断本身具有不确定性展示标注者间一致性的统计数据如Cohen‘s Kappa说明硬标签是对现实的过度简化。展示实证影响像原文那样用自己项目的数据做一个简单的对比实验。展示使用软硬指标时模型排名发生了怎样的变化。一个直观的图表胜过千言万语。强调方法简便性说明软指标是传统指标的直接泛化计算复杂度相同且当标签确定时完全等价。它不是增加负担而是增加信息。引用先行研究引用本文Lionetti et al., ML4H 2025以及Maier-Hein、Chen、Gordon等人的相关工作表明这已成为医疗AI评估领域一个受到关注的重要议题。最后我想分享一点个人体会。在医疗AI项目中我们常常不自觉地追求一个“完美”的、确定性的答案。但医学的本质很大程度上是在不确定性中做出决策。一个优秀的临床AI系统其价值不仅在于给出诊断更在于清晰地传达其判断的置信度。采用不确定性感知的评估正是将我们的研发导向构建这类“诚实”且“有用”系统的关键一步。它迫使我们在模型开发的每一个环节——从数据标注、模型训练到最终评估——都去正视和拥抱临床现实中的模糊性。这或许会让排行榜上的数字看起来没那么“漂亮”但它让我们离真正可靠的医疗AI更近了一步。
医疗AI评估新范式:从硬指标到软指标,应对临床标注不确定性
1. 临床标注不确定性一个被忽视的评估陷阱在医疗AI领域我们花了大量时间调优模型架构、优化损失函数、清洗训练数据只为在某个公开数据集上让AUROC或AP指标提升哪怕0.5个百分点。排行榜上的名次常常直接决定了论文能否被顶会接收或者一个算法能否进入临床验证阶段。但有一个根本性的问题我们可能一直有意无意地忽略了我们用来评判模型好坏的“金标准”标签它本身真的那么“金”吗以我参与过的一个皮肤镜图像分类项目为例。我们收集了三位资深皮肤科医生对同一批黑色素瘤疑似病变的标注。理想情况下三位专家的判断应该高度一致。但现实是对于边缘清晰度、颜色均匀性这些主观性较强的特征三位医生给出完全相同评分比如都评为“高度可疑”的病例不到70%。更常见的情况是一位医生评为“中度可疑”另一位评为“轻度可疑”第三位可能认为是“良性”。按照通行做法我们采用了多数投票两人及以上认为“可疑”的就定为阳性标签。于是一个“2票可疑 vs 1票良性”的病例和一个“3票全票可疑”的病例在训练和评估时被一视同仁。这合理吗显然不合理。前者蕴含着显著的诊断不确定性而后者几乎是确定的。当模型对这两个病例都给出了0.85的恶性概率预测时传统评估指标会认为模型在两个病例上“表现”一样好。但事实上对于那个存在分歧的病例模型预测的0.85可能更接近“两位医生认为可疑”所隐含的概率比如0.67这其实是一个相当不错的、能反映临床现实的预测而对于那个确凿的病例0.85的预测可能反而低估了其恶性风险。如果我们只用二值化的“阳性/阴性”标签来评估这种细微而重要的差异就被彻底抹杀了。这就是临床标注不确定性的核心挑战。它并非数据噪声而是医学认知本身固有的模糊性在数据上的体现。忽视它意味着我们用一把本身就有弹性的尺子去测量模型的“精确度”。结果就是评估体系可能会系统性偏爱那些善于“猜”出我们人为制造的、脆弱的“确定性”标签的模型而惩罚那些试图诚实反映临床诊断概率分布的模型。长此以往我们筛选出的可能不是最能辅助医生的AI而是最会“应试”的AI。2. 从“硬指标”到“软指标”评估范式的转变要解决上述问题我们需要在评估环节引入“不确定性感知”的思维。这不仅仅是理念上的转变更有一套成熟的、可直接落地的数学工具支撑即“软指标”。2.1 传统“硬指标”的局限与多数投票的幻觉目前主流的评估指标如AUROC和AP我习惯称之为“硬指标”。它们运作的核心前提是每个样本都有一个确定的、非黑即白的真实标签0或1。模型输出一个连续的概率值例如0.73我们通过设定一个阈值如0.5将其转化为二值预测然后与“金标准”比较计算真阳性、假阳性等。在存在多位标注者的场景下为了得到这个二值“金标准”最常用的方法是多数投票。但这制造了一种“确定的幻觉”。举个例子在CheXpert数据集的“气胸”检测任务中一个病例可能获得8位放射科医生的标注[阳性 阳性 阴性 不确定 阳性 阴性 不确定 阳性]。经过多数投票忽略“不确定”4票阳性 vs 2票阴性该病例被标记为“阳性”。这个“阳性”标签的置信度与另一个8票全阳性的病例是天差地别的。然而在计算AUROC时它们对指标的贡献权重完全相同。这种处理方式会带来两个直接后果评估失真模型在那些专家分歧大的“模糊病例”上的表现被错误计量。一个能输出0.6反映4/6的阳性率的模型可能比一个武断输出0.95的模型更符合临床实际但后者在硬指标下得分可能更高。排名扭曲如原文实验所示使用硬指标AP/AUROC和软指标s-AP/s-AUROC对同一批模型进行排序结果会出现显著差异。这意味着基于硬指标的排行榜选出的“最优模型”可能并非最能稳健处理临床不确定性的模型。2.2 “软指标”的核心思想与数学实现“软指标”的思路非常直观既然标注本身是不确定的我们何不直接用这种不确定性来评估模型换句话说我们把每个样本的真实标签从一个确定的“0”或“1”扩展为一个在[0, 1]区间内的概率值p。这个p可以简单地是赞同“阳性”的标注者比例如上面例子中的 4/6 ≈ 0.667也可以是经过更复杂模型如项目反应理论校准后的置信度。有了概率形式的软标签传统指标就可以自然地扩展。其核心在于重新定义“累积计数”。假设我们有n个样本按照模型预测为阳性的分数从高到低排序。对于排在第i位的样本令p_i为其软标签值即其为阳性的概率。我们不再累加“阳性”的个数而是累加“阳性的概率”。定义截至第i个样本的累积阳性概率和为n_i Σ_{j1}^{i} p_j累积阴性概率和为n- _i Σ_{j1}^{i} (1 - p_j)。相应地真阳性率TPR和假阳性率FPR被重新定义为TPR_i n_i / n其中n是所有样本阳性概率的总和FPR_i n- _i / n-其中n-是所有样本阴性概率的总和精确率Precision和召回率Recall则定义为P_i n_i / iR_i n_i / n基于这些重新定义的“软”TPR/FPR和P/R软AUROCs-AUROC和软APs-AP的计算公式在形式上与硬指标完全一致只是内涵变成了对概率分布的度量。具体公式如原文所给其精妙之处在于一旦样本按分数排序这些指标都可以通过单次遍历的线性时间算法高效计算计算开销与硬指标无异。注意当所有p_i都是0或1时即标签是确定的软指标的计算结果会完全退化为传统的硬指标。这意味着软指标是硬指标的一个严格泛化而非一个全新的、不兼容的体系。2.3 软指标的优势与适用场景采用软指标进行评估至少带来三方面的重要提升评估更公平它承认了模糊病例的存在并给予其恰当的权重。一个在专家共识强的病例上预测正确、在专家分歧大的病例上预测接近概率均值的模型会获得比一个在后者上盲目输出极端值的模型更合理的评价。排名更稳健如原文中的Bootstrap分析通过对标注进行重采样来模拟标注波动所示使用软指标得出的模型排名在不同次的重采样中表现出更高的一致性平均排名相关系数更高。这说明软指标减少了因标注随机波动导致的排名摇摆评估结果更可靠。导向更正确它鼓励模型去学习并反映数据中固有的不确定性而不是去强行拟合一个被简化了的、过于确定的“伪目标”。这对于构建真正可信、可解释的临床AI系统至关重要。那么哪些场景尤其需要软指标呢根据我的经验主要取决于标注任务本身的“主观性”或“模糊性”程度高不确定性场景强烈推荐使用皮肤病学诊断如黑色素瘤的ABCDE特征不对称性、边界、颜色评估不同医生间差异显著。放射学细微征象判读如肺结节的良恶性鉴别、乳腺钼靶上的结构扭曲、某些肺炎的早期表现。病理学分级如前列腺癌的Gleason评分、肿瘤浸润程度的判定。眼科影像分析如糖尿病视网膜病变的分级。低不确定性场景软硬指标差异可能不大骨折检测X光片中是否存在骨折线通常共识度很高。大体积占位性病变检测如明显的肺部肿块、脑出血通常分歧较小。基于明确量化指标的任务如心室射血分数计算、骨骼长度测量。一个简单的判断方法是如果该诊断任务在资深医生间会经常发生会诊讨论那么其标注不确定性就高软指标的价值就大。3. 实操如何在你的项目中引入不确定性感知评估理解了“为什么”和“是什么”接下来就是“怎么做”。将软指标整合到你的医疗AI项目评估流程中并不需要推倒重来只需在现有流程上增加几个环节。3.1 数据准备获取与构建软标签软指标应用的前提是拥有概率形式的软标签。这通常来源于多标注者数据。从原始标注构建如果你的数据集包含了多位标注者对同一样本的独立标注例如CheXpert, ENHANCE那么构建软标签最直接的方法就是计算阳性比例。假设一个样本被k位标注者标注其中m位认为是阳性那么软标签p m / k。如果标注者还提供了置信度如1-5分则可以将其归一化到[0,1]区间后取平均。处理“不确定”标签许多医学标注框架如CheXpert的“Uncertain”允许标注者表达不确定。建议不要简单地忽略或随机分配这些标签。可以将“不确定”视为0.5或者根据任务特点将其分摊到阳性和阴性中例如如果有其他证据辅助可以按一定权重分配。关键是要在数据描述中明确你的处理方式。使用标注者响应模型对于更复杂的标注研究可以考虑使用项目反应理论IRT或GLADGenerative Model of Labels, Abilities, and Difficulties等模型从多标注者数据中同时估计样本的真实难度、标注者水平并得到校准后的样本为阳性的概率。这能更精细地处理不同标注者可靠性的差异。实操心得在项目启动的数据协议中就应明确要求合作方提供“未聚合的原始标注”。一份包含(sample_id, annotator_id, label)三元组的表格远比一个已经过多数投票处理的“干净”标签文件有价值得多。这是进行任何不确定性分析的基础。3.2 模型训练与预测输出校准的概率软指标评估要求模型输出的是经过良好校准的概率而非仅仅用于排序的分数。这意味着模型的输出应尽可能反映样本为阳性的真实可能性。使用合适的损失函数对于二分类任务二元交叉熵BCE损失是标准选择它直接优化概率输出的对数似然。确保你的模型最后一层是Sigmoid激活函数。进行概率校准即便使用BCE损失现代深度神经网络尤其是复杂模型的输出也常常存在“过度自信”或“自信不足”的问题。训练后可以使用Platt缩放或等渗回归等方法对模型输出进行校准。虽然校准不会改变基于排序的指标如AUROC的排名但它能让输出的概率值具有更好的解释性这对于后续的s-AP计算以及临床决策阈值的选择都有意义。考虑不确定性感知训练这属于更前沿的尝试。例如可以在训练时直接使用软标签概率作为目标用KL散度作为损失函数的一部分让模型学习预测分布而不仅仅是点估计。或者采用贝叶斯神经网络、蒙特卡洛Dropout等方法来估计模型本身的不确定性。原文也提到这类模型可能在软指标下表现更好但这需要进一步的实证研究。3.3 评估实施计算与解读软指标计算软指标的代码实现非常直接。以下是一个用Python基于NumPy计算s-AP的示例假设你已经有了模型预测的概率数组y_pred_scores和对应的软标签数组y_true_soft值在0到1之间。import numpy as np def soft_average_precision(y_true_soft, y_pred_scores): 计算软平均精度 (s-AP)。 参数: y_true_soft: np.ndarray, 形状 (n_samples,)软标签概率值。 y_pred_scores: np.ndarray, 形状 (n_samples,)模型预测的分数值越大越可能是阳性。 返回: s_ap: float, 软AP值。 # 1. 根据预测分数降序排列 desc_score_indices np.argsort(y_pred_scores)[::-1] y_true_soft_sorted y_true_soft[desc_score_indices] y_pred_scores_sorted y_pred_scores[desc_score_indices] # 2. 计算累积阳性概率和 cum_positive_soft np.cumsum(y_true_soft_sorted) # 总阳性概率和 total_positive_soft np.sum(y_true_soft_sorted) # 3. 计算每个位置排序后的精确率和召回率 # 位置索引从1开始计数 rank_indices np.arange(1, len(y_true_soft_sorted) 1) precision_at_k cum_positive_soft / rank_indices # 公式中的 P_i recall_at_k cum_positive_soft / total_positive_soft # 公式中的 R_i # 4. 计算s-AP (采用插值法通常取召回率增加点处的最大精确率) # 这里实现的是VOC风格的AP计算对软标签同样适用 # 我们需要找到召回率变化的位置 # 一种简单实现是计算精确率-召回率曲线下的面积 # 由于召回率是单调递增的我们可以用梯形法则积分 ap 0.0 # 在召回率轴上从0开始 previous_recall 0.0 # 遍历所有样本计算每个点对面积的贡献 for i in range(len(precision_at_k)): current_recall recall_at_k[i] recall_increment current_recall - previous_recall # 使用当前精确率作为矩形高VOC方式或使用插值更精确 # 这里采用当前精确率更简单的实现 ap precision_at_k[i] * recall_increment previous_recall current_recall # 另一种更严谨的写法是取每个召回率区间右侧的最大精确率插值 # 以下是插值法的实现 # 将精确率和召回率组合并按召回率排序 # 为了得到单调递减的精确率-召回率曲线通常取每个召回率点右侧的最大精确率 mrec np.concatenate(([0.], recall_at_k, [1.])) mpre np.concatenate(([0.], precision_at_k, [0.])) # 确保精确率是单调递减的从后向前取最大值 for i in range(len(mpre) - 2, -1, -1): mpre[i] np.maximum(mpre[i], mpre[i 1]) # 计算曲线下面积 ap 0.0 for i in range(len(mrec) - 1): ap (mrec[i 1] - mrec[i]) * mpre[i 1] return ap # 示例用法 # 假设有1000个样本 n_samples 1000 np.random.seed(42) # 生成模拟的软标签例如来自3位标注者的平均 y_true_soft np.random.beta(a2, b2, sizen_samples) # Beta分布可以模拟0-1之间的概率 # 生成模拟的模型预测分数与真实软标签有一定相关性 y_pred_scores y_true_soft np.random.normal(0, 0.2, sizen_samples) y_pred_scores np.clip(y_pred_scores, 0, 1) # 限制在[0,1]区间 s_ap_value soft_average_precision(y_true_soft, y_pred_scores) print(f软平均精度 (s-AP): {s_ap_value:.4f}) # 对比如果我们强行将软标签二值化例如阈值0.5 y_true_hard (y_true_soft 0.5).astype(float) # 使用sklearn计算传统AP from sklearn.metrics import average_precision_score ap_value average_precision_score(y_true_hard, y_pred_scores) print(f传统平均精度 (AP基于二值化标签): {ap_value:.4f})结果解读与报告 计算得到软指标后关键在于如何解读和报告。并行列报在论文或项目报告中永远不要只报告软指标而隐藏硬指标。最佳实践是同时报告传统AP/AUROC和s-AP/s-AUROC。这能让读者清楚地看到考虑不确定性后模型表现的绝对水平和相对排名发生了多大变化。关注排名变化如原文图1所示对于不同的模型架构VGG-16, ResNet-50等使用软硬指标可能会产生不同的排名顺序。你需要分析这种变化是某个模型在模糊病例上表现特别稳健还是另一个模型过度拟合了确定病例这种分析能为你选择最终部署模型提供更深层次的洞察。理解分数含义软AP的绝对值通常低于硬AP因为它对模型在低置信度区域的预测错误惩罚更重。一个0.6的s-AP可能代表着一个非常优秀的模型如果任务本身标注分歧很大。因此跨任务比较软AP的绝对值意义不大它更适用于同一任务下不同模型间的比较。4. 常见问题、挑战与应对策略在实际操作中你可能会遇到以下几个典型问题问题一我们没有多标注者数据只有单标注者提供的“硬标签”怎么办这是最常见的困境。没有原始的多标注者信息就无法构建软标签。此时软指标无从谈起。但这恰恰凸显了在数据收集阶段规划多标注的重要性。对于新启动的项目务必争取资源进行至少部分数据的多标注。对于已有数据集可以尝试数据增广与模拟通过引入基于领域知识的噪声例如对边界清晰的病变其标签翻转变异的概率极低对边界模糊的病变赋予一个标签翻转的概率来模拟不确定性。但这需要很强的领域先验且效果存疑。强调局限性在报告中明确声明评估是基于单标注者确定的“金标准”其结果可能高估了模型在真实临床模糊场景下的性能。这是一种负责任的学术态度。问题二计算软指标对模型输出有什么特殊要求模型输出需要是完美的校准概率吗软指标的核心是比较模型输出的排序与软标签概率值在排序上的匹配程度。因此模型输出只需要是单调的、与阳性概率正相关的分数即可不一定需要是完美校准的概率。s-AUROC作为排序指标对输出的绝对数值不敏感只关心顺序。s-AP虽然受数值影响但只要模型输出的分数能大致区分高概率阳性和低概率阳性样本其评估就是有意义的。当然一个经过良好校准的概率输出会使s-AP的解释性更强。问题三软标签的构建方式简单平均 vs. 复杂模型会对评估结果产生很大影响吗会而且这是一个尚未被充分探索的重要问题。简单地将多位标注者的投票取平均隐含了“所有标注者水平相同、彼此独立”的假设。现实中资深专家和新手医生的权重理应不同且他们的判断可能存在相关性。使用GLAD或IRT等模型可以估计标注者能力和样本难度从而得到更准确的软标签。原文也指出不同的聚合模型可能对最终评估排名产生影响。在条件允许时建议尝试不同的软标签构建方法并进行敏感性分析观察模型排名的稳健性。问题四在类别极度不平衡的数据集上软指标是否仍然有效是的软指标本身并不改变类别不平衡的问题。s-AUROC对类别不平衡不敏感这与传统AUROC一样。s-AP则对阳性类通常是少数类的预测质量更敏感。在极度不平衡的数据集上如VinDr中的气胸任务阳性率仅0.4%无论是硬AP还是软AP其绝对值都会非常小且不稳定。此时关注排名变化比关注绝对值更重要。同时可以考虑使用更稳定的替代指标如软标签下的加权F1分数或专门针对不平衡数据设计的软指标变体。问题五如何说服合作方或审稿人接受这种“非标准”的评估方式这可能是最大的非技术挑战。我的策略是诉诸临床现实强调医学诊断本身具有不确定性展示标注者间一致性的统计数据如Cohen‘s Kappa说明硬标签是对现实的过度简化。展示实证影响像原文那样用自己项目的数据做一个简单的对比实验。展示使用软硬指标时模型排名发生了怎样的变化。一个直观的图表胜过千言万语。强调方法简便性说明软指标是传统指标的直接泛化计算复杂度相同且当标签确定时完全等价。它不是增加负担而是增加信息。引用先行研究引用本文Lionetti et al., ML4H 2025以及Maier-Hein、Chen、Gordon等人的相关工作表明这已成为医疗AI评估领域一个受到关注的重要议题。最后我想分享一点个人体会。在医疗AI项目中我们常常不自觉地追求一个“完美”的、确定性的答案。但医学的本质很大程度上是在不确定性中做出决策。一个优秀的临床AI系统其价值不仅在于给出诊断更在于清晰地传达其判断的置信度。采用不确定性感知的评估正是将我们的研发导向构建这类“诚实”且“有用”系统的关键一步。它迫使我们在模型开发的每一个环节——从数据标注、模型训练到最终评估——都去正视和拥抱临床现实中的模糊性。这或许会让排行榜上的数字看起来没那么“漂亮”但它让我们离真正可靠的医疗AI更近了一步。