类间样本数量不平衡对分类模型性能的影响问题
我在做人脸检测试验的时候,发现了问题,别人的二分类器(判别是不是人脸)的阈值很高,大于90%点概率,而我的阈值要设置的很低10%点概率即认为是脸,经过观察,我的负样本数数量上比正样本数多的太多了,导致网络对负样本的判别有信心,对正样本判别能力微弱,猜测正负样本分布对阈值有影响,故上网找了这篇文章
这篇博文是作者的一个实验笔记,研究一个”飞机-背景“二分类器在不同样本比例下精度,召回率的规律。
1. 问题描述
固定正样本(飞机)2000个,改变负样本(背景)的训练数据量
1 : 0.5 、 1 : 1 、 1 : 2 、 1 : 5 、 1 : 10 、 1: 30.
随着负样本数量的增多,类间数据量不均衡的情况更为显著。
测试时,分别随机选取4096张飞机、背景样本(不出现在训练集),对在每一种数据比例上训练的模型进行测试。
飞机分类的精度提升,召回率降低;
背景分类的精度降低,召回率升高。
将这个问题归结为“类间样本数量不平衡对分类结果的影响”问题。
2. 思考
1.问题抽象
将探讨问题归结为”类间数据量(比例)不平衡对分类结果的影响”问题。
2.思考点:
2.1谁是引起这一变化的主因?
对于飞机分类,随着负样本增多,精度上升,召回率下降;
对于背景分类,精度下降,召回率上升。
谁是主因?谁是从因?
在这个实验中,飞机样本数据不变,是控制变量。负样本(背景)数据量逐渐增加,首先应该分析由于负样本增加而造成的精度、召回率变化;其次,要分析精度上升和召回率下降,哪一个变化是直接由负样本数据量最大引起的。
3.假设
3.1从模型训练的动力角度解释
当类间数据量相差较大时,模型倾向于将样本判别为数据量大的样本,即可获得较低的损失,没有动力继续优化参数。
极端的例子:训练样本中A类1个样本,B类100个样本,那么模型将样本判别为B类即可获得很低的损失值,从而失去继续训练优化的动力,网络性能弱。
分析实验结果的混淆矩阵:
airplane | background |
---|---|
4088 | 8 |
72 | 4024 |
airplane | background |
---|---|
4085 | 11 |
45 | 4051 |
airplane | background |
---|---|
4084 | 12 |
18 | 4078 |
airplane | background |
---|---|
4073 | 23 |
4 | 4092 |
airplane | background |
---|---|
4067 | 29 |
2 | 4094 |
airplane | background |
---|---|
4061 | 35 |
0 | 4096 |
从混淆矩阵来看:
随着负样本(背景)占比越来越大,模型将更多原属于飞机类的样本判别为背景【观察第一行】。
而越来越少的背景样本被划分到飞机类别。从而背景分类的召回率增高,精度下降。
3.2 数据量大的类别拟合的更好
一个直观的假设是:在类间数据量不平衡的训练过程中,模型对数据量多的类别的分布拟合的更好,导致对该类的分类性能更好。
这个假设基于:某类型数据量越多,对模型的参数修改的越多,模型越能刻画一类型的分布,从而更好分类。
这一假设有一些没有问题没有解释:
当背景样本数据量变大时,为什么是召回率上升?为什么只有召回率上升?
4 .一些启发
训练样本类间数据量的不平衡会引起分类性能的改变。具体到这一实验:数据量越大的类别,其召回率会更高,相应地会损失一些精度。
5. TODO LIST
5.1 自动平衡样本,观察是否改善分类性能
拷贝数据量少的类别的样本,使得两类的样本数目一致。观察自动平衡数据对分类结果是否有改进。
5.2 阅读“类间数据不平衡”相关文献
【深度学习结构化/非均衡数据集处理】《Practicing Guide on handling Structured & Imbalanced Datasets with Deep Learning》
https://www.analyticsvidhya.com/blog/2016/10/investigation-on-handling-structured-imbalanced-datasets-with-deep-learning/
Investigation on handling Structured & Imbalanced Datasets with Deep Learning
After extensive investigations, it does seem that Deep Learning has the
potential to do well in the area of structured data. We investigate
class imbalance as it is a challenging problem for anomaly detection. In
this report, Deep Multilayer Perceptron (MLP) was implemented using
Theano in Python and experiments were conducted to explore the effectiveness of hyper-parameters.
这在机器学习里面被称类别不平衡问题,可以参考Haibo, H. and E. A. Garcia (2009). "Learning from Imbalanced Data." Knowledge and Data Engineering, IEEE Transactions on" 的survey.已有很多方法提出
标准解决方法:设计objective function的时候给不同misclassification的情况不同的relative weights。也就是说给从小数量的样本被分成大数量的样本更大的penalty
训练数据与预测数据分布不一致,有专门研究的课题,sample selection bias,主要方法是各种reweighting
Learning Classifiers from Imbalanced, Only Positive and Unlabeled Data Sets
9 条精选讨论(选自165条原始评论和转发)
感觉都没扯到点子上啊,最经典的imbalanced的方法,cascade learning,详见viola的face detection paper.
在face recognition问题中,每个人的已注册样本一般都只有一张,在one-by-n的recognition时候,如果n较大,则一般positive pairs的数量会远远小于negative
pairs的数量。这种情况下,一般如何去balance用于训练的pos 和neg pairs? 有没有现成的code去处理类似问题? 比如做bootsrap等等。(具体可以参考google的FaceNet那篇文章选取训练样本的方法)
https://www.academia.edu/8472416/Tackling_Class_Imbalance_with_Deep_Convolutional_Neural_Networks
这个和深度学习没关系,类别不平衡是机器学习一个常见问题 ,有一下几个思路可以参考
1 :数据采样的时候,可以把数量少的类别重复采样,而把数量多的类别只采样一部分
2:调整损失函数,对样本多的类别进行惩罚
实际工程上,正负样本比或者惩罚系数,需要进行调参
“已注册样本一般都只有一张” 感觉是在说 “face identification /verification"(这两略有不同,我更喜欢混为一谈)
- identification /verification:这不是recognition,不需要去训练一个分类器 一个注册样本也是可以的,无非是注册的特征不够robust,效果可能差一些,并不存在所谓的“balance
pos neg pairs”(如果每一个注册的face都希望有一个特有的threshold的话 那是需要一部分pos
neg来计算这个threshold)
- recognition:问题就变为“如何提升unbalance数据集上的准确率”,这个问题的研究就比较多了 可以Google下;negative sample可以 生成、“伪造”的;softmax(one vs all)不需要negative sample;sigmoid(对于部分分类任务 如:多标签分类,其实蛮适合用sigmoid做神经网络的最终输出的)等大多数分类器 正负例 的样本均等为好;此外在语音识别中 神经网络的训练样本是极为不均衡的;在图像任务中 也可以考虑利用下 类别的先验概率
改变分布就有很多科学的方法了。
sample的话,比如MCMC。
还可以生造数据,嗯,就是很火的reinforce。
问题主要矛盾指不平衡数据处理 结论是分两种处理 算法修正和数据修正
然后是正文
数据不平衡是一个很正常的现象 在神经网络领域之外已经有很多相关研究了 尤其在svm上(笑)
机器学习算法中通常两种方法解决 一种是算法上的 用算法计算不同输入数据的距离 将距离纳入算法训练 或者说将距离纳入惩罚函数 有很多相关研究 手机打没文献 搜索imbalance会有很多 基于不平衡度和基于图是我知道的两种很好的算法
在深度学习上 不平衡的算法处理没有单独拿出来讲的 因为随着时代发展 这个被视为解决问题中很小的一环 更多的是处理transfer learning
深度迁移学习网络基本是深度网络中会涉及不平衡的最重要 或者说效果最好的一类 但是正如前文所说 不平衡的解决只是顺带的
迁移网络解决不平衡最好的例子是deep transfer metric learning,这篇文献类似考虑距离惩罚 并且将惩罚纳入了能量函数 在根据能量函数做梯度递减迭代时候发挥作用 类似的想法肯定可以解决 但是似乎有些不合适 毕竟transfer learning 解决的是更麻烦一点的问题
代码 很少 但是theano只改下update函数 caffe改一下能量函数式 训练依旧是反向传播 可以有预训练 不用改
前述麻烦 所以有数据采样方法解决数据不平衡
采样解决不平衡分欠采样和过采样两种
但是说在前面 数据采样上解决 实际是数据预处理的一步了 和深度不深度没关系 这部分代码很好写 因为只操作数据
欠采样就是有的数据不采用 过采样就是少数的信息重复采样或者差值拟合出新的少数类信 著名的是SMOTE算法
这些方法和信号采样那些很像 但是也有一些新的方法和些微不同 相关文献看得不多 临时想不到
具体用到的时候 看你问题定义了 不一定要用到这些东西 深度网络拟合能力很好 不平衡的丢过去很可能只有过拟合问题 而不需要特殊处理
文献资料什么的想不起来 但是搜索很好搜 百度就行 因为实验室前辈有做过imbalance data 我也跟过一段时间
数据不平衡是机器学习里面的常见的现象,通常是根据数据类别的分布对损失函数进行加权处理,即正负两类出现误判的惩罚是不同的,比如,样本量小的那一类惩罚会更大,或者也可以在迭代的时候增加样本小的那一类被选中来进行优化的概率,相当于将样本小的那一类的数据人为复制。