在深度学习中处理不均衡数据集

hard negative mining

online hard sample mining

https://blog.csdn.net/jacke121/article/details/106367873

在上面的情况中,我们当然需要我们的少数“买”的类别要特别的准确,而“不买”的类别则无关紧要。但是在实际情况中,由于买的情况比不买的情况要少得多,我们的模型预测会偏向“不买”的类别,而“买”的类别的准确率则可能会很差。这就需要数据均衡了,我们可以让“买”类别的权重变大,来让“买”类别的预测更加准确。

但是如果我们对少数类别不关心怎么办呢?例如,我要做一个图像的分类,而你的类别的分布看起来是这样的:

第一眼看上去似乎数据均衡是有好处的。但是也许我们对那些少数的类别并不关心。也许我们的目的就是得到最高的准确率。在这种情况下,做数据均衡并没什么意义,因为大多数的准确率来自于包含了大量样本的类别中。第二,交叉熵的损失即使是在不均衡的数据的时候,也是趋向于得到最高的准确率。总的来说,我们的少数类别并没有对准确率有多少贡献,所以说,数据均衡并不需要。

综上所述,当我们遇到需要均衡数据的时候,有两个方法可以帮助我们办到:

权值均衡

权值均衡是在训练样本的时候,在计算loss的时候,通过权值来均衡数据的分布。正常情况下,每个类别在损失函数中的权值是1.0。但是有时候,当某些类别特别重要的时候,我们需要给该类别的训练样本更大权值。参考我们的买房的例子,由于“买”的类别的准确率非常的重要,训练样本中的这个类别应该对损失函数有更大的影响。

可以直接给对应的类别的样本的loss乘上一个因子来设定权值。在Keras中,我们可以这样:

import keras
class_weight = {"buy": 0.75,"don't buy": 0.25}
model.fit(X_train, Y_train, epochs=10, batch_size=32, class_weight=class_weight)

我们创建了一个字典,其中,“买”类别为75%,表示了占据了75%的loss,因为比“不买”的类别更加的重要,“不买”的类别设置成了25%。当然,这两个数字可以修改,直到找到最佳的设置为止。我们可以使用这种方法来均衡不同的类别,当类别之间的样本数量差别很大的时候。我们可以使用权值均衡的方式来使我们的所有的类别对loss的贡献是相同的,而不用取费力的收集少数类别的样本了。

另一个可以用来做训练样本的权值均衡的是Focal loss。如下所示,主要思想是这样:在数据集中,很自然的有些样本是很容易分类的,而有些是比较难分类的。在训练过程中,这些容易分类的样本的准确率可以达到99%,而那些难分类的样本的准确率则很差。问题就在于,那些容易分类的样本仍然在贡献着loss,那我们为什么要给所有的样本同样的权值?

这正是Focal loss要解决的问题。focal loss减小了正确分类的样本的权值,而不是给所有的样本同样的权值。这和给与训练样本更多的难分类样本时一样的效果。在实际中,当我们有数据不均衡的情况时,我们的多数的类别很快的会训练的很好,分类准确率很高,因为我们有更多的数据。但是,为了确保我们在少数类别上也能有很好的准确率,我们使用focal loss,给与少数类别的样本更高的权值。focal loss使用Keras是很容易实现的:

import keras
from keras import backend as K
import tensorflow as tf# Define our custom loss function
def focal_loss(y_true, y_pred):gamma = 2.0, alpha = 0.25pt_1 = tf.where(tf.equal(y_true, 1), y_pred, tf.ones_like(y_pred))pt_0 = tf.where(tf.equal(y_true, 0), y_pred, tf.zeros_like(y_pred))return -K.sum(alpha * K.pow(1. - pt_1, gamma) * K.log(pt_1))-K.sum((1-alpha) *K.pow( pt_0, gamma) * K.log(1. - pt_0))# Compile our model
adam = Adam(lr=0.0001)
model.compile(loss=[focal_loss], metrics=["accuracy"], optimizer=adam)

过采样和欠采样

选择合适的类别的权重有时候比较复杂。做一个简单的频率倒数可能有时候效果也不好。Focal loss有点用,但是仍然会对所有的正确分类的样本都做权值的下降。另外一个数据均衡的方法就是直接的采样。下面的图给出了一个大概的说明.

在图像的两边,蓝色的类别比橘黄色的类别的样本多得多。这种情况下,我们在预处理时,有两种选择。

欠采样意思是从多数的类别中只采样其中的一部分的样本,选择和少数类别同样多的样本。这种采样保持了该类别原来的数据分布。这很容易,我们只需要少用点样本就可以让数据变得均衡。

过采样的意思是我们复制少数类别中的样本,使得数量和多数样本一样多。复制操作需要保持少数样本的原有的数据分布。我们不需要获取更多的数据就可以让数据集变得均衡。采样的方法是一个很好的类别均衡的方法,如果你发现类别权值很难做而且效果不好的时候,可以试试!

