类别不均衡处理办法总结

   对于深度学习而言,数据量不平衡是很常见的问题,如:工厂的产品缺陷率一般在 0.1% 左右,患者病例比较少等。最近遇到个项目,样本类别极其不均衡,多的类别有上万张,少的仅有几百张,为了有好的训练效果,尝试了很多方法,在这篇博客总结下我使用的,还有见到的一些方法。

一、过采样欠采样

   既然不平衡,那就想办法让他平衡,增加数据和减少数据。一般的方法是过采样和欠采样。

  过采样的意思就是:把少数类别数量重复利用,相当于某个类别100张,复制后,数据量就成为200张。不过这种方法不推荐,可能会造成过拟合。最好是通过数据增强的方式来对少数类别的数量进行数据扩充。数据增强方式与代码:链接

  欠采样的意思就是:数据量大的类别数据并不是全部都使用,比如一万张图像,使用三四千张来作为训练数据。根据自己的数据量进行调整,尽量平衡。我就是使用了这个方法。

二、创造数据

  既然有一些类别数量很少,就想办法创造数据、生成数据。能尽量想办法找数据就找,一些公共数据集,或者去谷歌爬虫一些图片(谷歌爬虫方法链接

  方法1:根据自己数量特征,想办法生成不同的背景。即保留特征,换背景(这种生成数据方法一般适用于类别数据特征比较明显,易分割)

  方法2:SMOTE 及其衍生技术。这是个算法,我没用过,不过看到很多地方都提到这个算法,网上有实线,倒是可以试一试。

三、合并新的少数类别

意思是根据自己的项目,将一些数据量少的类别进行一定的合并,比如,自行车、摩托车,统称为非机动车类别。根据自己需求来更改。

四、调整类权重

如果类别不均衡很严重,神经网络会倾向与数据量大的类别进行预测,这显然不是我们想要的效果,所以需要对不同类别设置不同的重要程度,少类数据量少,我们更加应该关注。故需要对数据量少的类别加大权重

方法1:更改交叉商损失

交叉熵公式如下

在tensorflow中的函数是:tf.nn.softmax_cross_entropy_with_logits(logits=prediction,labels=y)

我们需要对类别设置一定的权重,设置的比例最好是与不同类别数据量比例相反。比如三类的数据量,100,200,300这样我们需要设置的比例为3:2:1.如下面代码所示。这样对数据量少的类别加大了损失权重。这个方法可以使用多类别。

class_weight = tf.constant([3,2,1])
y_class_weight = y*class_weight
loss = -tf.reduce_mean(y_class_weight*tf.log(yprediction))

该方法我试过,不过没有很好的效果,当然这个比例是要调参的,没有放之四海皆准的。

方法2:更换交叉商函数

官方函数:tf.nn.weighted_cross_entropy_with_logits 

之前普通的交叉熵函数定义为:

 

[公式]

就是在交叉熵的公式里面对应的少数类乘上一个系数:
​​​该函数实现的是:如果pos_weights > 1减小了错误负样本的权重,因此提高了recall。相反如果pos_weights < 1减小了错误正样本的权重,因此提高了precision。pos_weight是作为损失表达式中正目标项的乘法系数引入的。

[公式]

该方法也是不错的,不过我认为这个方法只适用于两类,正负样本,比如用于目标检测解决正负样本不均衡的问题,或者语义分割,如车道线检测。对于多分类效果好像没用,我试了下。

五、更改损失函数(Focal Loss)

论文:Focal Loss for Dense Object Detection 
论文链接:https://arxiv.org/abs/1708.02002 

  将损失函数更改为Focal Loss。这个损失是恺明大神提出来的。主要是来解决目标检测中正负样本不均衡的问题,这个损失函数是在标准交叉熵损失基础上修改得到的。这个函数可以通过减少易分类样本的权重,使得模型在训练时更专注于难分类的样本.这个函数已经有实现如下:

pytorch:https://github.com/clcarwin/focal_loss_pytorch

tensorflow:https://github.com/ailias/Focal-Loss-implement-on-Tensorflow

mxnet:https://github.com/unsky/focal-loss

如果需要看Focal Loss损失函数讲解,推荐一个博客:https://blog.csdn.net/u014380165/article/details/77019084

六、更改评价标准

  评价标准很重要,因为如果你不知道该如何正确度量你的成果,你也就不能取得进展。当然既然样本都不均衡了,肯定不能使用单一的准确率来评价模型是否好了,比如使用:召回率、F1分数、一个 ROC 曲线、准确度召回曲线(precision-recall curve)等。西瓜上上有详细解析。

F1 分数(F1 Score):是准确度(precision)和召回率(recall)的调和平均值

ROC 曲线下的面积(AUC):是一个很好的一般统计。它等于一个随机的正面样本将得到比一个随机的负面样本更高排名的概率。

七、提高一些判别阈值

   当你得到概率估计之后,不要盲目地使用 0.50 的决策阈值来区分类别,提高一点。

 

  • 5
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值