炼丹笔记一:样本不平衡问题

炼丹笔记一:样本不平衡问题

欢迎大家关注微信公众号:baihuaML白话机器学习

码字不易,如转载请私信我!!

在这里,我们一起分享AI的故事。

您可以在后台留言,关于机器学习、深度学习的问题,我们会选择其中的优质问题进行回答!

大家好,今天给大家带来的分享是关于“深度学习中的样本不平衡问题”。

深度学习算法工程师,也被戏称为“炼丹师”,而样本,就是所谓的药材。最后训练出来的模型,就是丹药。当然,药材成色好,年分足,自然更容易炼出好的丹药。难得是,在药材劣质的情况下,如何也能够保证得到一炉仙丹呢?这个就要看丹师的药材配方和炼丹技术了。

今天,我们给大家介绍的样本不平衡问题,就是为了帮助丹师们解决药材不好的难题,进而来提高炼丹技术。


1. 什么是样本不平衡问题?

所谓的类别不平衡问题指的是数据集中各个类别的样本数量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下把样本类别比例超过4:1(也有说3:1)的数据就可以称为不平衡数据。
样本不平衡实际上是一种非常常见的现象。比如:在欺诈交易检测,欺诈交易的订单应该是占总交易数量极少部分;工厂中产品质量检测问题,合格产品的数量应该是远大于不合格产品的;信用卡的征信问题中往往就是正样本居多。

2. 样本不平衡会对我们模型的训练带来哪些影响呢?

简单来讲,样本不平衡会使得我们的分类模型存在很严重的偏向性,但是从一些常用的指标上又无法看出来。举一个极端一点的例子,如果正负样本比例为100:1,那岂不是把全部样本都判定为正样本就有99%+的分类准确率了。从测试结果上来看,就表现为有太多的False Positive。
在来看一个“恐怖”的例子,直观的感受一下样本不平衡问题:

你根据1000个正样本和1000个负样本正确训练出了一个准确率90%召回率90%的分类器,且通过实验验证没有欠采样过采样的问题哦~完美的样本,完美的模型,破费,你心里暗自得意。然后模型上线,正式预测每天的未知样本~。
开始一切都很美好,准确率召回率都很好。直到有一天,数据发生了一点变化,还是原来的数据类型和特征,只是每天新数据中正负样本变成了100个正样本,10000个负样本。注意,先前准确率90%的另一种表达是负样本有10%的概率被误检为正样本。好了,模型不变,现在误检的负样本数是10000*0.1=1000个,正样本被检出100*0.9(召回)=90个,好了,这个时候召回率不变仍为90%,但是新的准确率=90/(1000+90)=8.26% 。震惊吗!?恐怖吗!?
结论: 同一个模型仅仅是改变了验证集的正负样本比例,模型已经从可用退化成不可用了!!样本不平衡问题可怕就可怕在这,往往你的模型参数,训练,数据,特征都是对的!能做的都做了,但你的准确率就是上不去!!绝望吧。。。。。。

—————摘自《解决样本不平衡问题的奇技淫巧 汇总》 作者: songhk0209
3. 在机器学习中解决样本不平衡问题有哪些通用的解决策略?

在机器学习中,处理样本不平衡问题,主要有2中策略:从数据角度和从算法层面。
从数据角度出发,通常的方法包括了:

  • 扩大数据集
    • 当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。
  • 数据集重采样
    • 可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。
    • 对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
    • 对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。
      • 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
      • 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
      • 考虑尝试随机采样与非随机采样两种采样方法;
      • 考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
      • 考虑同时使用过采样与欠采样。
  • 人工产生数据样本
    • 一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。
    • 有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。 这里有SMOTE算法的多个不同语言的实现版本:
      • Python: UnbalancedDataset模块提供了SMOTE算法的多种不同实现版本,以及多种重采样算法。
      • R: DMwR package。
      • Weka: SMOTE supervised filter。
  • 基于异常检测的方式
    • 我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。
    • 异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。
    • 变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。
    • 将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。

从算法角度出发,通常的方法包括了:

  • 尝试不同的分类算法
    • 强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。
    • 决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。
  • 对小类错分进行加权惩罚
    • 对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。
    • 对小样本进行过采样(例如含L倍的重复数据),其实在计算小样本错分cost functions时会累加L倍的惩罚分数。
  • 从重构分类器的角度出发
    • 仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如:
      • 将你的大类压缩成小类;
      • 使用One Class分类器(将小类作为异常点);
      • 使用集成方式,训练多个分类器,然后联合这些分类器进行分类;
      • 将二分类问题改成多分类问题



参考:blog.csdn.net/heyongluo, 作者:一只鸟的天空


4. 在深度学习中,有哪些解决样本不平衡的方法?

深度学习同样属于机器学习中的一种典型方法,所以在机器学习中适用的方法在深度学习中同样适用。比如说:扩大数据集、类别均衡采样、人工产生数据样本,添加少类别样本的来loss惩罚项等。

对于数据的方法,这里我们重点介绍:类别均衡采样
把样本按类别分组,每个类别生成一个样本列表,训练过程中先随机选择1个或几个类别,然后从各个类别所对应的样本列表里选择随机样本。这样可以保证每个类别参与训练的机会比较均等。
上述方法需要对于样本类别较多任务首先定义与类别相等数量的列表,对于海量类别任务如ImageNet数据集等此举极其繁琐。海康威视研究院提出类别重组的平衡方法。
类别重组法只需要原始图像列表即可完成同样的均匀采样任务,步骤如下:
1. 首先按照类别顺序对原始样本进行排序,之后计算每个类别的样本数目,并记录样本最多那个类的样本数目。之后,根据这个最多样本数对每类样本产生一个随机排列的列表, 然后用此列表中的随机数对各自类别的样本数取余,得到对应的索引值。接着,根据索引从该类的图像中提取图像,生成该类的图像随机列表。之后将所有类的随机列表连在一起随机打乱次序,即可得到最终的图像列表,可以发现最终列表中每类样本数目均等。根据此列表训练模型,在训练时列表遍历完毕,则重头再做一遍上述操作即可进行第二轮训练,如此往复。 类别重组法的优点在于,只需要原始图像列表,且所有操作均在内存中在线完成,易于实现。



