我在作人脸检测试验的时候,发现了问题,别人的二分类器(判别是否是人脸)的阈值很高,大于90%点几率,而个人阈值要设置的很低10%点几率即认为是脸,通过观察,个人负样本数数量上比正样本数多的太多了,致使网络对负样本的判别有信心,对正样本判别能力微弱,猜想正负样本分布对阈值有影响,故上网找了这篇文章html
这篇博文是做者的一个实验笔记,研究一个”飞机-背景“二分类器在不一样样本比例下精度,召回率的规律。算法
固定正样本(飞机)2000个,改变负样本(背景)的训练数据量
1 : 0.5 、 1 : 1 、 1 : 2 、 1 : 5 、 1 : 10 、 1: 30.
随着负样本数量的增多,类间数据量不均衡的状况更为显著。
测试时,分别随机选取4096张飞机、背景样本(不出如今训练集),对在每一种数据比例上训练的模型进行测试。安全
飞机分类的精度提高,召回率下降;
背景分类的精度下降,召回率升高。markdown
将这个问题归结为“类间样本数量不平衡对分类结果的影响”问题。
网络
将探讨问题归结为”类间数据量(比例)不平衡对分类结果的影响”问题。
2.思考点:dom
对于飞机分类,随着负样本增多,精度上升,召回率降低;
对于背景分类,精度降低,召回率上升。
谁是主因?谁是从因?
在这个实验中,飞机样本数据不变,是控制变量。负样本(背景)数据量逐渐增长,首先应该分析因为负样本增长而形成的精度、召回率变化;其次,要分析精度上升和召回率降低,哪个变化是直接由负样本数据量最大引发的。机器学习
当类间数据量相差较大时,模型倾向于将样本判别为数据量大的样本,便可得到较低的损失,没有动力继续优化参数。
极端的例子:训练样本中A类1个样本,B类100个样本,那么模型将样本判别为B类便可得到很低的损失值,从而失去继续训练优化的动力,网络性能弱。
分析实验结果的混淆矩阵:ide
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 |
从混淆矩阵来看:
函数
随着负样本(背景)占比愈来愈大,模型将更多原属于飞机类的样本判别为背景【观察第一行】。
而愈来愈少的背景样本被划分到飞机类别。从而背景分类的召回率增高,精度降低。post
一个直观的假设是:在类间数据量不平衡的训练过程当中,模型对数据量多的类别的分布拟合的更好,致使对该类的分类性能更好。
这个假设基于:某类型数据量越多,对模型的参数修改的越多,模型越能刻画一类型的分布,从而更好分类。
这一假设有一些没有问题没有解释:
当背景样本数据量变大时,为何是召回率上升?为何只有召回率上升?
训练样本类间数据量的不平衡会引发分类性能的改变。具体到这一实验:数据量越大的类别,其召回率会更高,相应地会损失一些精度。
拷贝数据量少的类别的样本,使得两类的样本数目一致。观察自动平衡数据对分类结果是否有改进。
【深度学习结构化/非均衡数据集处理】《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
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那篇文章选取训练样本的方法)
数据不平衡是机器学习里面的常见的现象,一般是根据数据类别的分布对损失函数进行加权处理,即正负两类出现误判的惩罚是不一样的,好比,样本量小的那一类惩罚会更大,或者也能够在迭代的时候增长样本小的那一类被选中来进行优化的几率,至关于将样本小的那一类的数据人为复制。