标准回答
类别不平衡时,损失被多数类主导,模型倾向于「全预测多数类」也能拿到高准确率,导致少数类召回崩塌。处理要从数据、算法、决策、评估四个层面协同。
数据层
- 过采样:复制或用 SMOTE 的文本变体(在嵌入空间插值或同义改写)扩充少数类,注意避免过拟合到重复样本。
- 欠采样:对多数类下采样,平衡分布但可能丢信息,常与集成结合。
- 数据增强:用回译、EDA(同义替换/随机插入删除交换)、LLM 改写为少数类生成多样化样本,比简单复制更有效。
算法层
- 类权重 class_weight:按类频率倒数加权损失,让少数类误分代价更高。
- Focal Loss:降低易分多数类样本的权重,聚焦难分与少数类样本。
- 代价敏感学习:显式设定不同类别的误分代价矩阵,贴合业务损失。
决策层
- 阈值调整:不平衡下 0.5 默认阈值常不最优,按验证集 PR 曲线选阈值,在精确率与召回间按业务取舍。
- 集成:如 EasyEnsemble/BalancedBagging,多次欠采样多数类训练子模型再集成,兼顾平衡与信息利用。
评估层
- 用 F1、宏平均(macro-F1)、PR-AUC 衡量少数类表现,绝不能只看 accuracy。
- 必要时做分层抽样保证各类在训练/验证中都有代表;对极少样本的长尾类,用 few-shot 或 LLM 兜底 直接分类,弥补监督数据不足。
实践常用「回译/EDA 增强 + class_weight 或 Focal Loss + 阈值调优 + macro-F1 评估」组合,长尾类再叠加 LLM 兜底。
常见误区
⚠️ 常见踩坑
用 accuracy 评估不平衡任务。当少数类占比 1% 时,全预测多数类也有 99% 准确率却毫无价值;必须改用 F1、macro 平均或 PR-AUC,并优先关注少数类的召回与精确率。
追问
追问 1:SMOTE 是为表格数据设计的,文本场景如何借鉴其思想?
原始 SMOTE 在原始特征空间插值,对离散稀疏的文本不直接适用。文本场景的做法是:在稠密嵌入空间(如句向量)上对少数类样本做近邻插值生成新向量,或采用「文本版 SMOTE」思路——用回译、同义替换、LLM 改写等生成语义相近但表述不同的新样本,达到既扩充少数类又增加多样性的效果,避免简单复制带来的过拟合。
追问 2:class_weight 和 Focal Loss 都能缓解不平衡,何时用哪个?
追问 3:为什么不平衡时要调整分类阈值,而不只调模型?
因为模型即便经过重采样/加权,其输出概率的最优决策阈值在不平衡下也未必是 0.5。阈值调整是在已训练模型上、按验证集 PR 曲线选取与业务目标(更看重召回还是精确率)匹配的切点,成本极低且不需重训。它与数据层、算法层方法正交,可叠加使用:先让模型输出校准良好的概率,再用阈值把概率映射到业务最优的决策边界。
🔗 相似问题
同一考点的不同问法,面试官可能换着问,一起刷更稳
没找到想看的面试题?把你想看的告诉我们 →
延伸学习
按主题分类的相关资源,便于系统复习