类间样本数量不平衡对分类模型性能的影响问题

我在作人脸检测试验的时候,发现了问题,别人的二分类器(判别是否是人脸)的阈值很高,大于90%点几率,而个人阈值要设置的很低10%点几率即认为是脸,通过观察,个人负样本数数量上比正样本数多的太多了,致使网络对负样本的判别有信心,对正样本判别能力微弱,猜想正负样本分布对阈值有影响,故上网找了这篇文章html

这篇博文是做者的一个实验笔记,研究一个”飞机-背景“二分类器在不一样样本比例下精度,召回率的规律。算法

1. 问题描述

  固定正样本(飞机)2000个,改变负样本(背景)的训练数据量
1 : 0.5 、 1 : 1 、 1 : 2 、 1 : 5 、 1 : 10 、 1: 30.
随着负样本数量的增多,类间数据量不均衡的状况更为显著。
  测试时,分别随机选取4096张飞机、背景样本(不出如今训练集),对在每一种数据比例上训练的模型进行测试。
安全

飞机分类的精度提高,召回率下降;
背景分类的精度下降,召回率升高。
markdown

  将这个问题归结为“类间样本数量不平衡对分类结果的影响”问题。
  这里写图片描述
网络

  这里写图片描述

2. 思考

1.问题抽象

  将探讨问题归结为”类间数据量(比例)不平衡对分类结果的影响”问题。
2.思考点:
dom

2.1谁是引发这一变化的主因?

  对于飞机分类,随着负样本增多,精度上升,召回率降低;
  对于背景分类,精度降低,召回率上升。
谁是主因?谁是从因?
  在这个实验中,飞机样本数据不变,是控制变量。负样本(背景)数据量逐渐增长,首先应该分析因为负样本增长而形成的精度、召回率变化;其次,要分析精度上升和召回率降低,哪个变化是直接由负样本数据量最大引发的。
机器学习

3.假设

3.1从模型训练的动力角度解释

  当类间数据量相差较大时,模型倾向于将样本判别为数据量大的样本,便可得到较低的损失,没有动力继续优化参数。
  极端的例子:训练样本中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

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条原始评论和转发)

  机器学习那些事儿   2014-11-15 17:48
