医学图像分类训练:类别不平衡的处理比调学习率更重要
医学图像分类训练类别不平衡的处理比调学习率更重要一、个性化深度引言医学图像分类有一个让人头疼的普遍问题正负样本极度不平衡。在做肺结节检测时一张 CT 切片中结节区域可能只占不到 0.1% 的像素。在眼底图像 DR 分级任务中严重病变的样本数远少于健康样本。初入这个领域的工程师通常会把时间花在调学习率、换优化器、试不同网络结构上。但实验数据表明在类别不平衡严重的数据集上这些操作的收益远不如把精力投入到不平衡处理策略上。见证奇迹的时刻往往出现在你不再追逐 SOTA 结构而是认真设计采样策略和损失函数之后。本文从训练实践出发系统分析医学图像分类中类别不平衡的处理方法及其优先级。二、个性化原理剖析类别不平衡对模型的影响是系统性的。当负样本占 95% 时一个全判为负的模型也能拿到 95% 的准确率但这个模型在医学场景下毫无价值——它漏掉了所有正样本。处理策略分为两大类数据层面和算法层面。数据层面的核心思想是直接改变样本分布。过采样Over-sampling通过复制或合成少数类样本来增加其占比。SMOTE 算法在少数类样本的特征空间中线性插值生成新样本。欠采样Under-sampling删除多余的多数类样本但会损失信息。医学图像数据珍贵欠采样通常不是首选。算法层面的核心是修改损失函数让模型更关注少数类。Focal Loss 通过调制因子降低易分类样本的权重使模型聚焦于难分样本。加权交叉熵直接为少数类赋予更高权重。实践表明数据层面 算法层面的组合策略效果最优。单独使用任一策略都有天花板。三、个性化代码实践以眼底图像 DR 分级任务为例五分类严重不平衡import torch import torch.nn as nn import torch.nn.functional as F from torch.utils.data import WeightedRandomSampler # 1. 计算类别权重基于样本数反比 def compute_class_weights(labels, num_classes): 设计原因样本数越少的类别权重越大。 使用 1/count 而非 1/sqrt(count) 以强力拉升少数类 class_counts torch.bincount(labels, minlengthnum_classes) weights 1.0 / class_counts.float() weights weights / weights.sum() * num_classes # 归一化 return weights # 2. 带权重的 Focal Loss 实现 class WeightedFocalLoss(nn.Module): 设计原因 - alpha: 类别权重处理类别不平衡 - gamma: 调制因子降低易分样本权重 - 两者组合先拉平类别间差异再聚焦难分样本 def __init__(self, alphaNone, gamma2.0, reductionmean): super().__init__() self.alpha alpha self.gamma gamma self.reduction reduction def forward(self, inputs, targets): ce_loss F.cross_entropy(inputs, targets, reductionnone) pt torch.exp(-ce_loss) # 预测概率 focal_loss (1 - pt) ** self.gamma * ce_loss if self.alpha is not None: alpha_t self.alpha[targets] focal_loss alpha_t * focal_loss if self.reduction mean: return focal_loss.mean() else: return focal_loss.sum() # 3. 分层抽样保证每批数据类别均衡 def create_balanced_sampler(dataset, labels): 设计原因RandomSampler 在极端不平衡时可能导致 某些 batch 完全缺失少数类。WeightedRandomSampler 以类别权重控制每样本被选中的概率确保少数类充分暴露。 class_weights compute_class_weights(labels, num_classes5) sample_weights class_weights[labels] sampler WeightedRandomSampler( sample_weights, len(sample_weights), replacementTrue ) return sampler关键设计决策alpha权重而非 class_weight在 Focal Loss 内部加权比传给 CrossEntropyLoss 更灵活可以独立调整 gamma 和 alpha 的贡献。replacementTrue允许少数类样本重复出现确保每 epoch 都能看到所有类别。归一化方式weights / weights.sum() * num_classes使权重中心保持在 1 附近避免 loss 值波动过大。四、个性化边界权衡策略优点缺点适用场景SMOTE 过采样不丢失信息增加多样性高维数据可能生成无效样本特征维度 100简单过采样实现简单过拟合风险高基线实验欠采样训练快减少多数类噪声丢失大量有效信息数据量极大Focal Loss无需改变数据分布gamma 值需精心调试极不平衡场景类别加权计算开销小效果上限低于 Focal轻度不平衡组合策略效果最优超参数多调参成本高实际生产系统见证奇迹的时刻在于一个反直觉的经验在医学图像场景数据增强的收益往往比复杂采样算法更大。DR 分级任务中对少数类样本做 10 倍的旋转翻转亮度增强F1 提升了 4.2 个百分点而替换采样算法只带来 1.1 个点的提升。另一个重要权衡是评估指标选择。Accuracy 在医学场景基本无效。F1-Score 和 AUC-ROC 是底线指标。对于筛查场景Sensitivity召回率比 Specificity 权重更高——漏诊的代价远大于假阳性。五、总结医学图像分类中类别不平衡问题的优先级应高于调参、换网络等常规优化。数据层面的过采样与数据增强、算法层面的 Focal Loss 与类别加权构成处理该问题的完整工具箱。实践中组合策略的效果优于单一策略且数据增强在医学图像场景下的收益被普遍低估。评估指标必须从 Accuracy 转向 F1、AUC-ROC 和 Sensitivity以适应医学场景对漏诊零容忍的要求。WeightedRandomSampler 配合 Focal Loss 是一个成熟可靠的基线方案可在多数医学图像分类任务中直接使用。