精华内容
下载资源
问答
  • 一、不平衡数据集的定义所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据...

    一、不平衡数据集的定义

    所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据称为不平衡数据。不平衡数据的学习即需要在分布不均匀的数据集中学习到有用的信息。

    不平衡数据集的处理方法主要分为两个方面:

    1、从数据的角度出发,主要方法为采样,分为欠采样和过采样以及对应的一些改进方法。

    2、从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost;

    另外可以将不平衡数据集的问题考虑为一分类(One Class Learning)或者异常检测(Novelty Detection)问题,代表的算法有One-class SVM。

    本文主要介绍从数据角度出发的不平衡数据集的处理方法以及对应的python库(imblearn)。

    二、从数据角度出发的不平衡数据集的处理方法

    2-1、随机采样

    2-1-1、朴素随机过采样(上采样)

    针对不平衡数据, 最简单的一种方法就是生成少数类的样本, 这其中最基本的一种方法就是: 从少数类的样本中进行随机采样来增加新的样本,对应Python库中函数为RandomOverSampler:

    from imblearn.over_sampling

    import RandomOverSampler

    ros = RandomOverSampler(random_state=0)

    X_resampled, y_resampled = ros.fit_sample(X, y)

    2-1-2、朴素随机欠采样(下采样)

    与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。

    随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。

    对应Python库中函数为RandomUnderSampler,通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。

    2-1-3、随机采样的优缺点

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

    上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。

    为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效,但是这一方式会加重过拟合。

    2-2、过采样的改进:SMOTE与ADASYN

    相对于采样随机的方法进行过采样, 还有两种比较流行的过采样的改进方式:

    (1)、Synthetic Minority Oversampling Technique(SMOTE)

    (2)、Adaptive Synthetic (ADASYN)

    2-2-1、SMOTE

    SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体下图所示,算法流程如下:

    1、对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。

    2、根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x'。

    3、对于每一个随机选出的近邻x',分别与原样本按照如下的公式构建新的样本:

    xnew=x+rand(0,1) ∗ (x′−x)

    但是SMOTE算法缺点也十分明显:一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题),

    另一方面是生成一些没有提供有益信息的样本。

    SMOTE算法图

    对应Python库中函数为SMOTE:

    from imblearn.over_sampling import SMOTE

    X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)

    2-2-2、SMOTE的改进:Borderline-SMOTE

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

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

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

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

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

    (iii) 安全样本(safe), 所有的最近邻样本都来自于同一个类。

    Borderline-SMOTE算法

    对应的Python库中的实现有三种可以选择的规则:

    SMOTE函数中的kind参数控制了选择哪种规则:

    borderline1:最近邻中的随机样本与该少数类样本a来自于不同的类;

    borderline2:最近邻中的随机样本可以是属于任何一个类的样本;

    svm:使用支持向量机分类器产生支持向量然后再生成新的少数类样本。

    具体实现如下:

    from imblearn.under_sampling

    import ClusterCentroids

    cc = ClusterCentroids(random_state=0)

    X_resampled, y_resampled = cc.fit_sample(X, y)

    2-2-3、ADASYN

    这种改进方法的主要思想是根据数据分布情况为不同的少数类样本生成不同数量的新样本。首先根据最终的平衡程度设定总共需要生成的新少数类样本数量 ,然后为每个少数类样本x计算分布比例。

    对应Python库中函数为ADASYN:

    from imblearn.over_sampling import ADASYN

    X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_sample(X, y)

    2-2-4、基于聚类的过采样方法

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

    得到正类:600,300,100;负类:30,20。然后使用过采样的方法分别对所有类别进行过采样得到正类:600,600,600;对于负类的上采样个数为:(600+600+600)/2 = 900,即负类为:900,900。

    最终得到的数据集为正类1800,负类1800。基于聚类的过采样方法的优点是不仅可以解决类间不平衡问题,而且还能解决类内部不平衡问题。

    2-3、欠采样的改进:EasyEnsemble、BalanceCascade与NearMiss

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

    1、EasyEnsemble,利用模型融合的方法(Ensemble):

    多次过采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。简单的最佳实践是建立n个模型,每个模型使用少数类的所有样本和多数类的n个不同样本。假设二分类数据集的正负类比例为50000:1000,最后要得到10个模型,那么将保留负类的1000个样本,并随机采样得到10000个正类样本。

    然后,将10000个样本成10份,每一份与负类样本组合得到新的子训练集,训练10个不同的模型。

    2、BalanceCascade,利用增量训练的思想(Boosting):

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

    3、NearMiss,利用KNN试图挑选那些最具代表性的多数类样本:

    首先计算出每个样本点之间的距离,通过一定规则来选取保留的多数类样本点。因此该方法的计算量通常很大。

    2-3-1、上述方法的Python实现

    EasyEnsemble:

    EasyEnsemble方法对应Python库中函数为EasyEnsemble,有两个很重要的参数: (i) n_subsets控制的是子集的个数 ;(ii) replacement决定是有放回还是无放回的随机采样。

    from imblearn.ensemble

    import EasyEnsemble

    ee = EasyEnsemble(random_state=0, n_subsets=10)

    X_resampled, y_resampled = ee.fit_sample(X, y)

    BalanceCascade:

    BalanceCascade方法对应Python库中函数为BalanceCascade,有三个很重要的参数: (i) estimator是选择使用的分类器;(ii) n_max_subset控制的是子集的个数;(iii)  bootstrap决定是有放回还是无放回的随机采样。

    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)

    NearMiss:

    NearMiss方法对应Python库中函数为NearMiss,通过version来选择使用的规则:

    NearMiss-1:选择离N个近邻的负样本的平均距离最小的正样本;

    NearMiss-2:选择离N个负样本最远的平均距离最小的正样本;

    NearMiss-3:是一个两段式的算法。 首先,对于每一个负样本, 保留它们的M个近邻样本;接着, 那些到N个近邻样本平均距离最大的正样本将被选择。

    from imblearn.under_sampling

    import NearMiss nm1 = NearMiss(random_state=0, version=1)

    X_resampled_nm1, y_resampled = nm1.fit_sample(X, y)

    所有方法的简单实验效果可以见:不平衡数据分类算法介绍与比较

    2-4、不平衡问题其他的处理方式

    除了上述提到的过采样与欠采样的方法之外,还可以将多种方法进行组合使用。

    另外还可以通过为不同的样本点赋予不同的权重的方式来处理不平衡问题(与改进损失函数的方式有所类似)。

    在算法层面除了对算法本身的改进之外,还需要关注模型的评价指标,来确认使用的方法是否有效。

    个人实践发现,组合方法的结果会比单一某种方法会好很多,例如SMOTEENN和SMOTETomek。

    参考文献:

    [1].不均衡学习的抽样方法

    [2].机器学习︱非平衡数据处理方式与评估

    [3].数据不平衡问题的处理

    [4].不平衡数据的机器学习

    [5].数据不平衡imblearn算法汇总

    [6].不平衡数据分类算法介绍与比较

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

    2019-09-30 12:22:20
    一、不平衡数据集的定义 所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的...

    一、不平衡数据集的定义

     所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据称为不平衡数据。不平衡数据的学习即需要在分布不均匀的数据集中学习到有用的信息。

    不平衡数据集的处理方法主要分为两个方面:

    1、从数据的角度出发,主要方法为采样,分为欠采样和过采样以及对应的一些改进方法。

    2、从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost;

    另外可以将不平衡数据集的问题考虑为一分类(One Class Learning)或者异常检测(Novelty Detection)问题,代表的算法有One-class SVM。

    本文主要介绍从数据角度出发的不平衡数据集的处理方法以及对应的python库(imblearn)。

    二、从数据角度出发的不平衡数据集的处理方法

    2-1、随机采样

    2-1-1、朴素随机过采样(上采样)

    针对不平衡数据, 最简单的一种方法就是生成少数类的样本, 这其中最基本的一种方法就是: 从少数类的样本中进行随机采样来增加新的样本,对应Python库中函数为RandomOverSampler:

    from imblearn.over_sampling

    import RandomOverSampler

    ros = RandomOverSampler(random_state=0)

    X_resampled, y_resampled = ros.fit_sample(X, y)

    2-1-2、朴素随机欠采样(下采样)

    与过采样相反,欠采样是从多数类样本中随机选择少量样本,再合并原有少数类样本作为新的训练数据集。

    随机欠采样有两种类型分别为有放回和无放回两种,无放回欠采样在对多数类某样本被采样后不会再被重复采样,有放回采样则有可能。

    对应Python库中函数为RandomUnderSampler,通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。

    2-1-3、随机采样的优缺点

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

    上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。

    为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效,但是这一方式会加重过拟合。

    2-2、过采样的改进:SMOTE与ADASYN

    相对于采样随机的方法进行过采样, 还有两种比较流行的过采样的改进方式: 

    (1)、Synthetic Minority Oversampling Technique(SMOTE)

    (2)、Adaptive Synthetic (ADASYN) 

    2-2-1、SMOTE

    SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体下图所示,算法流程如下:

    1、对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。
    2、根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x'。
    3、对于每一个随机选出的近邻x',分别与原样本按照如下的公式构建新的样本:

                        xnew=x+rand(0,1∗ (xx)

    但是SMOTE算法缺点也十分明显:一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题),

    另一方面是生成一些没有提供有益信息的样本。

                            SMOTE算法图

    对应Python库中函数为SMOTE:

    from imblearn.over_sampling import SMOTE

    X_resampled_smote, y_resampled_smote = SMOTE().fit_sample(X, y)

    2-2-2、SMOTE的改进:Borderline-SMOTE

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

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

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

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

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

    (iii) 安全样本(safe), 所有的最近邻样本都来自于同一个类。

                         Borderline-SMOTE算法

    对应的Python库中的实现有三种可以选择的规则:

    SMOTE函数中的kind参数控制了选择哪种规则:

    borderline1:最近邻中的随机样本与该少数类样本a来自于不同的类;

    borderline2:最近邻中的随机样本可以是属于任何一个类的样本;

    svm:使用支持向量机分类器产生支持向量然后再生成新的少数类样本。

    具体实现如下:

    from imblearn.under_sampling

    import ClusterCentroids

    cc = ClusterCentroids(random_state=0)

    X_resampled, y_resampled = cc.fit_sample(X, y)

    2-2-3、ADASYN

    这种改进方法的主要思想是根据数据分布情况为不同的少数类样本生成不同数量的新样本。首先根据最终的平衡程度设定总共需要生成的新少数类样本数量 ,然后为每个少数类样本x计算分布比例。

    对应Python库中函数为ADASYN:

    from imblearn.over_sampling import ADASYN

    X_resampled_adasyn, y_resampled_adasyn = ADASYN().fit_sample(X, y)

    2-2-4、基于聚类的过采样方法

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

    得到正类:600,300,100;负类:30,20。然后使用过采样的方法分别对所有类别进行过采样得到正类:600,600,600;对于负类的上采样个数为:(600+600+600)/2 = 900,即负类为:900,900。

    最终得到的数据集为正类1800,负类1800。基于聚类的过采样方法的优点是不仅可以解决类间不平衡问题,而且还能解决类内部不平衡问题。 

    2-3、欠采样的改进:EasyEnsemble、BalanceCascade与NearMiss

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

    1、EasyEnsemble,利用模型融合的方法(Ensemble):

    多次过采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。简单的最佳实践是建立n个模型,每个模型使用少数类的所有样本和多数类的n个不同样本。假设二分类数据集的正负类比例为50000:1000,最后要得到10个模型,那么将保留负类的1000个样本,并随机采样得到10000个正类样本。

    然后,将10000个样本成10份,每一份与负类样本组合得到新的子训练集,训练10个不同的模型。

     

    2、BalanceCascade,利用增量训练的思想(Boosting):

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

     

    3、NearMiss,利用KNN试图挑选那些最具代表性的多数类样本:

    首先计算出每个样本点之间的距离,通过一定规则来选取保留的多数类样本点。因此该方法的计算量通常很大。

    2-3-1、上述方法的Python实现

    EasyEnsemble:

    EasyEnsemble方法对应Python库中函数为EasyEnsemble,有两个很重要的参数: (i) n_subsets控制的是子集的个数 ;(ii) replacement决定是有放回还是无放回的随机采样。

     

    from imblearn.ensemble

    import EasyEnsemble

    ee = EasyEnsemble(random_state=0, n_subsets=10)

    X_resampled, y_resampled = ee.fit_sample(X, y)

     

    BalanceCascade:

    BalanceCascade方法对应Python库中函数为BalanceCascade,有三个很重要的参数: (i) estimator是选择使用的分类器;(ii) n_max_subset控制的是子集的个数;(iii)  bootstrap决定是有放回还是无放回的随机采样。

     

    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)

     

    NearMiss:

    NearMiss方法对应Python库中函数为NearMiss,通过version来选择使用的规则:

    NearMiss-1:选择离N个近邻的负样本的平均距离最小的正样本;

    NearMiss-2:选择离N个负样本最远的平均距离最小的正样本;

    NearMiss-3:是一个两段式的算法。 首先,对于每一个负样本, 保留它们的M个近邻样本;接着, 那些到N个近邻样本平均距离最大的正样本将被选择。

     

    from imblearn.under_sampling

    import NearMiss nm1 = NearMiss(random_state=0, version=1)

    X_resampled_nm1, y_resampled = nm1.fit_sample(X, y)

     

    所有方法的简单实验效果可以见:不平衡数据分类算法介绍与比较

    2-4、不平衡问题其他的处理方式

    除了上述提到的过采样与欠采样的方法之外,还可以将多种方法进行组合使用。

    另外还可以通过为不同的样本点赋予不同的权重的方式来处理不平衡问题(与改进损失函数的方式有所类似)。

    在算法层面除了对算法本身的改进之外,还需要关注模型的评价指标,来确认使用的方法是否有效。

    个人实践发现,组合方法的结果会比单一某种方法会好很多,例如SMOTEENN和SMOTETomek。

    参考文献:

    [1].不均衡学习的抽样方法

    [2].机器学习︱非平衡数据处理方式与评估

    [3].数据不平衡问题的处理

    [4].不平衡数据的机器学习

    [5].数据不平衡imblearn算法汇总

    [6].不平衡数据分类算法介绍与比较

    转载于:https://www.cnblogs.com/kamekin/p/9824294.html

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

    万次阅读 多人点赞 2018-11-04 12:59:50
    (5)不平衡数据集的主要处理方法 2、不平衡(均衡)数据集常用的处理方法 (1)扩充数据集 (2)对数据集进行重采样 (3)人造数据 (4)改变分类算法 3、将数据集划分为训练数据集和测试数据集 4、使用K折...

    目录

    1、不平衡(均衡)数据集

    (1)不平衡数据集定义

    (2)不平衡数据集举例

    (3)不平衡数据集实例

    (4)不平衡数据集导致的问题

    (5)不平衡数据集的主要处理方法

    2、不平衡(均衡)数据集常用的处理方法

    (1)扩充数据集

    (2)对数据集进行重采样

    (3)人造数据

    (4)改变分类算法

    3、将数据集划分为训练数据集和测试数据集

    4、使用K折交叉验证评估模型性能

    (1)K折交叉验证

    (2)分层k折交叉验证


    1、不平衡(均衡)数据集

    (1)不平衡数据集定义

    不平衡数据集指的是数据集各个类别的样本数目相差巨大。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,这种情况下的数据称为不平衡数据

    (2)不平衡数据集举例

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

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

    (3)不平衡数据集实例

    训练数据不均衡是常见并且合理的情况,比如:

    ① 在欺诈交易识别中,绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。

    ② 在客户流失问题中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。

    (4)不平衡数据集导致的问题

    如果训练集的90%的样本是属于同一个类的,而我们的分类器将所有的样本都分类为该类,在这种情况下,该分类器是无效的,尽管最后的分类准确度为90%。所以在数据不均衡时,准确度(Accuracy)这个评价指标参考意义就不大了。实际上,如果不均衡比例超过4:1,分类器就会偏向于大的类别。

    (5)不平衡数据集的主要处理方法

    ① 从数据的角度出发,主要方法为采样,分为欠采样过采样以及对应的一些改进方法。

    ② 从算法的角度出发,考虑不同误分类情况代价的差异性对算法进行优化,主要是基于代价敏感学习算法(Cost-Sensitive Learning),代表的算法有adacost。

    另外可以将不平衡数据集的问题考虑为一分类(One Class Learning)或者异常检测(Novelty Detection)问题,代表的算法有One-class SVM。

    从数据角度出发的不平衡数据集的处理方法对应的python库(imblearn)

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

    2、不平衡(均衡)数据集常用的处理方法

    (1)扩充数据集

    首先想到能否获得更多数据,尤其是小类(该类样本数据极少)的数据,更多的数据往往能得到更多的分布信息。

    (2)对数据集进行重采样

    过采样(over-sampling)

    对小类的数据样本进行过采样来增加小类的数据样本个数,即采样的个数大于该类样本的个数。

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

    欠采样(under-sampling)

    对大类的数据样本进行欠采样来减少大类的数据样本个数,即采样的个数少于该类样本的个数。

    采样算法容易实现,效果也不错,但可能增大模型的偏差(Bias),因为放大或者缩小某些样本的影响相当于改变了原数据集的分布。对不同的类别也要采取不同的采样比例,但一般不会是1:1,因为与现实情况相差甚远,压缩大类的数据是个不错的选择。

    # -*- coding: utf-8 -*-
    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)

    (3)人造数据

    ① 属性值随机采样

    在该类下所有样本的每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。此方法多用于小类中的样本,不过它可能破坏原属性的线性关系。如在图像中,对一幅图像进行扭曲得到另一幅图像,即改变了原图像的某些特征值,但是该方法可能会产生现实中不存在的样本。

    ② SMOTE(Synthetic Minority Over-sampling Technique)

    SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本。它基于距离度量选择小类别下两个或者更多的相似样本,然后选择其中一个样本,并随机选择一定数量的邻居样本对选择的那个样本的一个属性增加噪声,每次处理一个属性。这样就构造了许多新数据。

    (4)改变分类算法

    ① 使用代价函数时,可以增加小类样本的权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

    ② 可以把小类样本作为异常点(outliers),把问题转化为异常点检测问题(anomaly detection)。此时分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)。

    ③ 由Robert E. Schapire提出的”The strength of weak learnability”方法,该方法是一个boosting算法,它递归地训练三个弱学习器,然后将这三个弱学习器结合起形成一个强的学习器。

    3、将数据集划分为训练数据集和测试数据集

    # -*- coding: utf-8 -*-
    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) #数据集划分
    print(len(x_train))
    print(len(x_test))
    print(Counter(x_train))#统计训练集中不同类别的数量

    4、使用K折交叉验证评估模型性能

    (1)K折交叉验证

    在k折交叉验证中,我们不重复地随机将训练数据集划分为k个,其中k-1个用于模型的训练,剩余的1个用于测试。重复此过程k次,我们就得到了k个模型及对模型性能的评价。

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

    # -*- coding: utf-8 -*-
    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]

    (2)分层k折交叉验证

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

    # -*- coding: utf-8 -*-
    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]

     

     

     

     

     

    参考文献:

    【1】 机器学习︱非平衡数据处理方式与评估

    【2】分类中的训练数据集不均衡问题处理

    【3】不均衡学习的抽样方法

    【4】不均衡数据的机器学习

    【5】imblearn不平衡算法学习

     

    展开全文
  •  不平衡数据集是数据集各个类别样本数目相差巨大。以二分类问题为例,假设正类样本数量远大于负类样本数量,这种情况下数据称为不平衡数据  2)举例  在二分类问题中,训练集中class 1样本数比上...

    (定义,举例,实例,问题,扩充,采样,人造,改变)

    一、不平衡数据集

     1)定义

      不平衡数据集指的是数据集各个类别的样本数目相差巨大。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,这种情况下的数据称为不平衡数据

     2)举例

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

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

     3)实例

      训练数据不均衡是常见并且合理的情况,比如:

       a)在欺诈交易识别中,绝大部分交易是正常的,只有极少部分的交易属于欺诈交易

       b)在客户流失问题中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)

     4)导致的问题

      如果训练集的90%的样本是属于同一个类的,而我们的分类器将所有的样本都分类为该类,在这种情况下,该分类器是无效的,尽管最后的分类准确度为90%。所以在数据不均衡时,准确度(Accuracy)这个评价指标参考意义就不大了

      实际上,如果不均衡比例超过4:1,分类器就会偏向于大的类别

     

    二、不平衡数据集常用的处理方法

     (1)扩充数据集

       首先想到能否获得更多数据,尤其是小类(该类样本数据极少)的数据

     

     (2)对数据集进行重采样

      a)过采样(over-sampling):对小类的数据样本进行过采样来增加小类的数据样本个数

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

     

      b)欠采样(under-sampling):对大类的数据样本进行欠采样来减少大类的数据样本个数

    from imblearn.under_sampling import RandomUnderSampler
    #通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样
    #通过设置RandomUnderSampler中的ratio参数,可以设置数据采样比例
    rus=RandomUnderSampler(ratio=0.4,random_state=0,replacement=True) #采用随机欠采样(下采样)
    x_resample,y_resample=rus.fit_sample(trainset,labels)
    

     

     (3)人造数据

      a)属性值随机采样

       在该类下所有样本的每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。此方法多用于小类中的样本,但是该方法可能会产生现实中不存在的样本

      b)SMOTE(Synthetic Minority Over-sampling Technique)

       SMOTE是一种过采样算法,它构造新的小类样本而不是产生小类中已有的样本的副本

       原理简单来说:

       原始数据分布(需要增加红色样本来平衡数据集

       

     

       Smote算法的思想其实很简单,先随机选定n个少类的样本,如下图:

       再找出最靠近它的m个少类样本,如下图:

       再任选最临近的m个少类样本中的任意一点:

       在这两点连线上任选一点(对二维数据来说),这点就是新增的数据样本:

     

     

       对于高维数据来说,从m个最邻近样本点中随机选出一个点后(即上面图中的虚框中的点),求出两个方框中点的距离(如欧式距离),再从\([0, 1]\)中随机选择一个数,乘以距离差得到新的数据点:

     

     

     

     (4)改变分类算法

      a)使用代价函数时,可以增加小类样本的权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。刚开始,可以设置每个类别的权值与样本个数比例的倒数

      b)可以把小类样本作为异常点(outliers),把问题转化为异常点检测问题(anomaly detection)。此时分类器需要学习到大类的决策分界面,即分类器是一个单个类分类器(One Class Classifier)

     

    三、参考

     本文参考:https://blog.csdn.net/asialee_bird/article/details/83714612

     感谢!

     

    转载于:https://www.cnblogs.com/always-fight/p/10285904.html

    展开全文
  • 一、不平衡数据集的定义所谓的不平衡数据集指的是数据集各个类别的样本量极不均衡。以二分类问题为例,假设正类的样本数量远大于负类的样本数量,通常情况下通常情况下把多数类样本的比例接近100:1这种情况下的数据...
  • 定义不平衡数据集:在分类等问题中,正负样本,或者各个类别样本数目不一致。例子:在人脸检测中,比如训练库有10万张人脸图像,其中9万没有包含人脸,1万包含人脸,这个数据集就是典型的不平衡数据集。 直观...
  • 定义不平衡数据集:在分类等问题中,正负样本,或者各个类别样本数目不一致。 研究不平衡类通常认为不平衡意味着少数类只占比10~20%。实际上,一些数据集远比这更不平衡。例如: 每年大约有2%信用卡账户被...
  • 这是典型的数据类型不平衡问题。比如对于一个二分类任务,训练集中类别为0负样本占样本总数90%,而正样本只占10%。那么这样训练有什么弊端呢? 如果类别不平衡的样本直接丢给模型学习,那么很显然模型会在负...
  • 正反例极不平衡数据集的采样

    千次阅读 2013-09-11 15:44:52
    均衡问题是“分类型数据挖掘”(我就直接按照目标变量来定义概念了哈)实际项目中很常见一类问题,毕竟生活中像UCI上那种正负类样本点数据基本差-多情况是很少见,至少在我所做过两个项目中,所遇到...
  •  搜集更多的数据来使数据达到平衡,但是一般出现样本不平衡问题,就是不太可能以一种简单的方法获取到更多的样本(在金融领域,可以思考坏用户的定义是否过于严格) 1.2、数据增广: 目前数据增广主要应用于图像...
  • 定义不平衡数据集:在分类等问题中,正负样本,或者各个类别样本数目不一致。例子:在人脸检测中,比如训练库有10万张人脸图像,其中9万没有包含人脸,1万包含人脸,这个数据集就是典型的不平衡数据集。 直观...
  • 不平衡数据的机器学习

    万次阅读 2017-09-26 09:13:40
    问题定义那么什么是不平衡数据呢?顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,假设我们的数据集是$S$,数据集中多数类为$S_maj$,少数类为$S_min$,通常情况下把多数类样本比例为$100:
  • 不平衡数据

    2020-07-14 01:14:01
    不平衡数据的定义2. 解决不平衡数据的方法2.1 欠采样2.2 过采样2.3 阈值移动2.4 扩大数据集2.5 尝试对模型进行惩罚2.6 将问题变为异常点检测2.7 特殊的集成的方法2.8 改变评价指标 1. 不平衡数据的定义 大多数分类...
  • 就目前为止,我们使用预测精准度来评估分类性能,使用R²来评估回归性能,但是,总结监督模型给定数据集表现有多种方法,这两个指标只是其中两种。在实践中,这些评估指标可能适用于某些应用,但是在进行...
  • 不平衡数据分类

    千次阅读 2017-08-28 15:19:43
    不管是在学术界还是工业界,不平衡学习已经吸引了越来越多关注,不平衡数据的场景也出现在互联网应用方方面面,如搜索引擎点击预测(点击网页往往占据很小比例),电子商务领域商品推荐(推荐商品被...
  • A、定义不平衡数据集:在分类等问题中,正负样本或者各个类别样本数目不一致。B、例子:在人脸检测中,比如训练库有10万张人脸图像,其中9万没有包含人脸,1万包含人脸,这个数据集就是典型的不平衡数据集。直观...
  • 以二分类问题为例,假设我们的数据集是S,数据集中多数类为S_maj,少数类为S_min,通常情况下把多数类样本比例为100:1,1000:1,甚至是10000:1,这种情况下为不平衡数据不平衡数据的学习即需要在如此分布不均匀...
  • 机器学习中不平衡数据的处理方式

    万次阅读 2018-08-24 10:44:56
    不平衡数据的场景出现在互联网应用方方面面,如搜索引擎点击预测(点击网页往往占据很小比例),电子商务领域商品推荐(推荐商品被购买比例很低),信用卡欺诈检测,网络攻击识别等等。 问题定义 ...
  • 不平衡数据的定义 顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,数据集中的多数类 为Smax,少数类为Smin,通常情况下把多数类样本的比例为100:1、1000:1,甚至是10000:1这种情况下为不平衡数据。 ...
  • 不平衡数据机器学习方法简介

    千次阅读 2017-03-27 10:24:35
    问题定义 那么什么是不平衡数据呢?顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,假设我们的数据集是$S$,数据集中多数类为$S_maj$,少数类为$S_
  • 使用预训练Google BERT模型对有毒评论(Kaggle竞争数据集)进行多标签分类 keras-bert.ipynb :在GoogleBERT模型顶部微调一个多标签分类器(固定其参数)。 将Hamming损失与自定义定义的召回率指标一起使用...

空空如也

空空如也

1 2 3 4 5 ... 7
收藏数 126
精华内容 50
热门标签
关键字:

不平衡数据集的定义