如何解决PyTorch中ISIC-2019数据集的类别不平衡问题
问题排查与解决方案
一、现有方法失效的可能原因
- 数据划分合理性:检查训练/验证/测试集是否保留了原始类别分布比例。比如类别3仅177张样本,10%的测试集可能仅含18张左右,样本量过少会导致模型难以学习到该类的有效特征,直接拉低整体泛化能力。
- 过采样的局限性:RandomOverSampler直接复制少数类样本,无法提供新特征信息,容易导致模型对重复样本产生记忆,难以泛化到真实数据。训练与验证精度接近0.5,说明模型未学到有区分度的特征,单纯复制样本对提升模型能力帮助有限。
- WeightedRandomSampler权重设置:若权重未按
1/各类样本数的比例计算,或未做归一化处理,会导致模型偏向部分类别,无法均衡学习所有类的特征,最终影响整体精度。 - 模型初始化与训练配置:若MaxViT_T采用随机初始化而非预训练权重,医学图像与自然图像的特征分布差异会导致模型难以快速收敛。此外,学习率过高、优化器选择不当(如用SGD而非AdamW)、训练轮数不足(仅5个epoch),都可能导致模型未充分学习。
- 评价指标误导:类别不平衡场景下,精度(Accuracy)本身是无效指标——仅猜测占比最高的类别5就能获得约40%的精度,当前0.5左右的精度提升有限,无法反映模型对少数类的真实识别能力。
二、解决类别不平衡与提升精度的有效方法
1. 数据层面优化
- 混合过采样策略:采用SMOTE生成少数类合成样本,搭配ENN(Edited Nearest Neighbors)移除噪声样本,避免单纯复制带来的过拟合。注意仅在训练集上执行该操作,禁止泄露验证/测试集数据。
- 类别加权损失函数:在交叉熵损失中为少数类分配更高权重,权重计算方式为
总样本数 / (类别数 × 各类样本数),通过CrossEntropyLoss(weight=class_weights.to(device))实现。该方法无需修改数据集分布,能有效引导模型关注少数类。 - 针对性数据增强:对少数类样本应用更强的增强操作,如随机裁剪、翻转、亮度/对比度调整、CutMix/MixUp等,通过增加样本多样性提升模型对少数类特征的学习能力。
2. 模型与训练策略优化
- 预训练模型微调:使用ImageNet预训练的MaxViT_T权重初始化模型,先冻结底层特征提取层,仅微调顶层分类器;训练后期再逐步解冻部分底层层,利用通用图像特征快速适配医学图像任务。
- 调整训练配置:
- 改用AdamW优化器,设置较小的初始学习率(如1e-4),搭配CosineAnnealingLR学习率调度器,在训练后期降低学习率稳定收敛;
- 增加训练轮数至15-20个epoch,给模型足够时间学习少数类特征;
- 模型集成:训练多个采用不同初始化、采样策略的模型,通过投票集成降低模型方差,提升对少数类的识别稳定性。
3. 评价指标调整
- 放弃单一精度指标,重点关注宏F1-score(对所有类同等加权)、混淆矩阵(查看每个类的召回率/精确率)、AUC-ROC(评估每个类的二分类性能),这些指标能更准确反映模型在不平衡数据上的真实表现。
三、快速验证步骤
- 检查验证集的类别分布,确保每个类至少有10-20张样本,若部分类样本过少,可重新划分数据集或合并业务上相似的类别;
- 切换至类别加权交叉熵损失,搭配预训练MaxViT_T模型,训练10-20个epoch,观察宏F1-score的变化;
- 针对类别3、7等极小数类,在训练时强制应用2-3种数据增强操作,增加样本多样性。
内容的提问来源于stack exchange,提问作者Erdem Akca
相关产品推荐
相关产品推荐

