机器学习--长尾分布
长尾分布(Long-Tail Distribution) 是指数据集中少数类别(头部)占据大量样本,而多数类别(尾部)只有极少样本的现象。这种分布广泛存在于现实场景(如推荐系统、图像分类、自然语言处理等),对模型训练和评估带来显著挑战。
特点
头部类别(Head Classes)
- 数量少但样本占比极高(如20%的类别覆盖80%的数据)。
- 模型容易过拟合这些类别,导致对尾部类别表现差。
尾部类别(Tail Classes)
- 数量多但样本极少(如每个类别仅几个样本)。
- 因数据不足,模型难以学习有效特征,导致欠拟合。
常见场景
- 图像分类:大规模数据集(如ImageNet)中稀有物体类别。
- 推荐系统:热门商品点击量巨大,冷门商品极少被交互。
- 自然语言处理:高频词汇vs.低频长尾词汇。
- 异常检测:异常样本通常远少于正常样本。
解决长尾分布的方法
1. 数据层面
重采样(Re-sampling)
- 过采样(Oversampling):对尾部类别重复样本或生成新样本(如SMOTE、GANs)。
- 欠采样(Undersampling):减少头部类别的样本,可能丢失信息。
- 混合采样:结合过采样和欠采样。
数据增强(Data Augmentation)
- 对尾部类别使用增强技术(如旋转、裁剪、Mixup、CutMix)生成多样化样本。
代码:
1 | from torch.utils.data import WeightedRandomSampler, Dataset |
1 | from imblearn.over_sampling import SMOTE |
2. 损失函数设计
- 类别加权损失(Class-Weighted Loss)
- 为不同类别分配权重(如逆类别频率),使模型更关注尾部类别。
- 例如:
weight = 1 / sqrt(class_count)
。
代码:
1 | import torch |
- 焦点损失(Focal Loss)
- 降低易分类样本(通常是头部类别)的损失权重,聚焦难样本(尾部)。
- 公式:
FL(p_t) = -α_t (1 - p_t)^γ log(p_t)
,其中γ调节难易样本权重。
1 | class FocalLoss(nn.Module): |
- 解耦训练(Decoupling)
- 先学习特征表示(均匀采样),再调整分类器(重采样或重加权)。
1 | # 第一阶段:均匀采样学习特征 |
3. 模型结构改进
- 解耦框架(Decoupling Framework)
- 如Decoupling(NeurIPS 2019)分离特征学习和分类器调整。
- 两阶段训练
- 第一阶段:正常训练;第二阶段:冻结骨干网络,微调分类器(使用重采样或加权)。
- 专家混合(Mixture of Experts, MoE)
- 为不同类别分配专用子模型(专家)。
4. 迁移学习 & 自监督学习
- 预训练 + 微调:在大规模平衡数据上预训练,再在长尾数据上微调。
- 自监督学习:通过对比学习(如SimCLR)学习通用特征,减少对标签的依赖。
5. 评估指标优化
- 避免单一准确率(Accuracy),采用更全面的指标:
- 宏平均(Macro-F1):各类别F1的均值,平等对待所有类别。
1 | from sklearn.metrics import f1_score |
- 平衡准确率(Balanced Accuracy):各类别召回率的均值。
- AUC-ROC:衡量模型在不同阈值下的整体性能。
经典论文与模型
- Decoupling(NeurIPS 2019):解耦表示学习和分类器调整。
- BBN(CVPR 2020):双分支网络平衡重采样和原始分布。
- Logit Adjustment(ICML 2020):通过调整logit偏移解决类别不平衡。
- Balanced Softmax(NeurIPS 2020):修改Softmax适应长尾分布。
方向
- 过拟合与泛化:尾部数据不足易导致过拟合,需更好的正则化或小样本学习技术。
- 动态长尾分布:现实世界中类别分布可能随时间变化(如热门商品更替)。
- 无监督长尾学习:探索自监督或半监督方法减少对标签的依赖。
示例
1 | import torchvision |
Epoch 0: loss = 1.9016
Epoch 1: loss = 1.7739
Epoch 2: loss = 1.4057
Epoch 3: loss = 1.8090
Epoch 4: loss = 1.6333
Epoch 5: loss = 1.5193
Epoch 6: loss = 0.8202
Epoch 7: loss = 0.5897
Epoch 8: loss = 0.7408
Epoch 9: loss = 1.2246
- Title: 机器学习--长尾分布
- Author: 姜智浩
- Created at : 2025-05-26 11:45:14
- Updated at : 2025-05-26 19:44:22
- Link: https://super-213.github.io/zhihaojiang.github.io/2025/05/26/20250526机器学习--长尾分布/
- License: This work is licensed under CC BY-NC-SA 4.0.