这一个可能会记录的有点乱。
1.数据不平衡
数据不平衡也可称作数据倾斜。在实际应用中,数据集的样本特别是分类问题上,不同标签的样本比例很可能是不均衡的。因此,如果直接使用算法训练进行分类,训练效果可能会很差(例如,某个标签的样本比较多,那么由于该样本数量多,评估方法或者损失函数的结果更倾向于该类标签)。
解决实际应用中数据不平衡问题可以从三个方面入手,分别是对数据进行处理、选择合适的评估方法和使用合适的算法。
2.数据不平衡的解决方法
(1)数据采样
采样方法是通过对训练集进行处理使其从不平衡的数据集变成平衡的数据集,在大部分情况下会对最终的结果带来提升。
采样分为上采样(Oversampling)和下采样(Undersampling),上采样是把小众类复制多份;下采样是从大众类中剔除一些样本,或者说从大众类中只选取部分样本。
随机采样(采样)最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分(即欠拟合)。
从数据的角度,对少数类别的数据进行过采样,或者对多数类别的数据进行欠采样,或者阈值调整,调到 较少类别 / (较多类别+较多类别)。
①上采样
上采样也叫过采样,是把小众类复制多份;上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;
②下采样
下采样也叫欠采样,是从大众类中剔除一些样本,或者说从大众类中只选取部分样本。下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分(即欠拟合)。
② 上采样【数据增强】
也叫过采样,直接简单复制重复的话,如果特征少,会导致过拟合的问题。经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本 (数据增强)。
(2)改变权重
对不同样本数量的类别赋予不同的权重(通常会设置为与样本量成反比,这个要根据评估算法、选用的模型来定)
(3)使用K-fold交叉验证
值得注意的是,使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
K-fold交叉验证就是把原始数据随机分成K个部分,在这K个部分中选择一个作为测试数据,剩余的K-1个作为训练数据。交叉验证的过程实际上是将实验重复做K次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均。
此外,还应注意训练集和测试集的样本的概率分布问题。若实际数据不平衡,将采样平衡后的数据集作为训练集训练后,模型应用在测试集上效果仍会不好。因此,实际应用中尽可能保持训练和测试的样本的概率分布是一致的。
(4)选择合适的评价指标
谨慎选择AUC作为评价指标:对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,一是可以了解不同算法对于数据的敏感程度,二是可以明确采取哪种评价指标更合适。针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少量样本的效果其实并不理想的情况。
不要只看Accuracy:Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。对于平衡的数据,一般采用accuracy。当类别不平衡时,accuracy意义不大。
数据不平衡时,常用:
- ROC,全名Receiver Operating Curve,计算该曲线下的面积即AUC作为评价指标。适用于类别相对平衡的情况。
- PRC,即Precision Recall Curve,计算该曲线下的面积作为评价指标。适用于类别不平衡的情况。
- Precision@n,将分类的阈值设置得恰好有n个正样本时的precision。
- Average Presision,描述precision的一般性能。
(5) 选择合适的算法
①、选择对数据倾斜相对不敏感的算法。如树模型等。
②、集成学习。即多模型Bagging。首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
③、转化成异常检测或者一分类问题。(说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。)这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。
(6) 对模型施加惩罚
可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。
(7)合成新数据
思路是对少数类别的样本进行分析,并根据少数类样本,人工合成新样本,增加到训练集中。
① ADASYN算法
思路是根据数据分布情况的不同,为不同的少数类样本生成不同数量的新样本。
算法流程:
- 1.记少数类别样本数量为 m{s},多数类别样本数量为 m{l},不平衡度 d = m{s} / m{l} ;
-2. 计算需要合成的样本数量G = (m{l}-m{s})* b ,b∈[0,1]为超参数,当b=1时合成后的训练集正负样本正好平衡。 - 3.对少数类别的每个样本i,取其k个最近邻居,Δ{i}为这 k 个邻居中属于多数类别的样本数目,记这 k 个样本中属于多数类别的比例
- 4.对于少数类别的每一个样本i,使用上一步计算得到的r{i},计算样本i附近的类别分布情况,即对r{i}进行归一化:
- 5.对于少数类别的每一个样本,计算需要合成的样本数目:
- 6.合成样本:对于少数类别的每个样本x{i},在其周围 k 个邻居中选择1个少数类别的样本x{zi},根据如下公式合成新样本x{new},重复合成直到满足第5步所要求的合成数目。
(8)有监督的数据增强
① 单样本数据增强
【机器学习】数据增强(Data Augmentation)
所谓单样本数据增强,即增强一个样本的时候,全部围绕着该样本本身进行操作,包括几何变换类,颜色变换类等。
几何变换类
几何变换类即对图像进行几何变换,包括翻转(水平翻转、垂直翻转、随机翻转),旋转,移位,裁剪,变形,缩放等各类操作。
翻转操作和旋转操作,对于那些对方向不敏感的任务,比如图像分类,都是很常见的操作(在caffe等框架中翻转对应的就是mirror操作)。
翻转和旋转不改变图像的大小,而裁剪会改变图像的大小。通常在训练的时候会采用随机裁剪的方法,在测试的时候选择裁剪中间部分或者不裁剪。值得注意的是,在一些竞赛中进行模型测试时,一般都是裁剪输入的多个版本然后将结果进行融合,对预测的改进效果非常明显。
以上操作都不会产生失真,而缩放变形则是失真的,即丢失信息。
颜色变换类
上面的几何变换类操作,没有改变图像本身的内容,它可能是选择了图像的一部分或者对像素进行了重分布。如果要改变图像本身的内容,就属于颜色变换类的数据增强了,常见的包括噪声、模糊、颜色变换、擦除、填充等等。
Ⅰ、基于噪声的数据增强
它就是在原来的图片的基础上,随机叠加一些噪声,最常见的做法就是高斯噪声。
合理性:当您的神经网络试图学习可能无用的高频特征(大量出现的模式)时,通常会发生过度拟合。具有零均值的高斯噪声基本上在所有频率中具有数据点,从而有效地扭曲高频特征。这也意味着较低频率的组件(通常是您的预期数据)也会失真,但你的神经网络可以学会超越它。添加适量的噪音可以增强学习能力。
更复杂一点的就是在面积大小可选定、位置随机的矩形区域上丢弃像素产生黑色矩形块,从而产生一些彩色噪声,以Coarse Dropout方法为代表,甚至还可以对图片上随机选取一块区域并擦除图像信息。
Ⅱ、颜色变换的另一个重要变换是颜色扰动
就是在某一个颜色空间通过增加或减少某些颜色分量,或者更改颜色通道的顺序。
几何变换类,颜色变换类的数据增强方法细致数来还有非常多,推荐给大家一个git项目:
https://github.com/aleju/imgaug
② 多样本数据增强
不同于单样本数据增强,多样本数据增强方法利用多个样本来产生新的样本。
SMOTE
SMOTE即Synthetic Minority Over-sampling Technique(合成少数过采样技术),它是通过人工合成新样本来处理样本不平衡问题,从而提升分类器性能。在python中,SMOTE算法已经封装到了imbalanced-learn库中。
背景:类不平衡现象指的是数据集中各类别数量不近似相等。如果样本类别之间相差很大,会影响分类器的分类效果。假设小样本数据数量极少,如仅占总体的1%,则即使小样本被错误地全部识别为大样本,在经验风险最小化策略下的分类器识别准确率仍能达到99%,但由于没有学习到小样本的特征,实际分类效果就会很差。
SMOTE方法是基于插值的方法(SMOTE通过在小样本类中的样本之间进行插值来生成新样本),它可以为小样本类合成新的样本,主要流程为:
- 第一步,定义好特征空间,将每个样本对应到特征空间中的某一点,根据样本不平衡比例确定好一个采样倍率N;
- 第二步,对每一个小样本类样本(x,y),按欧氏距离找出K个最近邻样本,从中随机选取一个样本点,假设选择的近邻点为(xn,yn)。在特征空间中样本点与最近邻样本点的连线段上随机选取一点作为新样本点,满足以下公式:
- 第三步,重复以上的步骤,直到大、小样本数量平衡。
SamplePairing
原理:从训练集中随机抽取两张图片分别经过基础数据增强操作(如随机翻转等)处理后经像素以取平均值的形式叠加合成一个新的样本,标签为原样本标签中的一种。
这两张图片甚至不限制为同一类别,这种方法对于医学图像比较有效。
实验结果表明,因SamplePairing数据增强操作可能引入不同标签的训练样本,导致在各数据集上使用SamplePairing训练的误差明显增加,而在验证集上误差则有较大幅度降低。
尽管SamplePairing思路简单,性能上提升效果可观,符合奥卡姆剃刀原理,但遗憾的是可解释性不强。
mixup
mixup是Facebook人工智能研究院和MIT在“Beyond Empirical Risk Minimization”中提出的基于邻域风险最小化原则的数据增强方法,它使用线性插值得到新样本数据。
令(xn,yn)是插值生成的新数据,(xi,yi)和(xj,yj)是训练集随机选取的两个数据,则数据生成方式如下: (λ的取指范围介于0到1。)
SMOTE,SamplePairing,mixup三者思路上有相同之处,都是试图将离散样本点连续化来拟合真实样本分布,不过所增加的样本点在特征空间中仍位于已知小样本点所围成的区域内。如果能够在给定范围之外适当插值,也许能实现更好的数据增强效果。
(9)无监督的数据增强
相对于有监督的数据增强方法,无监督的数据增强是更高级的方法。
无监督的数据增强方法包括两类:
- 通过模型学习数据的分布,随机生成与训练数据集分布一致的图片,代表方法GAN。
- 通过模型,学习出适合当前任务的数据增强方法,代表方法AutoAugment。
① GAN
它包含两个网络,一个是生成网络,一个是对抗网络,基本原理如下:
- (1) G是一个生成图片的网络,它接收随机的噪声z,通过噪声生成图片,记做G(z) 。
- (2) D是一个判别网络,判别一张图片是不是“真实的”,即判断图片是真实的还是由G生成的。
GAN训练好的生成器G能生成出以假乱真的图片。
② Conditional GANs
在没有进入非常非常细节的情况下,条件GAN可以将图像从一个域转换为图像到另一个域。
这就是这个神经网络的强大功能!以下是用于将夏季风景照片转换为冬季风景的条件GAN的示例。
使用CycleGAN改变季节:
上述方法是稳健的,但计算密集。更便宜的替代品将被称为神经风格转移(neural style transfer)。它抓取一个图像(又称“风格”)的纹理、氛围、外观,并将其与另一个图像的内容混合。 使用这种强大的技术,产生类似于条件GAN的效果(事实上,这种方法是在cGAN发明之前引入的!)。
③ Autoaugmentation
AutoAugment是Google提出的自动选择最优数据增强方案的研究,这是无监督数据增强的重要研究方向。
它的基本思路是使用增强学习从数据本身寻找最佳图像变换策略,对于不同的任务学习不同的增强方法,流程如下:
- 准备16个常用的数据增强操作。从16个中选择5个操作,随机产生使用该操作的概率和相应的幅度,将其称为一个sub-policy,一共产生5个sub-polices。
- 对训练过程中每一个batch的图片,随机采用5个sub-polices操作中的一种。
- 通过模型在验证集上的泛化能力来反馈,使用的优化方法是增强学习方法。
- 经过80~100个epoch后网络开始学习到有效的sub-policies。
- 之后串接这5个sub-policies,然后再进行最后的训练。
总的来说,就是学习已有数据增强的组合策略,对于门牌数字识别等任务,研究表明剪切和平移等几何变换能够获得最佳效果
3. 如何选择合适的策略- 如果正负样本都非常少,应使用数据生成的方法。
- 负样本足够多、正样本很少,应使用一分类方法。
- 正负样本都足够多、比例不是很悬殊,应使用采样或者加权的方法。
- 采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。
- 在数据增强过程中,有一个需要注意的问题:在使用增强技术时,我们必须确保不增加不相关的数据。