前言

在深度学习的一些场景下,经常会出现类别不平衡的情况。以二分类为例,正负样本比例为1:1的情况十分罕见;多数情况下都是1:N,N有时甚至超过10,甚至几十上百都有。在多次遇到这种问题后写了该博客进行总结。

方法

1、欠采样和过采样

欠采样是在多数类中进行部分采样,过采样是在少数类中重复采样。过采样和修改目标函数中正负项系数是等价的,但实际操作中效果一般不会相同。

2、数据增强

数据增强分图像和文本,这里分别提一下:

图像数据增强

(1) 镜像翻转、旋转、平移、缩放、颜色随机扰动、非线性几何变形等;
(2) GAN生成新样本;

文本数据增强

(1) SMOTE过采样方法 这虽然是一种过采样方法,但实际上生成了新的样本所以我把它放在数据增强范畴里。简单来说就是取了一正样本点,从它的k近邻里取一个新样本,两个点连线中间随机取一点作为新的正样本。这里放两个链接,一个是理论解释,一个是代码实现。 (2) K近邻单词替换 这里用到了word embedding工具,在序列模型中,每个单词都能映射成一个词向量。所以一个单词可以看做高维空间中一个样本点,这也就可以用K近邻来得到和它语义相近的单词了。这里放一个代码链接。

3、修改损失函数

交叉熵函数是深度学习任务中经常用的目标函数,但在类别不平衡场景下可以考虑进行修改。根据笔者的经验,有两种思路: (1) 如果你用的是keras,模型训练函数中是可以调整class_weight的,可以在class_weight中适当增大正样本的权重。比较忌讳把正样本权重增大到两者损失总量一样,这么设置从来没有一次效果是好的。笔者一般把正样本权重调到负样本权重的1.1~1.5倍,可以取得比之前要好的F1 score。 (2) Focal Loss是个值得考虑的目标函数,原文是:Focal Loss for Dense Object Detection。该损失函数在目标检测领域取得了良好的处理类别不平衡效果和改善误分类的效果,笔者在文本分类的任务中用了该目标函数,也能取得较大提升。