处理深度学习中数据集不平衡问题方法汇总

一. 数据集不平衡带来的问题:

        在一个分类问题中,如果在所有你想要预测的类别里有一个或者多个类别的样本量非常少,那你的数据也许就面临不平衡类别的问题。如:

1.欺诈预测(欺诈的数量远远小于真实交易的数量)

2.自然灾害预测(不好的事情远远小于好的事情)

3.在图像分类中识别恶性肿瘤(训练样本中含有肿瘤的图像远比没有肿瘤的图像少)

用不平衡的数据训练出来的模型一定会导致样本少的种类预测性能很差,甚至无法预测。但请注意,用不平衡的数据训练出来的模型纵使有以上问题,但是一般情况下往往会得到最高的准确率AP(因为大多数的准确率来自于包含了大量样本的类别中,交叉熵的损失即使是在不均衡的数据的时候,也是趋向于得到最高的准确率)。

       所以我们目的是得到最高的准确率的话,情况下,做数据均衡并没什么意义。但是若少数样本的种类如欺诈检测,肿瘤检测等问题来讲,意义重大且必要。

二. 处理不平衡的方法

处理不平衡的方法总的来说可以分为两大类:1. 数据增强,2.损失函数权值均衡

1. 数据增强

kaggle比赛中有这么一个案例:

问题 - 我们在 kaggle 网站上选择「座头鲸识别挑战」,我们期望解决不平衡类别的挑战(理想情况下,所分类的鲸鱼数量少于未分类的鲸类,并且也有少数罕见鲸类我们有的图像数量更少。)

来自 kaggle :「在这场比赛中,你面临着建立一个算法来识别图像中的鲸鱼种类的挑战。您将分析 Happy Whale 数据库中的超过25,000张图像,这些数据来自研究机构和公共贡献者。 通过您的贡献,将会帮助打开有关全球海洋哺乳动物种群动态丰富的理解领域。」

处理深度学习中数据集不平衡问题方法汇总

上面的图表表明,在4251个训练图片中,有超过2000个类别中只有一张图片。还有一些类中有2-5个图片。现在,这是一个严重的不平衡类问题。我们不能指望用每个类别的一张图片对深度学习模型进行训练(虽然有些算法可能正是用来做这个的,例如 one-shot 分类问题,但我们现在忽略先这一点)。

一个可行的思路是做数据增强

如:

1. 旋转缩放(旋转貌似不太适合,毕竟每张图片都是上天下海)

2.RGB单通道提取变为R,G,B三张图,

3.高斯模糊等

这样即使一幅图像也可以得到多幅图像。

此外,也可以对少数样本种类做过采样,多样本种类做签采样,以及做一些人工数据合成。

2. 权值均衡

权值均衡是在训练样本的时候,在计算loss的时候,通过权值来均衡数据的分布。正常情况下,每个类别在损失函数中的权值是1.0。但是有时候,当某些类别特别重要的时候,我们需要给该类别的训练样本更大权值。可以直接给对应的类别的样本的loss乘上一个因子来设定权值。在Keras中,我们可以这样:

import keras
class_weight = {"Target": 0.75,
               "Background": 0.25}
model.fit(X_train, Y_train, epochs=10, batch_size=32, class_weight=class_weight)

 Target是我们关心的分类,当然0.75和0.25这两个数字可以修改,直到找到最佳的设置为止。

另外,可以用来做训练样本的权值均衡的是Focal loss。如下所示,主要思想是这样:在数据集里,很自然的有些样本是很容易分类的,而有些是比较难分类的。在训练过程中,这些容易分类的样本的准确率可以达到99%,而那些难分类的样本的准确率则很差。问题就在于,那些容易分类的样本仍然在贡献着loss,那我们为什么要给所有的样本同样的权值?

处理深度学习中数据集不平衡问题方法汇总

这正是Focal loss要解决的问题。focal loss减小了正确分类的样本的权值,而不是给所有的样本同样的权值。这和给与训练样本更多的难分类样本时一样的效果。看到这里读者可能会问,这与少样本的种类不平衡问题有啥关系?

实际中,当我们有数据不均衡的情况时,我们的多数的类别很快的会训练的很好,分类准确率很高。此时多样本的类别的Pt率先达到well-classified级别(对应上图的0.6-1之间),而少样本的种类的Pt仍然停留在0.6一下,此时使用focal loss可以给少数类别的样本更高的权值。

三、总结

处理不平衡的两大类方法:

一、数据集方法:1.数据增强,2.过采样和欠采样, 3. 人工数据合成

二、损失函数的权值均衡:1.不同类别的loss 权值不一样,最佳参数需要手动调节  2.focal loss