精华内容
下载资源
问答
  • 数据不平衡

    千次阅读 2018-04-26 16:00:56
    这几年来,机器学习和数据挖掘非常火热,它们逐渐为世界带来实际价值。...数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。 一、数据不平衡 在学术研究与教学中,很多算法都有一个基本...

    转自:https://blog.csdn.net/lujiandong1/article/details/52658675

    这几年来,机器学习和数据挖掘非常火热,它们逐渐为世界带来实际价值。与此同时,越来越多的机器学习算法从学术界走向工业界,而在这个过程中会有很多困难。数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。

    一、数据不平衡

    在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。下图是新浪微博交互分布情况:


    可以看到大部分微博的总互动数(被转发、评论与点赞数量)在0-5之间,交互数多的微博(多于100)非常之少。如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为第一档(0-5)就能获得非常高的准确率,而这样的预测器没有任何价值。那如何来解决机器学习中数据不平衡问题呢?这便是这篇文章要讨论的主要内容。

    严格地讲,任何数据集上都有数据不平衡现象,这往往由问题本身决定的,但我们只关注那些分布差别比较悬殊的;另外,虽然很多数据集都包含多个类别,但这里着重考虑二分类,因为解决了二分类中的数据不平衡问题后,推而广之就能得到多分类情况下的解决方案。综上,这篇文章主要讨论如何解决二分类中正负样本差两个及以上数量级情况下的数据不平衡问题。

    不平衡程度相同(即正负样本比例类似)的两个问题,解决的难易程度也可能不同,因为问题难易程度还取决于我们所拥有数据有多大。比如在预测微博互动数的问题中,虽然数据不平衡,但每个档位的数据量都很大——最少的类别也有几万个样本,这样的问题通常比较容易解决;而在癌症诊断的场景中,因为患癌症的人本来就很少,所以数据不但不平衡,样本数还非常少,这样的问题就非常棘手。综上,可以把问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。说明:对于小数据集,机器学习的方法是比较棘手的。对于需要解决的问题,拿到数据后,首先统计可用训练数据有多大,然后再观察数据分布情况。经验表明,训练数据中每个类别有5000个以上样本,其实也要相对于特征而言,来判断样本数目是不是足够,数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不平衡问题(完全是经验,没有理论依据,仅供参考)。

    二、如何解决

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

    1. 采样

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

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

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

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

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

    2. 数据合成

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


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

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


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

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

    4. 一分类

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

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

    三、如何选择

    解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?接下来谈谈一些我的经验。

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

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

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

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

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

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

    四、更进一步

    更多细节与更多方法可以参考TKDE上的这篇综述:“Learning from Imbalanced Data”。


    展开全文
  • 数据挖掘:数据预处理——数据不平衡处理 一、什么是数据不平衡不平衡数据集指的是数据集各个类别的样本数目相差巨大,也叫数据倾斜。以二分类问题为例,即正类的样本数量远大于负类的样本数量。严格地讲,任何...

    数据挖掘:数据清洗——数据不平衡处理

    在这里插入图片描述

    一、什么是数据不平衡?

    不平衡数据集指的是数据集各个类别的样本数目相差巨大,也叫数据倾斜。以二分类问题为例,即正类的样本数量远大于负类的样本数量。严格地讲,任何数据集上都有数据不平衡现象,一点的差异不会引起太多的影响,我们只关注那些分布差别比较悬殊的。

    关于分布悬殊:如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。

    不平衡数据的学习即需要在分布不均匀的数据集中学习到有用的信息

    二、不平衡数据例子

    ① 在二分类问题中,训练集中class 1的样本数比上class 2的样本数的比值为60:1。使用逻辑回归进行分类,最后结果是其忽略了class 2,将所有的训练样本都分类为class 1。

    ② 在三分类问题中,三个类别分别为A,B,C,训练集中A类的样本占70%,B类的样本占25%,C类的样本占5%。最后我的分类器对类A的样本过拟合了,而对其它两个类别的样本欠拟合。

    生活中的案例:不平衡数据的场景出现在互联网应用的方方面面,如搜索引擎的点击预测(点击的网页往往占据很小的比例)、电子商务领域的商品推荐(推荐的商品被购买的比例很低)、信用卡欺诈检测(欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易)、网络攻击识别、癌症检测等等。

    三、不平衡数据产生的问题

    1. 准确率虚高:不平衡的数据集上做训练和测试,其得到的准确率是虚高的。比如在不平衡数据中,正负样本的比例为9:1时,当它的精度为90%时,模型预测倾向于把样本分类为多数类。导致训练效率低下。
    2. 数据信息有限:少数类所包含的信息就会很有限,从而难以确定少数类数据的分布,即在其内部难以发现规律,进而造成少数类的识别率低

    四、不平衡数据的处理方法

    不平衡数据的处理主要可从三个方面进行考虑:
    ①数据角度:改变训练集样本分布 ,降低不平衡程度 。主要方法为采样,分为欠采样过采样以及对应的一些改进方法。从数据角度出发的不平衡数据集的处理方法对应的python库是imblearn。另外可以将不平衡数据集的问题考虑为一分类(One Class Learning)或者异常检测(Novelty Detection)问题,代表的算法有One-class SVM。
    ②评价指标:不单单看Accuracy,从多角度对数据进行评价,如f1,AUC等。是一种可对不平衡数据考察的方面,不能解决数据不平衡问题。
    ③算法角度:适当地修改算法使之适应不平衡分类问题。考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost。

    4.1 数据角度

    4.1.1 扩充数据

    人为获取类别中样本量过小的数据,更多的数据往往能得到更多的分布信息。

    4.1.2 重采样

    重采样方法是通过**增加稀有类训练样本数的上采样 (up-sampling)减少大类样本数的下采样(down-samplings)**使不平衡的样本分布变得比较平衡,从而提高分类器对稀有类的识别率 。

    4.1.2.1 上采样/过采样

    上采样:从少数类的样本中进行随机采样来增加新的样本,改变训练数据的分布来消除或减小数据的不平衡。

    from imblearn.over_sampling import RandomOverSampler
    ros=RandomOverSampler(random_state=0) #采用随机过采样(上采样)
    x_resample,y_resample=ros.fit_sample(trainset,labels)
    

    缺点:数据集中会反复出现一些样本,可能导致过拟合,没有给少数类增加任何新的信息。

    改进

    1. 上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时,添加随机噪声经验表明这种做法非常有效。
    2. 较高级的上采样方法则采用一些启发式技巧 , 有选择地复制稀有类样本 , 或者生成新的稀有类样本。SMOTE算法是一种简单有效的上采样方法,该方法首先为每个稀有类样本随机选出几个邻近样本,并且在该样本与这些邻近的样本的连线上随机取点,生成无重复的新的稀有类样本
    4.1.2.2 下采样/欠采样

    下采样:通过舍弃部分大类样本的方法 , 降低不平衡程度 。

    缺点丢失多数类的一些重要信息,不能够充分利用已有的信息。另外可能增大模型的偏差,因为放大或者缩小某些样本的影响相当于改变了原数据集的分布

    改进

    1. 对不同的类别也要采取不同的采样比例,但一般不会是1:1,因为与现实情况相差甚远,压缩大类的数据是个不错的选择。
    2. 采用更好的EasyEnsembleBalanceCascadeNearMiss算法。
    from imblearn.under_sampling import RandomUnderSampler
    #通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样
    #通过设置RandomUnderSampler中的rratio参数,可以设置数据采样比例
    rus=RandomUnderSampler(ratio=0.4,random_state=0,replacement=True) #采用随机欠采样(下采样)
    x_resample,y_resample=rus.fit_sample(trainset,labels)
    

    4.1.3 数据合成——上采样方法的改进

    相对于采样随机的方法进行过采样, 还有两种比较流行的过采样的改进方式
    (1)、Synthetic Minority Oversampling Technique(SMOTE)
    (2)、Adaptive Synthetic (ADASYN)
    (3)、基于聚类的过采样方法

    4.1.3.1 SMOTE算法

    SMOTE全称是Synthetic Minority Oversampling Technique,即合成少数类过采样技术,SMOTE算法的基本思想是对少数类样本进行分析,并根据少数类样本人工合成新样本添加到数据集中,算法流程如下。

    1. 对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集Smin中所有样本的距离,得到其k近邻。
    2. 根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x^。
    3. 对于每一个随机选出的近邻x^,分别与原样本按照如下的公式构建新的样本。
      xnew=x+rand(0,1)∗(x^−x)

    局限性

    1. 在近邻选择时,存在一定的盲目性。在算法执行过程中,需要确定K值,即选择几个近邻样本,这个需要根据具体的实验数据和实验人自己解决。
    2. 该算法无法克服非平衡数据集的数据分布问题,容易产生分布边缘化的问题。由于负类样本的分布决定了其可选择的近邻,如果一个负类样本处在负类样本的边缘,则由此负类样本和近邻样本产生的样本也会处在边缘,从而无法确定正负类的分类边界,样本重叠。

    在这里插入图片描述

    from imblearn.over_sampling import SMOTE
    X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)
    
    4.1.3.2 Borderline-SMOTE算法

    Borderline-SMOTE与原始SMOTE不同的地方在于,原始的SMOTE是对所有少数类样本生成新样本。而改进的方法则是先根据规则判断出少数类的边界样本,再对这些样本生成新样本。

    判断边界的一个简单的规则为:K近邻中有一半以上多数类样本的少数类为边界样本。直观地讲,只为那些周围大部分是多数类样本的少数类样本生成新样本。

    假设a为少数类中的一个样本,此时少数类的样本分为三类,如下图所示:

    (i) 噪音样本(noise), 该少数类的所有最近邻样本都来自于不同于样本a的其他类别:

    (ii) 危险样本(in danger), 至少一半的最近邻样本来自于同一类(不同于a的类别);

    (iii) 安全样本(safe), 所有的最近邻样本都来自于同一个类。
    在这里插入图片描述
    相对于基本的SMOTE算法, 关注的是所有的少数类样本, 这些情况可能会导致产生次优的决策函数, 因此SMOTE就产生了一些变体: 这些方法关注在最优化决策函数边界的一些少数类样本, 然后在最近邻类的相反方向生成样本.

    SMOTE函数中的kind参数控制了选择哪种变体, (i) borderline1, (ii) borderline2, (iii) svm:

    borderline1:最近邻中的随机样本与该少数类样本a来自于不同的类;
    borderline2:最近邻中的随机样本可以是属于任何一个类的样本;
    svm:使用支持向量机分类器产生支持向量然后再生成新的少数类样本。
    具体实现如下:

    from imblearn.under_sampling import ClusterCentroids
    cc = ClusterCentroids(random_state=0)
    X_resampled, y_resampled = cc.fit_sample(X, y)
    
    4.1.3.3 ADASYN

    ADASYN根据数据分布情况为不同的少数类样本生成不同数量的新样本,为样本较少的类生成合成数据。基本思想是根据平衡程度的不同,对不同的少数类的样本使用加权分布。其中,更难平衡的少数类样本比那些更容易学习的少数类的样本要产生更多的合成数据(为每个少数类样本x计算分布比例)。因此,ADASYN方法通过以下两种方式改善了数据分布的学习:

    (1)减少由于类别不平衡带来的偏差;
    (2)自适应地将分类决策边界转移到困难的例子。

    from imblearn.over_sampling import ADASYN
    X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_sample(X, y)
    
    4.1.3.4 基于聚类的过采样方法

    以二分类为例,该方法是首先分别对正负例进行聚类在聚类之后进行再进行上述的过采样方法。例如:有一个二分类数据集,其正负类比例为:1000:50。

    1. 首先通过k-means算法对正负类分别聚类,得到正类:600,300,100;负类:30,20。
    2. 然后使用过采样的方法分别对所有类别进行过采样得到正类:600,600,600;对于负类的上采样个数为:(600+600+600)/2 = 900,即负类为:900,900。最终得到的数据集为正类1800,负类1800。

    基于聚类的过采样方法的优点是不仅可以解决类间不平衡问题,而且还能解决类内部不平衡问题。

    4.1.4 下采样方法的改进

    随机欠采样的问题主要是信息丢失,为了解决信息丢失的问题提出了以下几种改进的方式:

    4.1.4.1 EasyEnsemble

    EasyEnsemble,利用模型融合的方法(Ensemble):多次过采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。

    简单的最佳实践是建立n个模型,每个模型使用少数类的所有样本多数类的n个不同样本。假设二分类数据集的正负类比例为50000:1000,最后要得到10个模型,那么将保留负类的1000个样本,并随机采样得到10000个正类样本。然后,将10000个样本成10份,每一份与负类样本组合得到新的子训练集,训练10个不同的模型。拆分正类样本

    from imblearn.ensemble import EasyEnsemble
    ee = EasyEnsemble(random_state=0, n_subsets=10)
    X_resampled, y_resampled = ee.fit_sample(X, y)
    
    4.1.4.2 BalanceCascade

    BalanceCascade,利用增量训练的思想(Boosting)。先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的多数类样本不放回,然后对这个更小的多数类样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。

    from imblearn.ensemble import BalanceCascade
    from sklearn.linear_model import LogisticRegression
    bc = BalanceCascade(random_state=0,
              estimator=LogisticRegression(random_state=0),
              n_max_subset=4)
    X_resampled, y_resampled = bc.fit_sample(X, y)
    
    4.1.4.3 NearMiss

    NearMiss,利用KNN试图挑选那些最具代表性的多数类样本。首先计算出每个样本点之间的距离,通过一定规则来选取保留的多数类样本点。因此该方法的计算量通常很大。

    from imblearn.under_sampling import NearMiss 
    nm1 = NearMiss(random_state=0, version=1)
    X_resampled_nm1, y_resampled = nm1.fit_sample(X, y)
    

    4.1.5 交叉验证

    4.1.5.1 划分数据集

    划分数据仅将其随机划分,效果 有很大的随机性,无法保证数据划分后,解决了数据不平衡问题。

    from collections import Counter
    from sklearn.model_selection import train_test_split  #数据集划分
    #参数test_size表示数据集和测试集的划分比例
    x_train,x_test,y_train,y_test = train_test_split(datasets,labels,test_size=0.1,random_state=0) 
    

    4.1.5.2 K折交叉验证

    在k折交叉验证中,我们不重复地随机将训练数据集划分为k个,其中k-1个用于模型的训练,剩余的1个用于测试。重复此过程k次,每次实验都从K个部分中选择一个不同的部分作为测试数据,剩余的数据作为训练数据进行实验,最后把得到的K个实验结果平均,就得到了k个模型及对模型性能的评价。

    k折交叉验证的一个特例就是留一(leave-one-out,LOO)交叉验证法。在LOO中,我们将数据子集划分的数量等同于样本数(k=n),这样每次只有一个样本用于测试。当数据集非常小时,建议使用此方法进行验证。

    注意:使用过采样方法来解决不平衡问题时应适当地应用交叉验证。这是因为过采样会观察到罕见的样本,并根据分布函数应用自举生成新的随机数据,如果在过采样之后应用交叉验证,那么我们所做的就是将我们的模型过拟合于一个特定的人工引导结果。这就是为什么在过度采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有重复采样数据可以将随机性引入到数据集中,以确保不会出现过拟合问题。
    比直接划分数据效果要好,降低了随机性。但没有考虑到数据类别的问题

    from sklearn.model_selection import KFold   #交叉验证
    import numpy as np
    kf=KFold(n_splits=10)
    for train_index,test_index in kf.split(datasets,labels):
        x_train = np.array(datasets)[train_index]
        y_train = np.array(datasets)[train_index]
        x_test = np.array(datasets)[test_index]
        y_test = np.array(labels)[test_index]
    

    4.1.5.3 分层k折交叉验证

    分层k折交叉验证对标准k折交叉验证做了稍许改进,它可以获得偏差和方差都较低的评估结果,特别是类别比例相差较大时。在分层交叉验证中,类别比例在每个分块中得以保持,这使得每个分块中的类别比例与训练数据集的整体比例一致。但仍然是处于非平衡数据的状态。

    from sklearn.model_selection import StratifiedKFold #分层k折交叉验证
    import numpy as np
    kf = StratifiedKFold(n_splits=10, shuffle=True)
    for train_index, test_index in kf.split(datasets, labels):
        x_train = np.array(datasets)[train_index]
        y_train = np.array(datasets)[train_index]
        x_test = np.array(datasets)[test_index]
        y_test = np.array(labels)[test_index]
    

    4.1.6 一分类方法

    对于二分类问题,如果正负样本分布比例极不平衡,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等,如下图所示:
    在这里插入图片描述
    One Class SVM 是指你的训练数据只有一类正(或者负)样本的数据, 而没有另外的一类。在这时,你需要学习的实际上你训练数据的边界。而这时不能使用最大化软边缘了,因为你没有两类的数据。 所以,假设最好的边缘要远离特征空间中的原点。左边是在原始空间中的边界,可以看到有很多的边界都符合要求,但是比较靠谱的是找一个比较紧的边界(红色的)。这个目标转换到特征空间就是找一个离原点比较远的边界,同样是红色的直线。当然这些约束条件都是人为加上去的,你可以按照你自己的需要采取相应的约束条件。比如让你data 的中心离原点最远。

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

    4.1.7 加权

    除了采样和生成新数据等方法,我们还可以通过加权的方式来解决数据不平衡问题,即对不同类别分错的代价不同,如下图:
    在这里插入图片描述
    横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。

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

    4.2 小结

    方法选择:解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?接下来谈谈一些我的经验。

    1. 正负样本都非常之少的情况下,应该采用数据合成的方式,例如SMOTE算法和Borderline-SMOTE算法;
    2. 负样本足够多,正样本非常之少且比例及其悬殊的情况下,应该考虑一分类方法
    3. 在正负样本都足够多且比例不是特别悬殊的情况下,应该考虑采样或者加权的方法。
    4. 采样和加权在数学上是等价的,但实际应用中效果却有差别。尤其是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种情况下,如果计算资源允许上采样往往要比加权好一些。
    5. 另外,虽然上采样和下采样都可以使数据集变得平衡,并且在数据足够多的情况下等价,但两者也是有区别的。实际应用中,我的经验是如果计算资源足够且小众类样本足够多的情况下使用上采样,否则使用下采样,因为上采样会增加训练集的大小进而增加训练时间,同时小的训练集非常容易产生过拟合。
    6. 对于下采样,如果计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。

    注意:在选择采样法事需要注意一个问题,如果你的实际数据是数据不平衡的,在训练模型时发现效果不好,于是采取了采样法平衡的数据的比例再来进行训练,然后去测试数据上预测,这个时候算法的效果是否会有偏差呢?此时你的训练样本的分布与测试样本的分布已经发生了改变,这样做反而会产生不好的效果。在实际情况中,我们尽可能的需要保持训练和测试的样本的概率分布是一致的,如果测试样本的分布是不平衡的,那么训练样本尽可能与测试样本的分布保持一致,哪怕拿到手的是已经清洗和做过预处理后的平衡的数据。

    4.2评价指标

    在数据平衡的分类问题中,分类器好坏的评估指标常用准确率,但是对于数据不平衡的分类问题,准确率不再是恰当的评估指标。所以针对不平衡数据分类问题,常用f1-score、ROC-AUC曲线。
    f1-score计算公式
    TP:将正类预测为正类
    FN:将正类预测为负类
    FP:将负类预测为正类
    TN:将负类预测为负类
    在这里插入图片描述
    在这里插入图片描述
    ROC-AUC曲线
    ROC曲线的x轴是FPR(假阳性率)、y轴是TPR(真阳性率、召回率)
    AUC是ROC曲线与x轴所围成的面积
    在这里插入图片描述
    在这里插入图片描述
    关于分类评估指标的具体描述,会在以后的总结文章中提到。

    4.2.1 谨慎选择AUC作为评价指标:

    对于数据极端不平衡时,可以观察观察不同算法在同一份数据下的训练结果的precision和recall,这样做有两个好处,

    1. 可以了解不同算法对于数据的敏感程度,
    2. 可以明确采取哪种评价指标更合适。

    针对机器学习中的数据不平衡问题,建议更多PR(Precision-Recall曲线),而非ROC曲线,具体原因画图即可得知,如果采用ROC曲线来作为评价指标,很容易因为AUC值高而忽略实际对少两样本的效果其实并不理想的情况。

    4.2.2 不要只看Accuracy:

    Accuracy可以说是最模糊的一个指标了,因为这个指标高可能压根就不能代表业务的效果好,在实际生产中,我们可能更关注precision/recall/mAP等具体的指标,具体侧重那个指标,得结合实际情况看。

    4.3算法角度

    4.3.1 分类器集成方法

    首先从多数类中独立随机抽取出若干子集,将每个子集与少数类数据联合起来训练生成多个基分类器,再加权组成新的分类器,如加法模型、Adaboost、随机森林等。
    将boosting算法与 SMOTE算法结合成SMOTEBoost算法 , 该算法每次迭代使用SMOTE生成新的样本 ,取代原有 AdaBoost算法中对样本权值的调整, 使得Boosting算法专注于正类中的难分样本。

    4.3.2 代价敏感方法

    在大部分不平衡分类问题中 , 稀有类是分类的重点 .在这种情况下 , 正确识别出稀有类的样本比识 别大类的样本更有价值 .反过来说 , 错分稀有类的样 本需要付出更大的代价 .代价敏感学习赋予各个类别不同的错分代价 , 它能很好地解决不平衡分类 问题 .以两类问题为例 , 假设正类是稀有类 , 并具有 更高的错分代价 , 则分类器在训练时 , 会对错分正类 样本做更大的惩罚 , 迫使最终分类器对正类样本有更高的识别率 .如Metacost和Adacost等算法。

    代价敏感学习能有效地提高稀有类的识别率 . 但问题是 , 一方面 , 在多数情况下 , 真实的错分代价 很难被准确地估计.另一方面,虽然许多分类器 可以直接引入代价敏感学习机制 , 如支持向量机和 决策树 , 但是也有一些分类器不能直接使用代价敏感学习 , 只能通过调整正负样本比例或者决策阈值间接的实现代价敏感学习,这样不能保证代价敏感学习的效果。

    4.3.3 特征选择方法

    特征选择方法对于不平衡分类问题同样具有重要意义 .样本数量分布很不平衡时,特征的分布同样会不平衡.尤其在文本分类问题中,在大类中经常出现的特征,也许在稀有类中根本不出现 .因此 ,根据不平衡分类问题的特点 , 选取最具有区分能力的特征 ,有利于提高稀有类的识别率 .

    4.3.4 选择对数据倾斜相对不敏感的算法。

    如树模型等。

    五、参考文献

    https://blog.csdn.net/asialee_bird/article/details/83714612
    https://blog.csdn.net/heyongluoyao8/article/details/49408131
    https://zhuanlan.zhihu.com/p/88107139
    https://blog.csdn.net/Polaris47/article/details/89361043
    https://blog.csdn.net/shine19930820/article/details/54143241
    https://www.cnblogs.com/kamekin/p/9824294.html
    https://www.jianshu.com/p/f170d72f6fb6
    https://blog.csdn.net/lujiandong1/article/details/52658675
    https://www.cnblogs.com/charlotte77/p/10455900.html
    https://blog.csdn.net/guhongpiaoyi/article/details/73693868
    Imblearn包的使用

    展开全文
  • 处理数据不平衡

    万次阅读 多人点赞 2018-09-06 12:44:57
    数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。 一、数据不平衡 在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法...

    这几年来,机器学习和数据挖掘非常火热,它们逐渐为世界带来实际价值。与此同时,越来越多的机器学习算法从学术界走向工业界,而在这个过程中会有很多困难。数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。

    一、数据不平衡

    在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都无法取得理想的结果。因为实际数据往往分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。下图是新浪微博交互分布情况:

     

    可以看到大部分微博的总互动数(被转发、评论与点赞数量)在0-5之间,交互数多的微博(多于100)非常之少。如果我们去预测一条微博交互数所在档位,预测器只需要把所有微博预测为第一档(0-5)就能获得非常高的准确率,而这样的预测器没有任何价值。那如何来解决机器学习中数据不平衡问题呢?这便是这篇文章要讨论的主要内容。

    严格地讲,任何数据集上都有数据不平衡现象,这往往由问题本身决定的,但我们只关注那些分布差别比较悬殊的;另外,虽然很多数据集都包含多个类别,但这里着重考虑二分类,因为解决了二分类中的数据不平衡问题后,推而广之就能得到多分类情况下的解决方案。综上,这篇文章主要讨论如何解决二分类中正负样本差两个及以上数量级情况下的数据不平衡问题。

    不平衡程度相同(即正负样本比例类似)的两个问题,解决的难易程度也可能不同,因为问题难易程度还取决于我们所拥有数据有多大。比如在预测微博互动数的问题中,虽然数据不平衡,但每个档位的数据量都很大——最少的类别也有几万个样本,这样的问题通常比较容易解决;而在癌症诊断的场景中,因为患癌症的人本来就很少,所以数据不但不平衡,样本数还非常少,这样的问题就非常棘手。综上,可以把问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。说明:对于小数据集,机器学习的方法是比较棘手的。对于需要解决的问题,拿到数据后,首先统计可用训练数据有多大,然后再观察数据分布情况。经验表明,训练数据中每个类别有5000个以上样本,其实也要相对于特征而言,来判断样本数目是不是足够,数据量是足够的,正负样本差一个数量级以内是可以接受的,不太需要考虑数据不平衡问题(完全是经验,没有理论依据,仅供参考)。

    二、如何解决

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

    1. 采样

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

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

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

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

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

    2. 数据合成

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

     

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

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

     

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

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

    4. 一分类

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

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

    三、如何选择

    解决数据不平衡问题的方法有很多,上面只是一些最常用的方法,而最常用的方法也有这么多种,如何根据实际问题选择合适的方法呢?接下来谈谈一些我的经验。

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

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

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

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

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

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

     

    原文地址:一只鸟的天空,http://blog.csdn.net/heyongluoyao8/article/details/49408131

    在分类中如何处理训练集中不平衡问题

      在很多机器学习任务中,训练集中可能会存在某个或某些类别下的样本数远大于另一些类别下的样本数目。即类别不平衡,为了使得学习达到更好的效果,因此需要解决该类别不平衡问题。

    Jason Brownlee的回答:

    原文标题:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset 
      当你在对一个类别不均衡的数据集进行分类时得到了90%的准确度(Accuracy)。当你进一步分析发现,数据集的90%的样本是属于同一个类,并且分类器将所有的样本都分类为该类。在这种情况下,显然该分类器是无效的。并且这种无效是由于训练集中类别不均衡而导致的。 
      首先举几个所收到的邮件中关于类别不均衡的例子:

    • 在一个二分类问题中,训练集中class 1的样本数比class 2的样本数是60:1。使用逻辑回归进行分类,最后结果是其忽略了class 2,即其将所有的训练样本都分类为class 1。
    • 在分类任务的数据集中,有三个类别,分别为A,B,C。在训练集中,A类的样本占70%,B类的样本占25%,C类的样本占5%。最后我的分类器对类A的样本过拟合了,而对其它两个类别的样本欠拟合。

    什么是类别不均衡问题

      类别数据不均衡是分类任务中一个典型的存在的问题。简而言之,即数据集中,每个类别下的样本数目相差很大。例如,在一个二分类问题中,共有100个样本(100行数据,每一行数据为一个样本的表征),其中80个样本属于class 1,其余的20个样本属于class 2,class 1:class2=80:20=4:1,这便属于类别不均衡。当然,类别不均衡问同样会发生在多分类任务中。它们的解决方法是一样的。因此,为了便于讨论与理解,我们从二分类任务入手进行讲解。

    类别不均衡问题是现实中很常见的问题

      大部分分类任务中,各类别下的数据个数基本上不可能完全相等,但是一点点差异是不会产生任何影响与问题的。 
      在现实中有很多类别不均衡问题,它是常见的,并且也是合理的,符合人们期望的。如,在欺诈交易识别中,属于欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。这就是一个正常的类别不均衡问题。又如,在客户流失的数据集中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。 
      在前面,我们使用准确度这个指标来评价分类质量,可以看出,在类别不均衡时,准确度这个评价指标并不能work。因为分类器将所有的样本都分类到大类下面时,该指标值仍然会很高。即,该分类器偏向了大类这个类别的数据。

    八大解决方法

    • 可以扩大数据集吗? 
        当遇到类别不均衡问题时,首先应该想到,是否可能再增加数据(一定要有小类样本数据),更多的数据往往战胜更好的算法。因为机器学习是使用现有的数据多整个数据的分布进行估计,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分大类数据(即对大类数据进行欠采样)来解决。
    • 尝试其它评价指标 
        从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能work,甚至进行误导(分类器不work,但是从这个指标来看,该分类器有着很好的评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。如何对不同的问题选择有效的评价指标参见这里。 
        上面的超链接中的文章,讲述了如何对乳腺癌患者复发类别不均衡数据进行分类。在文中,推荐了几个比传统的准确度更有效的评价指标:

      • 混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
      • 精确度(Precision)
      • 召回率(Recall)
      • F1得分(F1 Score):精确度与找召回率的加权平均。

        特别是:

    • 对数据集进行重采样 
        可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。

      • 对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
      • 对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。

        采样算法往往很容易实现,并且其运行速度快,并且效果也不错。更详细的内容参见这里。 
        一些经验法则:

      • 考虑对大类下的样本(超过1万、十万甚至更多)进行欠采样,即删除部分样本;
      • 考虑对小类下的样本(不足1为甚至更少)进行过采样,即添加部分样本的副本;
      • 考虑尝试随机采样与非随机采样两种采样方法;
      • 考虑对各类别尝试不同的采样比例,比一定是1:1,有时候1:1反而不好,因为与现实情况相差甚远;
      • 考虑同时使用过采样与欠采样。
    • 尝试产生人工数据样本 
        一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。 
        有一个系统的构造人工数据样本的方法SMOTE(Synthetic Minority Over-sampling Technique)。SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本,即该算法构造的数据是新样本,原数据集中不存在的。该基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了更多的新生数据。具体可以参见原始论文。 
        这里有SMOTE算法的多个不同语言的实现版本: 
    • 尝试不同的分类算法 
        强烈建议不要对待每一个分类都使用自己喜欢而熟悉的分类算法。应该使用不同的算法对其进行比较,因为不同的算法使用于不同的任务与数据。具体可以参见“Why you should be Spot-Checking Algorithms on your Machine Learning Problems”。 
        决策树往往在类别不均衡数据上表现不错。它使用基于类变量的划分规则去创建分类树,因此可以强制地将不同类别的样本分开。目前流行的决策树算法有:C4.5、C5.0、CART和Random Forest等。基于R编写的决策树参见这里。基于Python的Scikit-learn的CART使用参见这里
    • 尝试对模型进行惩罚 
        你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集,译者注),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。如penalized-SVM和penalized-LDA算法。 
        Weka中有一个惩罚模型的通用框架CostSensitiveClassifier,它能够对任何分类器进行封装,并且使用一个自定义的惩罚矩阵对分错的样本进行惩罚。 
        如果你锁定一个具体的算法时,并且无法通过使用重采样来解决不均衡性问题而得到较差的分类结果。这样你便可以使用惩罚模型来解决不平衡性问题。但是,设置惩罚矩阵是一个复杂的事,因此你需要根据你的任务尝试不同的惩罚矩阵,并选取一个较好的惩罚矩阵。
    • 尝试一个新的角度理解问题 
        我们可以从不同于分类的角度去解决数据不均衡性问题,我们可以把那些小类的样本作为异常点(outliers),因此该问题便转化为异常点检测(anomaly detection)与变化趋势检测问题(change detection)。 
        异常点检测即是对那些罕见事件进行识别。如通过机器的部件的振动识别机器故障,又如通过系统调用序列识别恶意程序。这些事件相对于正常情况是很少见的。 
        变化趋势检测类似于异常点检测,不同在于其通过检测不寻常的变化趋势来识别。如通过观察用户模式或银行交易来检测用户行为的不寻常改变。 
        将小类样本作为异常点这种思维的转变,可以帮助考虑新的方法去分离或分类样本。这两种方法从不同的角度去思考,让你尝试新的方法去解决问题。
    • 尝试创新 
        仔细对你的问题进行分析与挖掘,是否可以将你的问题划分成多个更小的问题,而这些小问题更容易解决。你可以从这篇文章In classification, how do you handle an unbalanced training set?中得到灵感。例如: 
      • 将你的大类压缩成小类;
      • 使用One Class分类器(将小类作为异常点);
      • 使用集成方式,训练多个分类器,然后联合这些分类器进行分类;
      • ….

      这些想法只是冰山一角,你可以想到更多的有趣的和有创意的想法去解决问题。更多的想法参加Reddit的文章http://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

    选择某一种方法并使用它

      你不必成为一个精通所有算法的算法奇才或者一个建立准确而可靠的处理数据不平衡的模型的统计学家,你只需要根据你的问题的实际情况从上述算法或方法中去选择一种或两种方法去使用。希望上述的某些方法能够解决你的问题。例如使用其它评价指标或重采样算法速度快并且有效。

    总结

      记住,其实并不知道哪种方法最适合你的任务与数据,你可以使用一些启发式规则或经验去选择某一个较优算法。当然最好的方法测试每一种算法,然后选择最好的方法。最重要的是,从点滴开始做起,根据自己现有的知识,并不断学习去一步步完善。

    Further Reading…

      这里有一些我认为有价值的可供参考的相关资料,让你进一步去认识与研究数据不平衡问题:

    Sergey Feldman的回答:

    • 设超大类中样本的个数是极小类中样本个数的L倍,那么在随机梯度下降(SGD,stochastic gradient descent)算法中,每次遇到一个极小类中样本进行训练时,训练L次。
    • 将大类中样本划分到L个聚类中,然后训练L个分类器,每个分类器使用大类中的一个簇与所有的小类样本进行训练得到。最后对这L个分类器采取少数服从多数对未知类别数据进行分类,如果是连续值(预测),那么采用平均值。
    • 设小类中有N个样本。将大类聚类成N个簇,然后使用每个簇的中心组成大类中的N个样本,加上小类中所有的样本进行训练。
    • 无论你使用前面的何种方法,都对某个或某些类进行了损害。为了不进行损害,那么可以使用全部的训练集采用多种分类方法分别建立分类器而得到多个分类器,采用投票的方式对未知类别的数据进行分类,如果是连续值(预测),那么采用平均值。
    • 最近的ICML论文中,表明增加数据量使得已知分布的训练集的误差增加了,即破坏了原有训练集的分布,从而可以提高分类器的性能。这篇论文与类别不平衡问题不相关,因为它隐式地使用数学方式增加数据而使得数据集大小不变。但是,我认为破坏原有的分布是有益的。
    • More details than you need: imho, the most interesting of the corrupting distributions is the blankout distribution, where you just zero out a random subset of features. Why is it interesting? Because you are helping your classifier be sturdier/hardier by giving it variations of your data that have essentially missing features. So it has to learn to classify correctly even in adverse conditions. 一个相关的想法是,在神经网络中,随机选择部分隐藏层单元来继续训练(即,随机去掉一部分隐藏层单元,(zeroed-out))。具体见http://web.stanford.edu/~sidaw/cgi-bin/home/lib/exe/fetch.php?media=papers:fastdropout.pdf

    Kripa Chettiar的回答:

    • 增加新数据,可以使用SMOTE或SMOTEBoost产生人造数据。
    • 将大类压缩。压缩比例需要具体情况具体分析,取决于你所拥有的数据。例如,A类中有30个样本,B类中有4000个样本,那么你可以将B类压缩成1000(进行采样)。
    • 可以结合1与2
    • 对于那种极小类是异常点的分类任务,因此分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)。Weka中有相关的库
    • 获得更多的数据。

    Roar Nybø的回答:

    • 对小类进行过采样。并且使用集成模式会获得更好的效果。

    Dan Levin的回答:

    • 一个很好的方法去处理非平衡数据问题,并且在理论上证明了。这个方法便是由Robert E. Schapire于1990年在Machine Learning提出的”The strength of weak learnability” ,该方法是一个boosting算法,它递归地训练三个弱学习器,然后将这三个弱学习器结合起形成一个强的学习器。我们可以使用这个算法的第一步去解决数据不平衡问题。 
        首先使用原始数据集训练第一个学习器L1。 
        然后使用50%在L1学习正确和50%学习错误的的那些样本训练得到学习器L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。 
        接着,使用L1与L2不一致的那些样本去训练得到学习器L3。 
        最后,使用投票方式作为最后输出。 
        那么如何使用该算法来解决类别不平衡问题呢? 
        假设是一个二分类问题,大部分的样本都是true类。让L1输出始终为true。使用50%在L1分类正确的与50%分类错误的样本训练得到L2,即从L1中学习错误的样本集与学习正确的样本集中,循环一边采样一个。因此,L2的训练样本是平衡的。L使用L1与L2分类不一致的那些样本训练得到L3,即在L2中分类为false的那些样本。最后,结合这三个分类器,采用投票的方式来决定分类结果,因此只有当L2与L3都分类为false时,最终结果才为false,否则true。 
        自己已经在实践中使用过很多次,并且效果都不错。

    Kaushik Kasi的回答:

    • 对小类中的样本进行复制以增加该类中的样本数,但是可能会增加bias。
    • 对小类中的样本通过调整特征值来人工生成样本,而使得该类中样本个数增多。如在图像中,对一幅图像进行扭曲得到另一幅图像,即改变了原图像的某些特征值。但是该方法可能会产生现实中并存在的样本。

    Quora User的回答:

    • 简单快速的方法:对大类欠采样或者对小类过采样。
    • 更有效的方法:使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

    Dayvid Victor的回答:

      在类别不平衡中,以下几个点需要注意:

    • 常规的分类评价指标可能会失效,比如将所有的样本都分类成大类,那么准确率、精确率等都会很高。这种情况下,AUC时最好的评价指标。
    • 你能够使用原型选择技术去降低不平衡水平。选择那些重要的样本。One-Sided Selection (OSS) 是一个预处理技术(模型训练之前使用),能够处理类别不平衡问题。
    • 从另一个角度,可以增加小类的样本个数,可以使用过采样与原型生成技术(prototype-generation techniques)。
    • 在K-Fold 校验中,每一份数据集中原则上应该保持类别样本比例一样或者近似,如果每份数据集中小类样本数目过少,那么应该降低K的值,知道小类样本的个数足够。 
        一般来说,如果事前不对不平衡问题进行处理,那么对于小类别的样本则会错误率很高,即大部分甚至全部小类样本都会分错。

    Muktabh Mayank的回答:

    Sandeep Subramanian的回答:

    Quora User的回答:

    • 赋予小类样本更高的训练权值
    • 对小类进行过采样
    • 某些时候,高不平衡性下仍然可以得到效果较好的训练结果。我认为对于某些评价指标是有意义的,如AUC。

    Sumit Soman 的回答:

    Abhishek Ghose的回答:

      参见:Abhishek Ghose’s answer to What’s the most efficient classification algorithm for unbalanced data sets? And what pre-processing could be done to optimize the score?

    原文:https://www.quora.com/In-classification-how-do-you-handle-an-unbalanced-training-set

     
    展开全文
  • R语言解决数据不平衡问题

    千次阅读 2019-07-07 11:16:23
    R语言解决数据不平衡问题 一、项目环境 开发工具:RStudio R:3.5.2 相关包:dplyr、ROSE、DMwR 二、什么是数据不平衡?为什么要处理数据不平衡? ​ 首先我们要知道的第一个问题就是“什么是数据不平衡”,从字面...

    R语言解决数据不平衡问题

    一、项目环境

    • 开发工具:RStudio
    • R:3.5.2
    • 相关包:dplyr、ROSE、DMwR

    二、什么是数据不平衡?为什么要处理数据不平衡?

    ​ 首先我们要知道的第一个问题就是“什么是数据不平衡”,从字面意思上进行解释就是数据分布不均匀。在我们做有监督学习的时候,数据中有一个类的比例远大于其他类,或者有一个类的比值远小于其他类时,我们就可以认为这个数据存在数据不平衡问题

    ​ 那么这样的一个问题会对我们后续的分析工作带来怎样的影响呢?我举个简单的例子,或许大家就明白了。假设我们现在需要训练一个模型来分辨人群中那个人是恐怖分子。那么现在给到我们1万个人员的数据,在做分析之前其实我们就很清楚,一群人中恐怖分子的比例肯定是要远小于普通人的比例的。那么假如在这1万个人中只有一个是恐怖分子,那么恐怖分子与正常人的比例就是 9999 : 1 。那么如果我们不进行任何处理就直接进行有监督学习的话,那么模型只需要将所有人数据都分类为正常人,模型的准确率就能达到99.99%。而这样的模型显然是没有意义的。因为基本上说有可能存在的恐怖分子的特征基本都被模型给忽略了,这也就说明了为什么要处理数据不平衡问题。

    三、 常见的数据不平衡处理方法

    以下是几种比较常见的处理数据不平衡的方法:

    1. 欠采样法(Undersampling)
    2. 过采样法(Oversampling)
    3. 人工数据合成法(Synthetic Data Generation)
    4. 代价敏感学习法(Cose Sensitive Learning)

    【注】:本文主要以实现为主,因此不对上述方法进行过多的讲解。

    感兴趣可以参考:https://mp.weixin.qq.com/s/m8M3I4vkOq44vguGAB5ccA


    ​ 在处理数据之前,我们先看一下需要处理的数据分布的情况。

    load("C:/Users/User/Desktop/data.RData")
    
    table(data$classification)
    
    prop.table(table(data$classification))
    

    > table(data$classification)

    -8 1 2 3 4 5
    12 104 497 1158 4817 1410

    > prop.table(table(data$classification))

    -8 1 2 3 4 5
    0.001500375 0.013003251 0.062140535 0.144786197 0.602275569 0.176294074

    1、 欠采样

    ######### 方法一 #########
    
    library(ROSE)
    # 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类
    # 进行平衡(转化为二分类问题)
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    # 将分类结果转化为因子型(不然会报错)
    test$classification <- as.factor(test$classification)
    
    # 进行欠采样
    # 其中 method = "under" 表示采用的方法为“欠采样”
    # N = 40 表示最终整个数据集的数量
    # seed 随机种子,为了保留对样本的追踪
    under <- ovun.sample(classification ~ ., test, method = "under", N = 40, seed = 1)$data
    
    # 查看结果
    table(under$classification)
    

    > table(under$classification)

    4 -8
    28 12


    ######### 方法二 #########
    
    library(dplyr)
    # 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类
    # 进行平衡(转化为二分类问题)
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    # 提取大比例类
    test1 <- test[which(test$classification == 4),]
    
    # 将大比例类的数量降为12个
    down <- sample_n(test1, 12, replace = TRUE)
    
    # 将欠采样后的类进行合并
    down <- rbind(test[which(test$classification == -8), ],down)
    
    table(down$classification)
    

    > table(down$classification)

    -8 4
    12 12

    【注】:欠采样是无放回的采样。

    2、 过采样

    ######### 方法一 #########
    library(ROSE)
    
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    test$classification <- as.factor(test$classification)
    
    # 实现上大致与欠采样相同,只有类型 method 改成了 "over",同时没有限制总数量
    under <- ovun.sample(classification ~ ., test, method = "over", seed = 1)$data
    
    table(under$classification)
    

    > table(under$classification)

    4 -8
    4817 4785


    ######### 方法二 #########
    library(dplyr)
    
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    # 提取小比例类
    test1 <- test[which(test$classification == -8),]
    
    # 将小比例类的数量降为4817个(与大比例类相同)
    # 这里使用的过采样方法是随机复制小比例类中的数据,将其扩充到指定数量
    down <- sample_n(test1, 4817, replace = TRUE)
    
    down <- rbind(test[which(test$classification == 4), ],down)
    
    table(down$classification)
    

    > table(down$classification)

    -8 4
    4817 4817

    3、人工数据合成法(Synthetic Data Generation)

    ######### 方法一 #########
    
    library(ROSE)
    # 由于是多分类问题,我们先提取数据中比例最大的类和比例最小的类
    # 进行平衡(转化为二分类问题)
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    # 将分类结果转化为因子型(不然会报错)
    test$classification <- as.factor(test$classification)
    
    # ROSE提供了ROSE()函数来合成人工数据
    rose <- ROSE(classification ~ ., test, seed = 1)$data
    
    # 查看结果
    table(rose$classification)
    
    

    > table(rose$classification)

    4 -8
    2483 2346


    ######### 方法二 #########
    
    library(DMwR)
    
    test <- data[which(data$classification == -8 | data$classification == 4),]
    
    test$classification <- as.factor(test$classification)
    
    # perc.over: 如 perc.over = n,小比例类的个数变为 (n/100)a + a 个数据(a为小比例类原始数量)
    # perc.under: 如 perc.under = m,大比例类的个数变为((nm)/100)a个
    # 因此本次案例中,小比例类的个数变为(3500/100)*12 + 12 = 432个
    # 大比例类的个数变为((3500*300)/100^2)*12 = 1260个
    down <- SMOTE(classification ~ ., test, perc.over = 3500, perc.under = 300)
    
    table(down$classification)
    

    > table(down$classification)

    -8 4
    432 1260

    【注】:相较于前两种方法而言,人工合成法既不会像过采样容易导致过拟合问题,也不会出现欠采样大量丢失信息的问题。

    4、代价敏感学习法(Cose Sensitive Learning)

    【注】:还没想好怎么写。。。。。

    三、 结语

    ​ 本文之所以都只拿两个分类在进行分析,是因为上面提到的用于解决数据不平衡问题的函数,基本上都是针对二分类问题的。当导入的数据中有大于两个分类时,函数就会报错。但是在实际分析的过程中,其实我们更经常遇到的时多分类问题,这是我们就需要将多分类问题转化为二分类问题,将各个分类两两进行比较才能更好的解决数据不平衡的问题。


    很长一段时间没有在csdn中写文章了,事实上后面自己学习过程中的大部分文档都是在语雀中完成的,基本都是自己写自己看。不过后面打算弄个公众号来更新和分享自己写的笔记_(:з」∠)_ 。如果感兴趣的话也可以关注一下。不感兴趣就算了(っ╥╯﹏╰╥c)。
    在这里插入图片描述
    然后写着个的另外一个原因就是,我可能会把一些文档搬运到自己的公众号,为了避免被说抄袭,所以说明一下。这样子_(:з」∠)_。

    展开全文
  • 数据不平衡的处理方法

    千次阅读 2019-04-05 22:20:30
    数据不平衡经常出现在分类问题上,数据不平衡指的是在数据集中不同类别的样本数量差距很大,比如,在病人是否得癌症的数据集上,可能绝大部分的样本类别都是健康的,只有极少部分样本类别是患病的。下面介绍几个常用...
  • 如何处理数据不平衡问题 前言 在您正在处理数据集时您可以创建分类模型并立即获得90%的准确度。你觉得“非常不错”。但是当你深入一点时,发现90%的数据属于一个类。 这是一个不平衡数据集的例子,它可能导致令人...
  • 大多数用于分类的机器学习算法都是在假设平衡类的情况下开发的,然而,在现实生活中,拥有适当平衡数据常见。因此,人们提出了各种方案来解决这个问题,以及一些应用这些解决方案的工具或者类库。例如,...
  • 数据处理之数据不平衡问题

    千次阅读 2017-10-28 21:11:41
    最近有被频繁的问到数据不平衡(样本比例失衡)问题,而这一部分在日常数据处理中也算是比较重要的一部分了,处理的好坏对后续的模型训练结果还是会有很大的影响的,今天就专门归纳总结一下,以供以后参考。1.数据不...
  • 数据不平衡问题——SMOTE算法赏析

    千次阅读 2019-02-23 13:52:13
    春节前后好久没有总结问题了,这一段时间一直在做NLP的文本分类(二分类)问题,遇到了各种问题 。分别如下: ...2、数据不平衡问题。T:F为1:10,重新筛选样本以后达到了T:F为1:17。  实在是数...
  • 数据不平衡是机器学习任务中的一个常见问题。真实世界中的分类任务中,各个类别的样本数量往往不是完全平衡的,某一或某些类别的样本数量远少于其他类别的情况经常发生,我们称这些样本数量较少的类别为少数类,与之...
  • 数据不平衡问题及解决方案

    千次阅读 2020-06-11 22:44:13
    1.数据不平衡 1.1 数据不平衡介绍 数据不平衡,又称样本比例失衡。对于二分类问题,在正常情况下,正负样本的比例应该是较为接近的,很多现有的分类模型也正是基于这一假设。但是在某些特定的场景下,正负样本的比例...
  • 如何解决数据不平衡问题

    千次阅读 2018-08-20 11:05:10
    数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。 2. 数据不平衡 在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都...
  • 机器学习中的数据不平衡解决方案大全

    万次阅读 多人点赞 2017-06-09 19:37:12
    在机器学习任务中,我们经常会遇到这种困扰:数据不平衡问题。 数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时,以总体分类准确率为学习目标的传统分类算法会过多地关注多数类,从而使得少数类...
  • 数据不平衡问题总结

    千次阅读 2018-07-08 20:09:49
    1.数据不平衡1.1 数据不平衡介绍数据不平衡,又称样本比例失衡。对于二分类问题,在正常情况下,正负样本的比例应该是较为接近的,很多现有的分类模型也正是基于这一假设。但是在某些特定的场景下,正负样本的比例却...
  • 数据不平衡处理方法

    千次阅读 2017-06-24 19:16:02
    在机器学习任务中,我们经常会遇到这种困扰:数据不平衡问题。 数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时,以总体分类准确率为学习目标的传统分类算法会过多地关注多数类,从而使得少数...
  • 数据预处理--克服数据不平衡

    千次阅读 2018-12-04 09:50:45
    不平衡数据评估指标   1)单一评估指标、ROC曲线和PR曲线见机器学习:准确率(Precision)、召回率(Recall)、F值(F-Measure)、ROC曲线、PR曲线   2)除此之外,Cost Function也可以作为一个指...
  • 数据不平衡又称样本比例失衡,比如二分类问题,如果标签为1的样本占总数的99%,标签为0的样本占比1%则会导致判断「失误严重」,准确率虚高。 常见的解决不平衡问题的方法如下。 「数据采样」 数据采样分为上采样...
  • 如何解决机器学习中数据不平衡问题

    万次阅读 多人点赞 2016-09-25 10:45:05
    数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。 一、数据不平衡 在学术研究与教学中,很多算法都有一个基本假设,那就是数据分布是均匀的。当我们把这些算法直接应用于实际数据时,大多数情况下都...
  • 数据平衡、平衡采样、调整分类阈值、过采样、欠采样、SMOTE、EasyEnsemble、加入数据平衡的流程、BalanceCascade、代价敏感学习 目录 数据平衡、平衡采样、调整分类阈值、过采样、欠采样、SMOTE、...
  • 分类问题中的数据不平衡问题

    万次阅读 2017-05-09 11:22:43
    即类别不平衡,为了使得学习达到更好的效果,因此需要解决该类别不平衡问题。Jason Brownlee的回答:原文标题:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset   当你在对一个类别...
  • 摘要:本文的主要目标是处理数据不平衡问题。文中描述了用来克服数据不平衡问题的三种技术,分别是集成交叉验证、类别权重以及过大预测 。 对于深度学习而言,数据集非常重要,但在实际项目中,或多或少会碰见数据不...
  • 即类别不平衡,为了使得学习达到更好的效果,因此需要解决该类别不平衡问题。Jason Brownlee的回答:原文标题:8 Tactics to Combat Imbalanced Classes in Your Machine Learning Dataset   当你在对一个类别...
  • 越来越多的机器学习算法从学术界走向工业界,而在这个过程中会有很多困难,数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。 一 数据不平衡 在学术研究和教学中,很多算法都有一个基本假设,就是数据...
  • 数据不平衡问题,损失函数的处理

    千次阅读 2019-10-31 18:57:49
    转自: https://blog.csdn.net/weixin_35653315/article/details/78327408
  • 下采样(处理数据不平衡问题)

    千次阅读 2018-10-17 11:01:44
    import pandas as pd import matplotlib.pyplot as plt import numpy as np from sklearn.preprocessing import StandardScaler#去均值,方差归一化,类似于特征缩放 ...用来处理数据不平衡问题。  
  • 处理数据不平衡问题1. 传统方法1.1 随机过采样1.2 欠采样1.3 数据合成2. 利用keras中的fit方法里的参数2.1 class_weight2.1.1 利用sklearn.utils.class_weight来计算权重2.1.2 计算total_num/sample_num*t来设置权重...
  • 解决样本均衡的方法主要包括两类:(1)数据层面,修改各类别的分布;(2)分类器层面,修改训练算法或目标函数进行改进。还有方法是将上述两类进行融合。 数据层面 1. 过采样 (1) 基础版本的过采样:随机过...
  • 过采样(处理数据不平衡问题)

    万次阅读 2018-10-18 15:25:38
    方法:当数据不平衡的时,比如样本标签1有10000个数据,样本标签0有100个数据,这时如果采用下采样会浪费很多样本, 所以引入过采样,过采样是根据样本标签少的样本的规律去生成更多该标签样本,这样使得数据趋向...
  • Handle Imbalanced Classes In Random Forest   Preliminaries ...类别不平衡处理方法: https://segmentfault.com/a/1190000015248984 转载于:https://www.cnblogs.com/Allen-rg/p/10441792.html

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 411,254
精华内容 164,501
关键字:

数据不平衡