在深度学习中处理不均衡数据集相关推荐

  1. 转载 | 深度学习中的遥感影像数据集

    本文转载自博主GISer_Lin原创文章<深度学习中的遥感影像数据集> 点击此处转跳原文 以下数据集均为网上开源数据集,若有遗误或不慎涉及侵权,烦请评论或留言联系 目前本项目共整理 场景分 ...

  2. 深度学习中的遥感影像数据集

    [转载]深度学习中的遥感影像数据集 收集网络上公开的遥感数据集,欢迎补充 Ref: https://blog.csdn.net/weixin_36670529/article/details/8458 ...

  3. 深度学习中的遥感影像数据集~持续更新

    收集网络上公开的遥感数据集,欢迎补充 以下数据集均为网上开源数据集,若有遗误或不慎涉及侵权,烦请评论或留言联系 目前本项目共整理 场景分类数据集27个(整理完结): 目标检测数据集31+个(整理完结) ...

  4. python爬取百度图片(用于深度学习中数据集的收集)

    6_python爬取百度图片(用于深度学习中数据集的收集)(6-20181225-) 参考: https://blog.csdn.net/guyuealian/article/details/7873 ...

  5. Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介、应用之详细攻略——daidingdaiding

    Dataset:机器学习和深度学习中对数据集进行高级绘图(数据集可视化,箱线图等)的简介.应用之详细攻略--daidingdaiding 目录 箱线图 箱线图 箱线图(box plots):这些图显示 ...

  6. 深度学习中常见的打标签工具和数据集资源

    深度学习中常见的打标签工具和数据集资源 一.打标签工具 1. labelimg/labelme 1.1 搭建图片标注环境(win10) (1) 安装anaconda3 (2) 在anaconda环境p ...

  7. 经验 | 深度学习中从基础综述、论文笔记到工程经验、训练技巧

    点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 仅作学术分享,不代表本公众号立场,侵权联系删除 转载于:本文授权转自知乎作者跑者小越,https://zhuanla ...

  8. 深度学习中的生成对抗网络GAN

    转载:一文看尽深度学习中的生成对抗网络 | CVHub带你看一看GANs架构发展的8年 (qq.com) 导读 生成对抗网络 (Generative Adversarial Networks, GAN ...

  9. 深度学习中的一些英文解释

    A: (1)anchors:锚点.(anchors(锚点)定义在RPN网络中) B: (1)bounding box:预测边界框. (2)Botton-up 3D proposal generatio ...

最新文章

  1. matlab v7.0,matlab下载-matlab免费版v7.0 官方版下载-6188手游网
  2. elasticsearch负载均衡节点——客户端节点 node.master: false node.data: false 其他配置和master 数据节点一样...
  3. java离群值,监视-衡量Java中单线程复杂算法的最佳宏基准测试工具/框架是什么?...
  4. Linux下的文件系统
  5. 2016-7-4收藏夹接口
  6. 微信 android兼容性问题怎么解决方案,微信小程序兼容性问题
  7. 去超市一定要存包吗_大桥路某超市收银时出现多收现象!大家付完钱一定要核对...
  8. COJS 1752. [BOI2007]摩基亚Mokia
  9. lua 差值 日期_Lua获取系统时间和时间格式化方法及格式化参数
  10. java remote debug parameters
  11. C#Excel上传批量导入sqlserver
  12. matlab如何实现隔直滤波器,matlab的滤波器仿真——低通滤波器与插值滤波器
  13. UnityWebGL发布包问题及IIS配置
  14. js逆向巨潮mcode
  15. 基于python毕业设计毕设课题选题参考
  16. 服务器的server2016系统怎么装,windowsserver2016安装桌面教程
  17. 基于标记的分水岭分割算法
  18. Java下载excel模板
  19. 给定一个字符类型的数组chas[]
  20. ecshop 多货币解决方案(1)

热门文章

  1. Android--制作开场动画/MediaPlayer.OnCompletionListener
  2. socket 与 vfs
  3. java中怎样克隆,如何在Java中克隆列表?
  4. C# - 在foreach中删除元素
  5. 9型转x型 cobol_【科研模型100例32】A型/X型分子筛
  6. windows7关闭计算机对话框,电脑弹出对话框很烦人怎么办?win7禁止对话框弹出的方法...
  7. 怎么用linux的HDD存储,Linux学习的正确姿势12:Linux存储概览
  8. mysql 给表起别名_MySQL ------ 高级联结 (自联结,自然联结,外联结,带聚合函数的联结)(十五)...
  9. Spring Security过滤器就该这么配置!
  10. 紧急!Log4j 史诗级漏洞来袭,已引起大规模入侵,速速自查!