您的位置:

python数据不平衡处理方法,python处理样本不平衡

本文目录一览:

解决正负样本数据不平衡

解决这一问题的基本思路是让正负样本在训练过程中拥有相同的话语权,比如利用采样与加权等方法。为了方便起见,我们把数据集中样本较多的那一类称为“大众类”,样本较少的那一类称为“小众类”。

采样方法是通过对训练集进行处理使其从不平衡的数据集变成平衡的数据集,在大部分情况下会对最终的结果带来提升。

采样分为 上(过)采样(Oversampling) 和 下(欠)采样(Undersampling) ,上采样是把小众类复制多份,下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。

随机采样最大的优点是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体模式的一部分。

上采样 会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效。

因为 下采样 会丢失信息,如何减少信息的损失呢? 第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble) :多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。 第二种方法叫做BalanceCascade ,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。 第三种方法是利用KNN试图挑选那些最具代表性的大众样本 ,叫做NearMiss,这类方法计算量很大。

数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。

SMOTE 为每个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增加了类之间重叠的可能性,另一方面是生成一些没有提供有益信息的样本。为了解决这个问题, 出现两种方法:Borderline-SMOTE与ADASYN 。

Borderline-SMOTE 的解决思路是寻找那些应该为之合成新样本的小众样本。即为每个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。直观地讲,只为那些周围大部分是大众样本的小众样本生成新样本,因为这些样本往往是边界样本。确定了为哪些小众样本生成新样本后再利用SMOTE生成新样本。

对不同类别分错的代价不同。如下图

横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。

这种方法的难点在于设置合理的权重,实际应用中一般让各个分类间的加权损失值近似相等。当然这并不是通用法则,还是需要具体问题具体分析。

对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。

说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。

1、在正负样本都非常之少的情况下,应该采用数据合成的方式;

2、在负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法;

3、在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。

4、采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。

5、另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,我的经验是如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。

6、对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。

参考;dist_request_id=1328641.21496.16155984958537047depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.control

如何解决机器学习中数据不平衡问题

首先,数据集不平衡会造成怎样的问题呢。一般的学习器都有下面的两个假设:一个是使得学习器的准确率最高,另外一个是学习器应该用在与训练集有相同分布的

测试集上。如果数据不平衡,那么学习器使得它的准确率最高肯定是更偏向于预测结果为比例更大的类别。比如说阳性的比例为1%,阴性的比例为99%,很明显

的是即使不学习,直接预测所有结果为阴性,这样做的准确率也能够达到99%,而如果建立学习器也很有可能没有办法达到99%。这就是数据比例不平衡所造成

的问题。这样建立的模型即使准确率再高,在实际应用的时候效果肯定不好,而且也不是我们想要的模型。

明白了数据集的不平衡对于学习过程所造成的问题,相应的解决办法也有不少。下面是一些常用的两类方法。

1 从数据集入手。既然数据不平衡,那我们就人为的把数据集给平衡一下。可以通过随机采样比例大的类别使得训练集中大类的个数与小类相当,也可以重复小类

使得小类的个数与大类相当。前者的问题是可能会丢失信息,因为只采用部分样本。后者的问题是可能造成过拟合,因为有重复样本。前者的问题可以通过

esemble的方法来解决,即每次形成训练集的时候包括所有小类样本,同时从大类样本中随机选择样本构成训练集,这样重复很多次得到很多训练集和训练模

型。在测试的时候使用投票的方法来判断分类结果。

除了平衡数据集外,还可以通过分别在大类和小类中筛选特征,然后组合起来构成学习器。这样也可能提高效果。

2 从学习器入手。最简单的是通过改变判断类别的cutoff来改变类别样本比例;也可以只学习一个类别。此外,在学习的时候考虑到误判不同样本的不同成本,使得学习器更偏向于预测小类。这样也能够改进模型。

数据不平衡怎么办?

使用正确的评估标准,当数据不平衡时可以采用精度,调用度,F1得分,MCC,AUC等评估指标。重新采样数据集,如欠采样和过采样。欠采样通过减少冗余类的大小来平衡数据集。当数据量不足时采用过采样,尝试通过增加稀有样本的数量来平衡数据集,通过使用重复,自举,SMOTE等方法生成新的样本。

以正确的方式使用K-fold交叉验证,组合不同的重采样数据集,对多数类进行聚类。