原文:https://neptune.ai/blog/how-to-deal-with-imbalanced-classification-and-regression-data
(原文有好多有意思的图)
数据不平衡是在处理真实数据经常会遇到的问题,然而大多数的机器学习算法都是假设数据类别是均匀分布的。同样的,对于回归问题也存在数据分布不平衡的问题。
目前主要有3种从不平衡数据中学习的方法,分别是:
在现实场景中,一些很少见的情景反而是更加重要的,比如残次品检测。
主要致力于改变类别的数据分布,让分布变得平衡,包括:
过采样是从少数类别里生成新的样本出来,最常用的数据增强方法是 Synthetic Minority Oversampling Technique(SMOTE )。
SMOTE原理如下:随机选择一个少数类别的样本a,并找到K个最近的少数类别的邻居样本,随机选择一个b,然后在特征空间中连接ab两个样本的线上随机选择一个点,合成一个新的样本。将合成的新样本加入训练集,会让数据分布更加平衡,提高模型泛化性。

SMOTE的优点是它可以改善随即采样的过拟合,不会丢失信息,并且方法简单。
缺点是在生成新样本的时候不会考虑距离较近的其他类别的样本,可能会导致类别的重叠,以及引入噪声。SMOTE也不能用于处理高维数据 。


图片来自:https://machinelearningmastery.com/smote-oversampling-for-imbalanced-classification/
欠采样 是将多数类别的样本数量减少到与少数样本匹配。
通常的做法有:
欠采样的优点是可以很好的分类少数样本,用于训练的数据样本更少,也意味着运行时间更短。
缺点是去掉占多数的样本可能会导致大量样本丢失,欠采样得到的数据可能无法代表整个分布,可能会导致在实际数据上性能不佳。
SMOTE 和欠采样结合起来比单纯使用欠采样效果更好。
最常用的方法是加权学习,使用 Focal loss,对少数类分配更高的权重,而多数类分配更低的权重,让模型更加关注数量较少的类。
另一个解决思路是 one-class classification(OCC), 顾名思义,只关注一组对象。OCC可以用于异常检测,让模型拟合大多数正例,然后判断新数据是否属于多数类,如果不是(或者概率很低),就说明是异常值。
上面的方法都可以一起用,利用数据的方法来平衡数据分布,然后训练一个分类器集成。(图片来源 )

分类和回归问题的区别在于,分类的标签是离散的,而回归的标签是连续的。一个现实生活中的例子是天气的预测。
有两个由处理不平衡分类数据而来的方法:
SMOTER是SMOTE算法的回归版本。
它的原理是根据原始标签的密度来划分多数区域和少数区域,然后根据自己定义的过采样和欠采样百分比来进行采样。
在对少数区域进行过采样时,会使用插值的方法生成新的样本。生成新样本的方法是,在少数区域里选择一个样本,然后在它的K近邻里随机选择第二个,新生成的样本特征是这两个样本特征的加权平均。
SMOGN在SMOTER之后,在过采样时加入了高斯噪声。其原理是在过采样阶段,如果随机选择的样本和它的被选中的那个K近邻距离比较近,就使用SMOTER的方法生成新的样本,如果这两个样本距离较远,则使用高斯噪声。
我想为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
我主要使用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
尝试通过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
如何匹配未被反斜杠转义的平衡定界符对(其本身未被反斜杠转义)(无需考虑嵌套)?例如对于反引号,我试过了,但是转义的反引号没有像转义那样工作。regex=/(?!$1:"how\\"#expected"how\\`are"上面的正则表达式不考虑由反斜杠转义并位于反引号前面的反斜杠,但我愿意考虑。StackOverflow如何做到这一点?这样做的目的并不复杂。我有文档文本,其中包括内联代码的反引号,就像StackOverflow一样,我想在HTML文件中显示它,内联代码用一些spanMaterial装饰。不会有嵌套,但转义反引号或转义反斜杠可能出现在任何地方。
我的最终目标是安装当前版本的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
由于fast-stemmer的问题,我很难安装我想要的任何rubygem。我把我得到的错误放在下面。Buildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingfast-stemmer:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcreatingMakefilemake"DESTDIR="cleanmake"DESTDIR=
我在理解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
当我尝试安装Ruby时遇到此错误。我试过查看this和this但无济于事➜~brewinstallrubyWarning:YouareusingOSX10.12.Wedonotprovidesupportforthispre-releaseversion.Youmayencounterbuildfailuresorotherbreakages.Pleasecreatepull-requestsinsteadoffilingissues.==>Installingdependenciesforruby:readline,libyaml,makedepend==>Installingrub
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试使用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