从图像和文本数据的角度出发,我们来看一下有哪些方法?


对于图像数据,解决样本不平衡问题,在深度学习中会用到的方法包括了:类别均衡采样(上已经描述),可以用来解决分类问题。
另外,在笔者看来还值得介绍的方法包括了:OHEM和focal loss。

  • OHEM

    OHEM(online hard example miniing)算法的核心思想是根据输入样本的损失进行筛选,筛选出hard example,表示对分类和检测影响较大的样本,然后将筛选得到的这些样本应用在随机梯度下降中训练。在实际操作中是将原来的一个ROI Network扩充为两个ROI Network,这两个ROI Network共享参数。其中前面一个ROI Network只有前向操作,主要用于计算损失;后面一个ROI Network包括前向和后向操作,以hard example作为输入,计算损失并回传梯度。作者将该算法应用在Fast RCNN中,网络结构还是采用VGG16和VGG_CNN_M_1024,数据集主要采用VOC2007,VOC2012和COCO数据集。
    算法优点:1、对于数据的类别不平衡问题不需要采用设置正负样本比例的方式来解决,这种在线选择方式针对性更强。2、随着数据集的增大,算法的提升更加明显(作者是通过在COCO数据集上做实验和VOC数据集做对比,因为前者的数据集更大,而且提升更明显,所以有这个结论)。

    算法的测试结果:在pascal VOC2007上的mAP为78.9%,在pascal VOC2012上的mAP为76.3%。注意,这些结果的得到包含了一些小tricks,比如multi-scale test(测试时候采用多尺度输入),bounding box的不断迭代回归。

    代码的github地址:github.com/abhi2610/ohe
  • Focal Loss
    Focal loss主要是为了解决one-stage目标检测中正负样本比例严重失衡的问题。主旨是:ssd按照ohem选出了loss较大的,但忽略了那些loss较小的easy的负样本,虽然这些easy负样本loss很小,但数量多,加起来的loss较大,对最终loss有一定贡献。作者想把这些loss较小的也融入到loss计算中。但如果直接计算所有的loss,loss会被那些easy的负样本主导,因为数量太多,加起来的loss就大了。也就是说,作者是想融入一些easy example,希望他们能有助于训练,但又不希望他们主导loss。这个时候就用了公式进行衰减那些easy example,让他们对loss做贡献,但又不至于主导loss,并且通过balanced crossentropy平衡类别。

    OHEM是只取3:1的负样本去计算loss,之外的负样本权重置零,而focal loss取了所有负样本,根据难度给了不同的权重。
    focal loss相比OHEM的提升点在于,3:1的比例比较粗暴,那些有些难度的负样本可能游离于3:1之外。之前实验中曾经调整过OHEM这个比例,发现是有好处的,现在可以试试focal loss了。


    对于文本数据而言,怎样解决样本不平衡问题?

    这里推荐阅读知乎相关问题(我就不胡扯了~~~手动捂脸):严重数据倾斜文本分类,比如正反比1:20~100,适合什么model,查准一般要做到多少可以上线?
    比如新闻的广告色情低俗识别,这些小类别在实际分布中一定是占比极小1:20甚至不到百分之一。传统的词表权重组合规则,只能预防一小部分(召回会非常低,但是准确率不会特别低)。而模型如果训练时候用1:1配平(个人觉得不能超过1:3,也做过大量实验),即使使用了加权惩罚,或者类似smote或者组合的上下采样方法,模型在1:1测试时即使达到90%的查准,放到1:20的环境查准也会大幅度降低到30%(试过xgboost,libsvm,libliner,fasttext等,近乎线性成比例降低,cnn目前效果和前面类似,加了earlystop,dropout最合适的还是原始论文参数)。
    像这种正反比严重数据倾斜的分类识别问题,有没有更合适的方法呢?还是我忽略了哪些地方?

    链接地址: zhihu.com/question/5923


    推荐阅读:【小夕精选】如何优雅而时髦的解决不均衡分类问题
    在文本分类任务中,有哪些论文中很少提及却对性能有重要影响的tricks?


    5. 从模型评价指标的角度,重新审视训练好的模型性能。

    从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。这里推荐指标:
  • 混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
  • 精确度(Precision)
  • 召回率(Recall)
  • F1得分(F1 Score):精确度与找召回率的加权平均。
  • Kappa (Cohen kappa)
  • ROC曲线(ROC Curves):见Assessing and Comparing Classifier Performance with ROC Curves

欢迎加入深度学习、机器学习技术研讨群!

745224003

欢迎关注我们的微信公众号:baihuaML,白话机器学习

关注知乎“会写代码的好厨师”



参考文献
[1] mp.weixin.qq.com/s?
[2] blog.csdn.net/heyongluo
[3] blog.csdn.net/u01438016
[4] cnblogs.com/ymjyqsx/p/9
[5] blog.csdn.net/siyue0211
[6] blog.csdn.net/songhk020
[7] zhihu.com/question/2653
发布于 2019-02-16

文章被以下专栏收录

    主要介绍机器学习中涉及到各种疑惑问题,希望能够介绍更多的干货,一方面带大家入门,另一方面让大家少踩坑