工业界机器学习典型问题: 正负样本分布极不均匀(一般<1:10000),有什么较好的方案构造训练集的正负样本分布?构造后如何解决训练数据与预测的分布不一致?请大牛帮忙解释下 @老师木 @李沐M @星空下的巫师@徐盈辉_仁基
北冥乘海生 转发于 2014-11-15 17:50
这个跟模型的形式和估计方法都有关,有些状况下正负例不均衡时估计有偏,能够校订一下。
小兔子大坏坏 评论于 2014-11-15 18:25
上采样、下采样、代价敏感,没什么好办法
特级飞行员舒克 转发于 2014-12-07 17:27  回复 @phunter_lau
回复 @phunter_lau:mark,sampling
范涛_中科大 评论于 2014-12-07 17:40  回复 @特级飞行员舒克
这个以前调研过,主要分重采样和欠采样!这种不平衡是由于比率的不平衡给一些学习方法带来问题。可是在某些领域,好比反欺诈和安全,不只是比率极不平衡,并且是正样本样本绝对数很小。须要扩散正样本方法!
特级飞行员舒克 转发于 2014-12-07 17:54
聚类而后从负样本中找和正样本比较紧邻的做为正样本怎么样? @phunter_lau @范涛_中科大 @winsty
范涛_中科大 转发于 2014-12-07 17:57
回复 @特级飞行员舒克: Synthetic Minority Over-sampling Technique 我试过这个方法,解决部分问题,主要仍是须要增长样本在特征空间的覆盖! 工程上光靠算法也解决不了问题,有的仍是须要加入下经验知识来作。
睡眼惺忪的小叶先森 转发于 2014-12-07 18:03  回复 @范涛_中科大
我也说说。抛砖引玉:1,比例是一个关键的参数,据咱们的经验,1:14是一个常见的“好”比例。[哈哈] 2,stratified sampling,也就是根据特征来采样,尽可能使样本都覆盖特征空间。3,训练的时候,这个正负样本的“出场”顺序也很关键,否则可能还没遇到正(负)样本模型就已经收敛了。
梁斌penny 转发于 2014-12-07 18:05  回复 @特级飞行员舒克
这就是一种伪标注方法,是可行的。固然最后仍是须要验证一下效果,来证实这个方法对这类数据是solid的
孙明明_SmarterChina 转发于 2014-12-07 18:16  回复 @梁斌penny
这问题太笼统了。正负样本不平衡只是个表象,处理方法要根据本质缘由来定。
齐浩亮 转发于 2014-12-07 18:37  回复 @梁斌penny
用排序思想构造所谓的序对,
宋云涛 转发于 2014-12-07 18:55
若是1:10算是均匀的话,能够将多数类分割成为1000份。而后将每一份跟少数类的样本组合进行训练获得分类器。然后将这1000个分类器用assemble的方法组合位一个分类器。记得读到的论文可行,但没有验证过
宋云涛 评论于 2014-12-07 18:57
采样的话要么损失信息要么影响数据分布,基本的序对的话也会引发信息的损失~
特级飞行员舒克 转发于 2014-12-07 19:55  回复 @Juggernaut_One
回复 @Juggernaut_One:我认为有些场景下正负样本之间并无严格明显的界线,是能够互相转换的。
特级飞行员舒克 转发于 2014-12-07 19:59  回复 @Juggernaut_One
回复 @Juggernaut_One:在百度实习作广告点击率预估时,曾经想过在模型训练时不用0/1做为label,而是根据特征状况给一个float值(在[0,1]区间周围),或者更简单一些分别对目标值0/1作一些扰动,后来因为某些缘由没作成。
wb王传鹏 转发于 2014-12-07 20:00
@刘尚堃 你说过有很多技巧[哈哈]
离家出走的托尔斯泰 转发于 2014-12-08 02:34
这在机器学习里面被称类别不平衡问题,能够参考Haibo, H. and E. A. Garcia (2009). "Learning from Imbalanced Data." Knowledge and Data Engineering, IEEE Transactions on" 的survey.已有不少方法提出
phunter_lau 转发于 2014-12-08 05:02  回复 @梁斌penny
或者试试看Transductive SVM (TSVM) 用当前训练的模型标注新的sample,差很少相似的想法可是我也是听同事说的
小吴COKE 转发于 2014-12-08 05:26  回复 @梁斌penny
聚类自己不是已经默认了类似度测定了么。。。。[汗]
cswhjiang 转发于 2014-12-08 05:33  回复 @phunter_lau
Transductive 是指要求 label 的数据在training 一个model的时候已经肯定了,相对于inductive 而言。训练数据和测试数据分布不一样是domain adaptation、sample bias、data shift。可是他原先的问题实际上是imblance problem,google下能找到方法,好比  http://t.cn/Rzph0Wt
思奇吞象 评论于 2014-12-08 05:50
标准解决方法:设计objective function的时候给不一样misclassification的状况不一样的relative weights。也就是说给从小数量的样本被分红大数量的样本更大的penalty
anch3or 转发于 2014-12-08 07:53  回复 @梁斌penny
@phunter_lau:或者试试看Transductive SVM (TSVM) 用当前训练的模型标注新的sample,差很少相似的想法
孙明明_SmarterChina 转发于 2014-12-08 08:35  回复 @好东西传送门
训练数据与预测数据分布不一致,有专门研究的课题,sample selection bias,主要方法是各类reweighting
机器学习那些事儿 转发于 2014-12-08 09:06  回复 @特级飞行员舒克
这应该和半监督的间谍算法相似吧,不过这只能解决抽样问题,无法较好的肯定正负样本之间的比例吧?
老师木 转发于 2014-12-08 10:12  回复 @梁斌penny
我之前搞过一个support cluster machine,相似的想法,好久之前的工做了,仅能够参考一下。
vinW 评论于 2014-12-08 10:17
按理是跟你的目标有关。若是你的目标是 预测的分布 跟训练的分布一致,那就加大对分布不一致的惩罚系数就是。
Jason_wbw 转发于 2014-12-08 10:19  回复 @特级飞行员舒克
我理解那么多的负样本的状况下,其实负样本已经并非真正的`负样本`了,顺带扔个以前被推荐的paper http://t.cn/RzpInP3
王小科科科 转发于 2014-12-08 10:32
个人处理方式挺简单的,将负样本取样数量减小,而后在计算预测几率的时候,调整常数因子。
晴阴雨雪天各类读书 转发于 2014-12-08 11:11  回复 @岩间花树GT
早几年kdd有篇paper解决这个的,其实原理都差很少
微笑刺客4067 转发于 2014-12-08 12:09
关注。。伪标注有时间试一试!
夏睿 转发于 2014-12-08 12:50  回复 @孙明明_SmarterChina
Sample selection bias 能够解决一部分预测与训练数据分布不一致(还包括迁移学习、领域适应问题),不过好像没见过直接用它解决类别不平衡
昊奋 转发于 2014-12-08 13:08
抛砖引玉,这个却是能够参考positive only learning等半监督学习中如早期的spy算法等来构造合适的负例来解决正负例不平衡的问题。在只有正例的学习问题中,负例千差万别,且数量也远超正例,符合楼主的问题描述
AixinSG 转发于 2014-12-08 13:48  回复 @昊奋
这个建议看起来比上采样下采样或者调权重更靠谱
小飞鱼_露 转发于 2014-12-08 17:12
这个看起来像 one-class recommendation 问题,不知是否能够考虑转化成 learning to rank 问题,若是不是为了拟合一个分布的话 (PS: 字数不够了...)  @AixinSG @昊奋
NeoLScarlet 转发于 2014-12-08 17:14  回复 @算文解字
貌似生成不平衡那边的样本效果最好。
复旦李斌 转发于 2014-12-08 17:39  回复 @老师木
因而你们搜出来的都是个人那篇。。。[衰][衰]
离家出走的托尔斯泰 评论于 2014-12-08 18:04
我的以为在类别不平衡条件下,Transductive SVM (TSVM)应该对于的active learning 来标注,可能结果更好。
昊奋 转发于 2014-12-08 20:04
learning to rank对于训练数据量的要求较高,同时要肯定用于learning to rank的pair,仍是须要找到负例,从而将正例和负例造成偏序配对。因此learning to rank是一种方法,但我的认为这会将简单问题复杂化,且本质仍是须要去找负例。
开机就好ing 转发于 2014-12-08 21:06  回复 @昊奋
用单类分类算法如svdd也能够
杲a杲 评论于 2014-12-09 02:48

