核心要点

  • 不平衡使模型偏向多数类,少数类召回低且被准确率掩盖

  • 数据层:过采样/SMOTE 文本变体、欠采样、回译与 EDA 数据增强

  • 算法层:class_weight 类权重、Focal Loss、代价敏感学习

  • 决策层:调整分类阈值,按业务平衡精确率与召回

  • 评估用 F1/宏平均/PR-AUC 而非 accuracy;长尾类用 few-shot/LLM 兜底

标准回答

类别不平衡时,损失被多数类主导,模型倾向于「全预测多数类」也能拿到高准确率,导致少数类召回崩塌。处理要从数据、算法、决策、评估四个层面协同。

数据层

  • 过采样:复制或用 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,并优先关注少数类的召回与精确率。

追问

追问 1SMOTE 是为表格数据设计的,文本场景如何借鉴其思想?

原始 SMOTE 在原始特征空间插值,对离散稀疏的文本不直接适用。文本场景的做法是:在稠密嵌入空间(如句向量)上对少数类样本做近邻插值生成新向量,或采用「文本版 SMOTE」思路——用回译、同义替换、LLM 改写等生成语义相近但表述不同的新样本,达到既扩充少数类又增加多样性的效果,避免简单复制带来的过拟合。

追问 2class_weight 和 Focal Loss 都能缓解不平衡,何时用哪个?

class_weight 按类频率整体加权,实现简单,适合不平衡来自类间数量差异、类内难易较均匀的情况。Focal Loss 在类权重之外还按样本难易动态降权易分样本,适合存在大量「简单多数类样本淹没难分样本」的场景(如目标检测式的极端不平衡)。两者可结合:用 alpha 项做类平衡、gamma 项聚焦难样本。先用 class_weight 打基线,若难分样本仍被淹没再上 Focal Loss。

追问 3为什么不平衡时要调整分类阈值,而不只调模型?

因为模型即便经过重采样/加权,其输出概率的最优决策阈值在不平衡下也未必是 0.5。阈值调整是在已训练模型上、按验证集 PR 曲线选取与业务目标(更看重召回还是精确率)匹配的切点,成本极低且不需重训。它与数据层、算法层方法正交,可叠加使用:先让模型输出校准良好的概率,再用阈值把概率映射到业务最优的决策边界。

🔗 相似问题

同一考点的不同问法,面试官可能换着问,一起刷更稳

没找到想看的面试题?把你想看的告诉我们 →

延伸学习

按主题分类的相关资源,便于系统复习