草庐IT

如何处理分类和回归问题数据不平衡问题

升不上三段的大鱼 2023-03-28 原文

原文:https://neptune.ai/blog/how-to-deal-with-imbalanced-classification-and-regression-data
(原文有好多有意思的图)

数据不平衡是在处理真实数据经常会遇到的问题,然而大多数的机器学习算法都是假设数据类别是均匀分布的。同样的,对于回归问题也存在数据分布不平衡的问题。

目前主要有3种从不平衡数据中学习的方法,分别是:

  • 数据方法
  • 算法方法
  • 混合(集成)方法

1. 不平衡的分类数据

在现实场景中,一些很少见的情景反而是更加重要的,比如残次品检测。

1.1 数据方法

主要致力于改变类别的数据分布,让分布变得平衡,包括:

  • 过采样(Oversamling)
  • 欠采样(Undersampling)

过采样是从少数类别里生成新的样本出来,最常用的数据增强方法是 Synthetic Minority Oversampling Technique(SMOTE )
SMOTE原理如下:随机选择一个少数类别的样本a,并找到K个最近的少数类别的邻居样本,随机选择一个b,然后在特征空间中连接ab两个样本的线上随机选择一个点,合成一个新的样本。将合成的新样本加入训练集,会让数据分布更加平衡,提高模型泛化性。

SMOTE

SMOTE的优点是它可以改善随即采样的过拟合,不会丢失信息,并且方法简单。

缺点是在生成新样本的时候不会考虑距离较近的其他类别的样本,可能会导致类别的重叠,以及引入噪声。SMOTE也不能用于处理高维数据 。

一个不平衡的分类问题

SMOTE处理后

图片来自:https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/

欠采样 是将多数类别的样本数量减少到与少数样本匹配。

通常的做法有:

  • 随机采样:简单粗暴有奇效
  • NearMiss:为选择样本增加一些规则,具体可以看这里

欠采样的优点是可以很好的分类少数样本,用于训练的数据样本更少,也意味着运行时间更短。

缺点是去掉占多数的样本可能会导致大量样本丢失,欠采样得到的数据可能无法代表整个分布,可能会导致在实际数据上性能不佳。

SMOTE 和欠采样结合起来比单纯使用欠采样效果更好。

1.2 算法方法

最常用的方法是加权学习,使用 Focal loss,对少数类分配更高的权重,而多数类分配更低的权重,让模型更加关注数量较少的类。

另一个解决思路是 one-class classification(OCC), 顾名思义,只关注一组对象。OCC可以用于异常检测,让模型拟合大多数正例,然后判断新数据是否属于多数类,如果不是(或者概率很低),就说明是异常值。

1.3 混合方法

上面的方法都可以一起用,利用数据的方法来平衡数据分布,然后训练一个分类器集成。(图片来源 )

混合方法

2. 不平衡的回归数据

分类和回归问题的区别在于,分类的标签是离散的,而回归的标签是连续的。一个现实生活中的例子是天气的预测。

2.1 数据方法

有两个由处理不平衡分类数据而来的方法:

  • SMOTER
  • SMOGN

SMOTER是SMOTE算法的回归版本。

它的原理是根据原始标签的密度来划分多数区域和少数区域,然后根据自己定义的过采样和欠采样百分比来进行采样。

在对少数区域进行过采样时,会使用插值的方法生成新的样本。生成新样本的方法是,在少数区域里选择一个样本,然后在它的K近邻里随机选择第二个,新生成的样本特征是这两个样本特征的加权平均。

SMOGN在SMOTER之后,在过采样时加入了高斯噪声。其原理是在过采样阶段,如果随机选择的样本和它的被选中的那个K近邻距离比较近,就使用SMOTER的方法生成新的样本,如果这两个样本距离较远,则使用高斯噪声。

2.2 算法方法

Delving into Deep Imbalanced Regression

有关如何处理分类和回归问题数据不平衡问题的更多相关文章

  1. ruby - 在 64 位 Snow Leopard 上使用 rvm、postgres 9.0、ruby 1.9.2-p136 安装 pg gem 时出现问题 - 2

    我想为Heroku构建一个Rails3应用程序。他们使用Postgres作为他们的数据库,所以我通过MacPorts安装了postgres9.0。现在我需要一个postgresgem并且共识是出于性能原因你想要pggem。但是我对我得到的错误感到非常困惑当我尝试在rvm下通过geminstall安装pg时。我已经非常明确地指定了所有postgres目录的位置可以找到但仍然无法完成安装:$envARCHFLAGS='-archx86_64'geminstallpg--\--with-pg-config=/opt/local/var/db/postgresql90/defaultdb/po

  2. ruby - 解析 RDFa、微数据等的最佳方式是什么,使用统一的模式/词汇(例如 schema.org)存储和显示信息 - 2

    我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i

  3. ruby - 通过 rvm 升级 ruby​​gems 的问题 - 2

    尝试通过RVM将RubyGems升级到版本1.8.10并出现此错误:$rvmrubygemslatestRemovingoldRubygemsfiles...Installingrubygems-1.8.10forruby-1.9.2-p180...ERROR:Errorrunning'GEM_PATH="/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/ruby-1.9.2-p180@global:/Users/foo/.rvm/gems/ruby-1.9.2-p180:/Users/foo/.rvm/gems/rub

  4. ruby - 匹配未转义的平衡定界符对 - 2

    如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。

  5. ruby - 通过 RVM (OSX Mountain Lion) 安装 Ruby 2.0.0-p247 时遇到问题 - 2

    我的最终目标是安装当前版本的RubyonRails。我在OSXMountainLion上运行。到目前为止,这是我的过程:已安装的RVM$\curl-Lhttps://get.rvm.io|bash-sstable检查已知(我假设已批准)安装$rvmlistknown我看到当前的稳定版本可用[ruby-]2.0.0[-p247]输入命令安装$rvminstall2.0.0-p247注意:我也试过这些安装命令$rvminstallruby-2.0.0-p247$rvminstallruby=2.0.0-p247我很快就无处可去了。结果:$rvminstall2.0.0-p247Search

  6. ruby - Fast-stemmer 安装问题 - 2

    由于fast-stemmer的问题,我很难安装我想要的任何ruby​​gem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=

  7. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

    我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

  8. ruby - 安装 Ruby 时遇到问题(无法下载资源 "readline--patch") - 2

    当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub

  9. ruby - Ruby 有 `Pair` 数据类型吗? - 2

    有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳

  10. java - 从 JRuby 调用 Java 类的问题 - 2

    我正在尝试使用boilerpipe来自JRuby。我看过guide从JRuby调用Java,并成功地将它与另一个Java包一起使用,但无法弄清楚为什么同样的东西不能用于boilerpipe。我正在尝试基本上从JRuby中执行与此Java等效的操作:URLurl=newURL("http://www.example.com/some-location/index.html");Stringtext=ArticleExtractor.INSTANCE.getText(url);在JRuby中试过这个:require'java'url=java.net.URL.new("http://www

随机推荐