深度学习_如何解决数据样本不均衡问题

时间:2024-03-26 08:13:12

一.数据不均衡

在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。

举个????,在大部分微博博文的互动数(被转发、评论与点赞数量)在0-10之间,交互数多的微博(多于50)非常少。如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为0-10档就能获得非常高的准确率,但是这样的预测器没有任何价值。这就是所谓的样本不均衡问题(Class Imblance),也叫数据偏斜(Class Skew)。
我们再举一些例子:

  1. 欺诈预测(欺诈的数量远远小于真实交易的数量)
  2. 自然灾害预测(不好的事情远远小于好的事情)
  3. 在图像分类中识别恶性肿瘤(训练样本中含有肿瘤的图像远比没有肿瘤的图像少)

严格来说,任何数据集上都有数据不均衡现象,这往往由问题本身决定的,但是我们只关注那些分布差别比较悬殊的。另外,虽然很对数据都包含多个类别,但是这里着重考虑二分类,因为解决了二分类中的数据不均衡问题后,就可以推广到多分类情况下的方法论。

不均衡程度相同(即正负样本比例类似)的两个问题,解决的难易程度也可能不同,因为问题难易还取决于我们所拥有数据集的大小。比如在预测微博互动数的问题中,虽然数据不均衡,但每个档位的数据量都很大:最少的类别也有几万个样本,这样的问题通常比较容易解决。而在癌症诊断的场景中,因为患癌症的人本来就很少,所以数据不但不均衡,样本数还非常少,这样的问题就非常棘手。综上,可以把问题根据难度从小到大排个序大数据+分布均衡<大数据 + 分布不均衡 < 小数据 + 数据均衡 < 小数据 + 数据不均衡

所以,分析的步骤如下:

  1. 首先对于需要解决的问题,拿到数据后,先统计可以直接用于训练的数据集有多大。
  2. 然后再观察数据分布情况。

经验表明:训练数据集中每个类别有5000个以上样本,说明数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不均衡问题。

二.数据不均衡问题解决方案

首先,可能这个数据集没有代表现实,我们可以重新收集更具代表性的数据集,如果只能用这个数据集,我们要进行相应的处理。
解决这一问题的基本思路就是让正负样本在训练过程中拥有相同的话语权,比如利用采样与加权等方法。为了方便介绍,我们把数据集中样本较多的那一类称为“大众类”,而把样本较少的那一类称为“小众类”。

1.采样

采样方法是通过对训练集进行处理使其从不均衡的数据集变成均衡的数据集,在大部分情况下会对最终的结果带来提升。

采样分为过采样(Oversampling)和欠采样(Undersampling),过采样是把小众类复制多份,欠采样是从大众类中删除一些样本,或者说是从大众类中选取部分样本。

随机采样最大的优点是简单,但缺点也很明显:过采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而欠采样则丢失了数据,模型只学到了总体模式的一部分。

过采样会把小众样本复制多份,一个点会在高维空间反复出现,这会导致一个问题:运气好就能分对多一点,否则分错就会多一点。为了解决这个问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种方法非常有效。

因为欠采样会丢失信息,如何减少信息的损失呢?第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次欠采样(回放采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。第二种方法叫做BalanceCascade,利用增量训练思想(Boosting):先通过一次欠采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本欠采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss,这类方法的计算量很大。

总结:上述两种方法更适合大数据分布不均衡的情况,尤其是过采样方法应用更加广泛。

2.数据合成

数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下哟很多成功的案例,比如医学图像分析等等。

其中最常见的一种方法叫做SMOTE(Synthetic Minority Over-Sampling Technique)算法(过采样小样本),它利用小众样本在特征空间的相似性来生成新样本。该技术要求我们用合成方法得到不平衡类别的观测,该技术与现有的使用最近邻分类方法很类似。问题在于当一个类别的观测数量极度稀少时该怎么做。比如说我们想用图片分类问题确定一个稀有物种,但我们可能只有衣服这个稀有物种的图片。

3.加权

除了采样和生成新数据等方法,我们还可以通过加权的方式来解决数据不均衡问题,即对不同类别分错的代价不同,如下图所示:

深度学习_如何解决数据样本不均衡问题

横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。这种方法的难点在设置合理的权重,实际应用中一般让各个分类间的加权损失值近似相等。当然这并不是通用法则,还需要具体问题具体分析。

4.一分类

对于正负样本极不均衡的场景,我们可以换一个完全不同的角度来看待问题:把它看作一分类(One Class Learning)或者异常检测(Novelty Detection)问题。这类方法的重点不是捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-Class SVM等。

三.如何选择方法

在正负样本都非常少的情况下,应该采用数据合成的方法。在负样本足够多,正样本非常少且比例极其悬殊的情况下,应该考虑一分类的方法。在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。

采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。

另外,虽然上采样和下采样都可以使数据集变得平衡,并且数据足够多的情况下等价,但两者也有区别。实际应用中,如果是计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。

四.相关论文

Learning from Imbalanced Data