感受都没扯到点子上啊,最经典的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那篇文章选取训练样本的方法)


 

Tackling Class Imbalance with Deep Convolutional Neural Networks



这个和深度学习不要紧,类别不平衡是机器学习一个常见问题 ,有一下几个思路能够参考
1 :数据采样的时候,能够把数量少的类别重复采样,而把数量多的类别只采样一部分
2:调整损失函数,对样本多的类别进行惩罚
实际工程上,正负样本比或者惩罚系数,须要进行调参



首先: 分清 face recognition/ identification /verification,媒体常常统一用face recognition
“已注册样本通常都只有一张” 感受是在说 “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作神经网络的最终输出的)等大多数分类器 正负例 的样本均等为好;此外在语音识别中 神经网络的训练样本是极为不均衡的;在图像任务中 也能够考虑利用下 类别的先验几率

首先你要肯定为何须要balance,balance不必定就是好的,咱们须要的是同分布,而不是神马balance。
改变分布就有不少科学的方法了。
sample的话,好比MCMC。
还能够生造数据,嗯,就是很火的reinforce。



我试着答一下 若有错误请你们指正
问题主要矛盾指不平衡数据处理 结论是分两种处理 算法修正和数据修正
而后是正文

数据不平衡是一个很正常的现象 在神经网络领域以外已经有不少相关研究了 尤为在svm上(笑)
机器学习算法中一般两种方法解决 一种是算法上的 用算法计算不一样输入数据的距离 将距离归入算法训练 或者说将距离归入惩罚函数 有不少相关研究 手机打没文献 搜索imbalance会有不少 基于不平衡度和基于图是我知道的两种很好的算法
在深度学习上 不平衡的算法处理没有单独拿出来说的 由于随着时代发展 这个被视为解决问题中很小的一环 更多的是处理transfer learning
深度迁移学习网络基本是深度网络中会涉及不平衡的最重要 或者说效果最好的一类 可是正如前文所说 不平衡的解决只是顺带的
迁移网络解决不平衡最好的例子是deep transfer metric learning,这篇文献相似考虑距离惩罚 而且将惩罚归入了能量函数 在根据能量函数作梯度递减迭代时候发挥做用 相似的想法确定能够解决 可是彷佛有些不合适 毕竟transfer learning 解决的是更麻烦一点的问题
代码 不多 可是theano只改下update函数 caffe改一下能量函数式 训练依旧是反向传播 能够有预训练 不用改

前述麻烦 因此有数据采样方法解决数据不平衡
采样解决不平衡分欠采样和过采样两种
可是说在前面 数据采样上解决 实际是数据预处理的一步了 和深度不深度不要紧 这部分代码很好写 由于只操做数据
欠采样就是有的数据不采用 过采样就是少数的信息重复采样或者差值拟合出新的少数类信 著名的是SMOTE算法
这些方法和信号采样那些很像 可是也有一些新的方法和些微不一样 相关文献看得很少 临时想不到


具体用到的时候 看你问题定义了 不必定要用到这些东西 深度网络拟合能力很好 不平衡的丢过去极可能只有过拟合问题 而不须要特殊处理
文献资料什么的想不起来 可是搜索很好搜 百度就行 由于实验室前辈有作过imbalance data 我也跟过一段时间

数据不平衡是机器学习里面的常见的现象,一般是根据数据类别的分布对损失函数进行加权处理,即正负两类出现误判的惩罚是不一样的,好比,样本量小的那一类惩罚会更大,或者也能够在迭代的时候增长样本小的那一类被选中来进行优化的几率,至关于将样本小的那一类的数据人为复制。

相关文章
相关标签/搜索