数据不平衡

在很多真实场景下,数据集往往是不平衡的。也就是说,在数据集中,有一类含有的数据要远远多于其他类的数据(类别分布不平衡)。在这里,我们主要介绍二分类中的类别不平衡问题,对于多类别的不平衡只做简单的介绍。

考虑一个简单的例子,假设我们有一个关于医院患者的数据集(里面包含很多患者的图片),我们把其中患有癌症的病人标记为正例,把健康的患者标记为负例。众所周知,健康的人的数量肯定远远大于癌症患者的数量。在我们的数据集中,有10923个负例,但是仅仅有260个正例。理想情况下,我们想要得到一个分类器可以对正例和反例都能提供一个较好的分类准确率。但是,在实际应用中,对于负例我们可以得到将近100%的准确率,而对于正例,我们仅仅得到10%的准确率。

假设对于正例,分类器只有10%的准确率,会产生234个正例被误分到负例中。也就是说,有234个癌症患者被误诊为没病。在医疗工业中,这样的结果可能让我们付出很大的代价,这样的代价远远高于把没病的人诊断为癌症患者。因此,我们需要得到一个分类器,既能对于正例有很高的准确率,同时又不会影响到负例的准确率。

类似于上面例子中的数据集,由于整个数据空间中,正例和负例的数据就是不平衡的。因此,这样的不平衡数据集的产生往往是内在的。同时,也有很多其他的因素会造成数据的不平衡,例如,时间,存储等。由于这些原因产生不平衡的数据集往往被称为外在的。除了数据集的内在和外在,我们可能还要注意到数据集的相对不平衡以及绝对不平衡。假设上述例子中的数据集有100000条数据,负例和正例的比例为100:1,只包含1000个正例。明显的,我们不能说1000个数据就是绝对小的,只不过相对于负例来说,它的数量相对较少。因此,这样的数据集被认为是相对不平衡的。

数据复杂性

数据复杂性是一个广义的概念,它包含以下几个问题:重叠、缺少表示的数据、小分离。

在图中,星和圆分别代表少数类和多数类。在(a)中,类之间的数据并没有重叠,但是在(b)中,类之间有很严重的重叠。另外,在(b)中,星的数量本来就很少,但是星中还被分成两个子类(B和C),而且C中包含有更少的数据。因此,这样也会产生类内数据不平衡的问题。对于A和D也类似,多数类的数量远远多于少数类的数量。所以,在(b)中,同时存在类间和类内不平衡。

类内不平衡和小分离问题是紧密相关的,通常会对分类器的性能造成很大的影响。对于一个分类器来说,它通过创建多个分离规则来学习不同的类别。对于同质类,分类器通常创建一个大的分离来尽可能多的覆盖样本。但是对于异质类来说,小分离可能会创建一个包含一小簇样本的规则,可能会学习到一个不具代表性的子类。由于分类器是要同时学习多数类和少数类,因此,小分离不仅只对少数类产生影响。多数类中的小分离可能是由于噪声、少数类的误分类、欠表示的子类引起的。由于多数类的数据很多,因此这种情况很少会出现,而噪声的出现更常见的是对少数类产生影响。从(b)中可以看出,假设我们把A中两个噪声也分离出来,那么它们对于C来说可能是不合理的,但是它也可能是一个欠表示的子类的合理的分离。因此,判断小分离分出的类别的有效性也是一个很重要的问题。

最后一个问题是结合不平衡数据和小规模样本的问题。在现实应用中,我们通常可以发现得到的数据往往规模很少,并且维度很高,例如,人脸识别、基因表达等。降维是解决这一个问题的方法,例如PCA等。但是当这些数据集面对数据不平衡问题时,会面临两个比较关键的问题:

  1. 样本规模很小,涉及到数据很罕见,并且可能存在类内不平衡问题;

  2. 当数据不平衡时,学习算法很难泛化这些规则;

由于样本很有限,因此学习到的规则可能会很具体,这样可能会导致过拟合。

不平衡学习

解决不平衡学习问题,主要有两个主要的方法:

  • 随机采样
  • 代价敏感学习

假设现在有一个数据集S,其中包含有m个样本,即。对于每一个样本,都有n维特征空间,即。在该数据集中存在两个子集:,其中表示数据集中的少数, 表示数据集中的多数类。即.对于从该数据集中采样得到的子集标记为:E,同样存在两个子集:,其中表示数据集中的少数, 表示数据集中的多数类。

随机采样

使用采样的方法来解决不平衡学习的问题,主要是通过一些机制来改变原始数据集的分布,使得处理后的数据集分布平衡。主要有两种采样方法:

  • 过采样
  • 欠采样
  • 合成采样

过采样

过采样主要是增加一个从少数类中随机选择的样本集合。从少数类集合中随机选择一个子集,如果要增强数据集,那么只需要在这个少数类中重复随机采样,把这些样本集合增加到原始数据集中。所以,原始少数类增加的样本数量是。这样的采样策略可以达到任何我们想要的平衡度,而且这种采样方法比较简单,易于理解和实现。

过采样增加了原始数据集的数量,因此,在训练学习器时需要花费更多的训练时间。并且由于处理之后的数据集中存在很多重复的样本,可能会导致学习的规则比较具体,因此,可能会导致过拟合。

欠采样

欠采样主要是通过从原始数据集中移除一些样本。主要是在数据集中的多数类进行随机采样,然后把随机得到的样本集合从数据集中移除,即。但是,欠采样也存在一些问题,当我们移除一些数据的时候,可能会失去一些重要的信息。为了避免这种信息损失带来的影响,在欠采样中,主要有两个方法:

  • EasyEnsemble

  • BalanceCascade

EasyEnsemble

EasyEnsemble主要是在数据集的多数类中进行随机采样,使得,然后从原始数据集中将这些样本去掉。这种方法利用到集成学习的方法,具体过程如下:

  1. 初始化:i表示迭代次数,T表示最大迭代次数,表示每一次训练得到的分类器,表示中的弱分类器的数量;
  2. 从多数类中随机选择一个子集
  3. 使用子集,训练分类器是由个弱分类器集合而成,其中每个弱分类器的权重为,阈值为:。因此,
  4. 重复步骤 3-5,直到
  5. 最后,输出一个集成学习器,

EasyEnsemble产生T个子问题,每一个子问题都会生成一个集成的学习器,这个学习器是由个弱分类器集成的。每一步中,弱分类的训练采用Bootstrap采样方法。我们可以将每个弱分类器看成是从不同的训练集中得到的特征,每个集成的分类器看成是不同的特征的线性组合。最后把这些T个集成的分类器再进行集成。因此,我们可以把EasyEnsemble方法看成是集成的集成,它是一个无监督的方法。

BalanceCascade

BalanceCascade方法类似于EasyEnsemble,不同之处在于:

  • BalanceCascade是一个监督学习的方法;
  • BalanceCascade每一次生成一个,对于样本,如果该样本可以被正确分类,那么说明该样本是冗余的,因此,从多数类中把该样本删除;

BalanceCascade的主要过程如下:

  1. 初始化:i表示迭代次数,T表示最大迭代次数,表示每一次训练得到的分类器,表示中的弱分类器的数量,误报率(把一个多数类的样本分类成少数类)

  2. 从多数类中随机选择一个子集

  3. 使用子集,训练分类器是由个弱分类器集合而成,其中每个弱分类器的权重为,阈值为:。因此,

  4. 重新计算误报率,据此调整

  5. 中删除可以被正确分类的样本;

  6. 重复步骤 3-7,直到

  7. 最后,输出一个集成学习器,

在这个方法中,每一次迭代过程都会造成数据集中多数类的数量减少,而且每一步的集成分类器都是由平衡的数据集训练得到的。只有当所有的预测为正例的时候,最终的分类器才会预测为正例。因此,这种方法在每次迭代过程中,在有限的样本空间利用尽可能多的信息。

SMOTE(The Synthetic Minority Oversampling Technique)

SMOTE是一种合成采样的一种解决不平衡学习的方法,它已经被证明在很多领域都比较有效。它主要是基于现存的少数类样本,计算样本特征空间之间的相似度,然后创建人工合成样本。

  1. 对于少数类中的样本,即,,计算它的K个近邻;
  2. 通过计算 n 维空间的欧式距离,得到距离最近的 K 个中的样本数据;
  3. 然后从 K 个近邻中,随机选择一个样本,产生人工合成的数据;具体的方法如下:

是一个少数类的样本,的其中一个近邻,是一个随机数。

上图展示了SMOTE的具体过程。(a)图展示了一个典型的不平衡的数据,SMOTE中的 K 取值为6。(b)图中展示了一个随机产生的合成样本,这个样本是沿着的直线产生的。

SMOTE方法是一种过采样的方法,它克服了过采样的一些缺点,而且加强了原始数据。但是,SMOTE方法可能会造成一定的过拟合。

自适应合成采样

由于SMOTE方法对于每个少数类的样本都会产生相同数量的合成数据,因此,这样很可能造成不同类之间的样本重叠。为了解决这个问题,很多自适应的合成采样方法被提出来。主要包括:

  • Borderline-SMOTE;
  • Adaptive Synthetic Sampling(ADA-SYN);

Borderline-SMOTE

这个方法的主要过程如下:

  1. 对于,确定它的近邻,并且
  2. 对于,计算它的近邻中属于多数类样本的数量,即
  3. 选择这样的,满足这样的条件

根据上述公式,我们需要选择出符合这种条件的样本集合。即:在它的近邻中,多数类样本要多于少数类样本。这个样本集合中的数据代表分界线样本(有很大的可能会被误分类),因此,使用这些样本集合的数据来产生合成数据。如果,也就是说一个样本的所有近邻都是多数类样本,那么,这个样本被视为噪声,同时不会产生随机合成的数据。

这个图中展示了该方法的实现过程,我们可以发现和SMOTE方法的不同之处:SMOTE对于每一个少数类样本都会产生合成样本,但是Borderline-SMOTE只会对邻近边界的少数类样本生成合成数据。

ADASYN

ADASYN:根据样本的贡献来决定生成多少个合成数据。具体实现过程如下:

  1. 首先根据以下公式,计算需要生成合成数据样本的数量,,其中,表示期望在合成数据之后想要达到的平衡度;
  2. 对于少数类中的样本,计算它的 K 近邻和。其中,表示K近邻中数据多数类的样本数量,Z 是用来标准化的常数。需要满足一个条件:
  3. 对于少数类中的每个样本,计算需要生成的合成数据的数量,其中,

ADASYN的关键思想就是使用个密度分布来决定对于每个少数类样本产生多少数量的合成数据。

采样和数据清理

当使用随机采样的方法解决数据不平衡问题时,可能会产生很多重叠数据。为了解决这个问题,在生成数据之后,往往会采用一些数据清理技术,例如,Tomek links。Tomek links确定了一对样本(不同类别并且具有最小近邻距离)。Tomek links的具体定义如下:

对于,使用表示之间的距离。如果叫做Tomek links的话,它需要满足以下条件:不能找到这样的样本,使得或者

如果两个样本称为Tomek links的话,说明其中一个是噪声或者两个都是接近边界。因此,在产生了合成数据之后,我们可以通过去除这些 Tomek links来清理可能重叠的数据,直到拥有最近距离的两个样本是同一类的样本为止。

上图中,展示了一个使用SMOTE方法来解决数据不平衡问题,然后利用Tomek links来进行数据清理的例子。(a)中是原始的数据集,其中就有Tomek links的样本;通过(b)利用SMOTE技术之后,也增加了一些Tomek links的样本;(c)中我们可以看到已经确定的Tomek links;(d)中是去除所有的Tomek links之后的数据分布情况。

基于聚类的随机采样(CBO)

基于聚类的随机采样方法可以用来解决类内不平衡问题,主要利用的聚类的方法。具体的过程如下:

  1. 随机选择K个样本作为K个簇,并且计算K类样本在特征空间的平均值,作为聚类中心;
  2. 对于剩下的每一个样本,计算它和K个聚类中心的欧氏距离,根据欧式聚类将其分配到最近的类簇中;
  3. 更新每个簇的聚类中心,直到所有的样本都用完;

(a)中展示了原始数据集,多数类中有3个类簇(),每个类簇中的样本数分别是:20,10,8.。而少数类中有2个类簇(),每个类簇中的样本数是:8,5。(b)中展示了5个类簇中,各自有三个样本,并且已经计算好各自的聚类中心,同时,还存在另个五个未分类的样本。(c)展示了如果对5个未分类的样本进行分类,每一个类簇的聚类中心发生改变。一旦所有的样本都用完,那么CBO使用过采样的方法填充所有的多数类的类簇。因此,多数类的类簇中的样本个数相同。(d)中是使用CBO之后的样本分布情况,因此,类簇B和C的样本数都是20。使用表示多数类的样本数量,因此,。然后我们使用过采样的方法填充少数类的类簇,使得每一类簇中包含个样本。因此,在这个例子中少数类的每一类簇应该包含个样本。

从上述例子中,我们可以发现CBO对于每一个类簇都会产生足够多的样本,因此,对于不同的类它具有很强的表示能力。同时,在CBO的过程中,我们也可以采用其他的采样方法(例如,SMOTE)。

采样方法和集成方法的集成

目前已经有很多的方法把随机采样和集成学习的方法集成在一起,下面介绍两种这样的方法:

  1. SMOTEBoost
  2. DataBoost-IM

SMOTEBoost

SMOTEBoost主要是把SMOTE和AdaBoost.M2集成在一起,SMOTEBoost方法在每次Boost迭代过程中使用合成数据的方法。因此,每一次迭代过程中的分类器都会集中到更多的少数类样本。

DataBoost-IM

DataBoost-IM主要是把数据生成技术和AdaBoost.M1方法结合在一起,主要根据不同类之间样本的很难被学习到的比例。具体过程主要是如下:

  1. 对于一个数据集S,其中,并且对于每个样本有一个权重分布代表每个样本可以被学习到的困难程度,然后按照困难程度进行降序排序;
  2. 然后选择前个样本填充到E里,其中表示当前学习到的分类器的错误率;

由于少数类的样本比多数类的样本更难学习到,因此,对于,可能存在。从上面的过程中,我们可以发现一旦困难的样本被确定,那么我们就可以根据以下三个步骤产生合成数据:

  1. 样本集合E的种子,其中多数类的种子,少数类的种子
  2. 利用一些技术产生合成数据集,其中,并且
  3. 最后根据新产生的样本更新权重分布

代价敏感学习

之前介绍的方法都是通过采样,从而可以得到平衡的数据分布。而代价敏感学习则是利用不同类别的样本被误分类而产生不同的代价,使用这种方法解决数据不平衡问题。而且有很多研究表明,代价敏感学习和样本不平衡问题有很强的联系,并且使用代价敏感学习的方法解决不平衡学习问题要优于使用随机采样的方法。

代价敏感学习框架

代价敏感学习主要的是建立一个代价矩阵,代价矩阵中的数值代表样本被误分类之后的惩罚。例如,我们可以定义为:把多数类的样本分类成少数类的代价,表示把少数类的样本分类成多数类的代价。一般来说,把少数类的样本误分类所产生的代价往往比多熟练样本的误分类代价要大,因此,。代价敏感学习的目标是最小化整个训练集上的代价(贝叶斯条件风险)。

同时,在多分类任务中,使用表示把 j 中的样本误分类成 i 的代价。下图表示多分类任务中的一个代价矩阵。

在这个例子中,最终的条件风险为:,其中表示样本被分类成 j 的概率。

主要有三种方法实现代价敏感学习:

  1. 把误分类代价作为数据集的权重,然后采用 Bootstrap 采样方法选择具有最好的数据分布的数据集;
  2. 以集成学习的模式来实现代价最小化的技术,这种方法可以选择很多标准的学习算法作为集成学习中的弱分类器;
  3. 把代价敏感函数或者特征直接合并到分类器的参数中,这样可以更好的拟合代价敏感函数。由于这类技术往往都具有特定的参数,因此这类方法没有统一的框架;

Cost-Sensitive Dataspace Weighting with Adaptive Boosting

这种方法把代价敏感函数引入到集成学习中。AdaBoost.M1是一种集成学习的方法,它的主要思想是在每次迭代时更新数据分布函数。例如,表示当前迭代次数,表示当前的数据分布。那么AdaBoost.M1的更新公式如下:

其中是权重更新参数;是分类器的输出;是分类器在训练集上的错误率,是个标准化因子;

根据上面的公式,如果把代价敏感函数引入进来,可以在三个位置引入进来:在指数函数里面、指数函数外面、在指数函数里面和外面都引入。因此,会产生三个方法:AdaC1、AdaC2、AdaC3。这三个方法的数据分布更新函数如下:

  • 是样本的误分类代价,越大,说明具有越大的误分类代价;

根据上面的公式可以看到,迭代过程中增加了随机采样得到误分类代价高的样本的几率,因此在每一步中会给分类器更多的误分类代价高的样本。因此,我们在AdaBoost的每一步更新中引入误分类代价,这样会使方法更加偏好于少数类的样本,在每一步迭代中都会用到更多的相关数据,因此,这种方法具有很好的鲁棒性。

另外,还有一种和AdaC1类似的方法,也是把代价敏感函数引入到数据分布函数中的指数中。但是它并不是直接使用代价函数,而是使用一种代价调整函数。这种函数可以显著提高误分类代价高的样本的权重,并且可以降低能够被正确分类的具有高代价样本的权重。它的数据分布函数的更新公式如下:

,其中代价调整函数:;如果样本被正确分类,那么使用表示:;否则,使用表示:。当然了这种方法也可以作出一点调整,例如,使得。这种调整在大部分情况下可以达到最好的效果,但是这些系数可以根据实际需求进行调整。、

虽然代价敏感技术可以提高解决不平衡问题的效果,但是由于在实际应用中,我们通常只知道少数类的误分类代价要高于多数类的误分类代价,但是并不知道具体代价是多少。因此,为了解决这个问题,代价敏感的拟合技术就被提出来,下面有两种主要的方法。

Cost-Sensitive Decision Tree

当把代价敏感拟合技术应用到决策树中,主要有三种应用形式:

  1. 应用在决策树的阈值
  2. 在划分标准中应用这种代价
  3. 基于代价敏感的剪枝

很多研究表明,决策阈值、训练集的分布以及误分类代价是彼此相关的。但是这种关系对于不同的任务可能是不相同的,因此很难确定一个统一的方法来确定决策树的阈值。在实际中,往往通过计算ROC曲线来确定最终的阈值。其中阈值的区间是从正类的误分类代价最高的点到所有的负类的误分类代价最高的点,在这些点中计算方法的性能,最后选择ROC曲线中的最优点作为最终的阈值。

当在决策树的划分标准中考虑代价敏感时,它的主要任务就是拟合一个非纯度函数(对于不相等的代价具有很好的不敏感性)。在实际应用中,经常会选择准确率作为划分标准,在每一次划分时,选择错误率最小的特征。这种划分往往对于数据的分布很敏感,因此对于不相等的误分类代价也很敏感。当我们选择:Gini系数、Entropy、DKM这三个函数作为划分标准时,它们都具有很好的不敏感性。其中,DKM具有很好的性能,往往可以产生具有很好效果,并且能产生具有最小未剪枝决策树。

最后一种代价敏感决策树拟合是应用在剪枝上。剪枝通过去掉低于一定阈值的叶子结点,通常可以提高决策树的泛化性能。但是在数据不平衡的情况下,剪枝往往更可能去掉少数类的样本。因此,剪枝可能会影响到决策树的性能。为了解决这一个问题,目前很多研究主要集中在提高每个节点的类概率估计,可能生成更具有代表性的决策树结构,可以使用剪枝达到性能上的提升。目前主要的技术有两种:概率估计中的Laplace平滑方法、Laplace剪枝技术。

Cost-Sensitive Neural Network

在不平衡学习中,代价敏感神经网络也是一个重要的方法。实际应用中,使用最多的是多层感知机,主要是利用后向传播算法和梯度下降法来求解某一问题。

具体的来说,假设模型的错误率有如下定义:,其中,分别是目标标签和模型的输出。然后使用梯度下降法找到最大的梯度来更新权重,公式如下:,其中是具体的学习率,是求导操作。

将代价敏感引入到神经网络中,主要有四种方式:

  1. 在概率估计中引入代价;
  2. 在神经网络输出中使用代价;
  3. 在学习率中引入代价敏感;
  4. 在错误率中引入代价;

把代价因素集成到分类器的测试阶段可以调整神经网络输出的概率估计,这样可以保持原始的数据结构,并且由于考虑到代价因素可以增强在代价较高的样本中的估计。这种方法比原始的神经网络的性能有一定的提升,但是并不显著。因此,有另外一种方法通过使用交叉验证的方法,可以在集成学习中应用这种概率估计。

把代价因素直接应用到神经网络的输出中,会使得神经网络的输出偏向于代价高的样本。这种方法可以带来平均性能上的提高,但是同时也会增加方差。

学习率会影响到权重改变过程,如果把代价因素考虑到学习率中,那么会造成高代价的样本会对权重产生更大的影响。关键思想在于:在学习的过程中,通过明显的降低代价高的样本对应的学习率,可以使得神经网络在学习过程中更加关注代价高的样本。代价低的样本将有比代价高的样本的更快的学习率,因此这个方法在训练过程中会找到一个平衡。

最后一种改变就是把上面的误差最小化函数改变为代价最小化函数,同时,后向传播算法同样可以利用在代价最小化函数中。

基于核函数的方法和主动学习

Kernel-Based Methods

基于核函数的学习方法的主要原理是统计学习和VC维,代表性的方法是SVM,可以对于不平衡数据有很好的鲁棒性。SVM主要是利用一些样本来最大化支持向量的间距,同时最小化分类误差。在数据不平衡问题中,由于SVM要最小化分类误差,因此它可能更偏向于多数类。假设存在一个线性可分的二分类空间,可能会出现少数类样本表示的支持向量离超平面比较远,因此它对于模型的学习的贡献就比较小。因此,由于少数类样本的数量有限,因此可能会导致支持向量中的数据也是不平衡,会降低模型的效果。这种问题对于线性不可分的情况也是同样的,对于线性不可分问题,往往采用基于核函数的学习方法。

Integration of Kernel-Based Methods with Sampling Methods

主要是在SVM的框架下集成采样方法和集成方法。主要有两个方法:SMOTE with Different Costs(SDCs),the ensembles of over/undersampled SVMs。

SDC算法主要是对于不同的类别使用不同的误分类代价,从而可以调整决策边界,使得正例的分布更为密集。同时,还有的方法可以不改变底层的SVM分类器,使用集成的系统来调整数据分布。另外,还有使用非对称的误分类代价来改变SVM,从而达到更好的性能。类似于AdaBoost.M1,使用迭代的过程来改变训练样本的权重。

还有一种方法把SVM和采样方法集成一起,颗粒SVM-重复下采样(GSVM-RU)。这种方法主要是基于颗粒SVM(统计学习和颗粒计算),它主要有两个特征:

  1. 通过检测数据子集的局部重要性和全局相关性来分析数据的潜在数据分布;
  2. 通过并行计算可以提高计算效率;

在数据不平衡的情况下,由于正例(少数类)样本都被认为是信息量大的样本,因此,正例信息颗粒是由这些样本组成的。然后使用这个正例颗粒和剩下的数据(多数类)训练一个线性SVM,由于负样本(作为SVM的支持向量),因此被称为负局部支持向量(NLSVs),是由负信息颗粒组成的,并且把这些样本移除。然后使用剩下的数据集,训练一个新的线性SVM,同样的产生一个新的NLSVs,把这些样本移除。重复上述过程多次,就可以得到很多的负信息颗粒。最后使用考虑到全局相关性的聚合操作从这些负信息颗粒中选择一些具体的样本集合,把它和正信息颗粒结合起来,训练最终的SVM。

Kernel Modification Methods with Imbalance Learning

这种基于核函数的方法主要针对于SVM本身,这种方法通常被叫做核函数修正方法。

其中一个是核函数分类器构造算法,主要是基于正交前向选择(OFS)和正则化的正交加权最小二乘法(ROWLSs)的。这种方法主要引入两个部分来提高一般的核函数方法对于不平衡数据的泛化能力。

  1. 使用LOO-AUC函数作为最优核函数模型的选择机制,主要使用LOO交叉验证方法和AUC作为评价指标;
  2. 在ROWLSs算法中利用代价敏感的参数估计,对于少数类中的错误样本分配更大的权重;

其他的核函数修正技术都是改变SVM的分界线,利用分界线校准技术来提高SVM的性能。有三个常用的算法用来调整分界线:

  1. Boundary Movement(BM)
  2. Biased Penalties(BP)
  3. Class-Boundary Alignment(CBA)

核边界校准(KBA)算法主要是根据不平衡数据的分别来调整核矩阵,KBA的理论基础是建立在ACT(自适应共性变换)之上的。核函数上的共性变换主要是基于特征空间和不平衡度的,因此KBA主要通过在特征空间改变核矩阵的方法来解决数据不平衡问题。

还有其他的方法,例如TAF-SVM,这个方法有三个优点:

  1. 根据样本的重要性来使用不同的样本,从而可以避免过拟合;
  2. 在这个方法中集成多种不同的代价敏感函数,从而可以处理不同的数据分布;
  3. 使用整体间隔(考虑误分类样本和正确分类的样本),而不是使用传统的间隔;

一个比较有趣的方法是PSVM,把软间隔最大化简化成K个线性方程组(线性分类器或者非线性分类器)。这个方法的优势就是执行速度比较快,因为不需要复杂的操作。在数据极度不平衡问题中,不管是采样或者数据空间加权技术,SVM都会选择忽略少数类。有两种方法来平衡数据集:

  1. Similarity Detector:对于主要的正类样本学习一个鉴别器;
  2. Novelty Detector:为主要的多数类样本学习一个鉴别器;

在这里还有很多其他的这类方法,例如SCMs、KNG、P2PKNNC、HKME、BSVC、v-SVC、RVM等。

主动学习

一般来说,主动学习是用来解决无标签的训练数据这一类问题的。但是最近,主动学习被用来解决数据不平衡问题,并且将它和基于核的方法结合在一起使用。这种方法主要是从训练集中选择一些更有意义的样本(距离当前超平面最近的样本),从而可以强化基于核的分类器。

上图中展示了不平衡数据中的类别分布情况,阴影部分对应于超平面边界之内的数据分布情况。可以看出相比于整个数据集中的不平衡度,边界之内的数据不平衡度要小的多。因此,基于核函数的主动学习在每一次迭代中不是在整个训练集中进行,而是利用一部分子集。首先,需要利用SVM产生一个超平面,找到最有意义的样本形成新的训练集;然后,在这个新的训练集上使用LASVM在线学习算法来增强SVM。

但是这个方法会产生高昂的计算开销,因为需要重复计算每个样本和当前的超平面之间的距离。为了解决这个问题,可以从训练集中随机产生一个子集,然后计算时这个子集中的样本和超平面的距离。同时,还重新设计主动学习中的终止条件,使它能够达到更快地收敛。

还有一些其他的主动学习的方法,例如除了上述把主动学习和基于核的方法集成在一起,还可以把主动学习和采样方法集成在一起。另一种是简单的主动学习启发式方法(SALH),主要是把遗传算法和随机采样、WMW代价函数集成在一起。

评价指标

除了上面的很多方法来解决不平衡问题,这里也有一些指标来衡量不同模型的实验结果。

单评价指标

上图中,p,n代表真实的标签,Y,N代表模型的输出。

一般来说,最常用的指标是准确率和错误率,但是通过之前的分析,可以发现这两个指标其实并不适用于数据不平衡的情况。它们的公式如下:

在上图中,可以看到左边一列是正例的数据,右边一列是负例的数据。左右两列的比例代表数据不平衡的比例,所以,用到这两列的指标都对于数据分布比较敏感。而准确率适用到了这两列,因此,随着数据分布的不同,即使适用相同的模型,可能他们的评价指标也是不同的。因此,这会对于我们进行模型比较时,产生很大的问题。

同时,也有一些评价指标可以对于数据不平衡提供综合性的评价,例如Precision,Recall,F-measure,G-mean。具体公式如下:

,其中是系数,用来调节Recall和Precision的重要程度。

Precision表示在标记为正例样本中,有多少是真正被正确分类的;Recall表示有多少正例被标记对的。F-measure结合了上面两个指标,通过一个系数可以调整两个指标的重要程度。G-mean度量了正例和负例的准确率之间的偏差程度。虽然这些指标相对于比较有效,但是却不能很好的回答我们:怎么去比较不同的分类器在一个范围之间的样本分布的数据集上性能?

ROC

ROC利用两个简单的度量:TP_rate(),FP_rate()。ROC空间中的点代表在给定的数据分布下,特定的分类器的性能。

图中A,B,C,D,E,F,G表示ROC点,表示ROC曲线。点A表示完美的分类;如果一个分类器的ROC点比另一个分类器的ROC点更接近A点,那么就说明这个分类器的性能比较好。如果一个分类器的点在对角线上(例如,E),说明这个分类器对于类别是随机猜测。因此,如果分类器的点出现在右下角(例如,F),就说明分类器的性能没有随机猜测好。然而,如果分类器没有随机猜测好,并不是说明它没有意义,只不过它没有正确利用信息。例如,如果我们知道F是错的,那么把它的结果反过来,就可以得到G点。

有的分类器可能会产生一个连续的数字表示分类的置信度,那么,它会产生一个ROC曲线,例如,图中L1和L2。如果要比较不同的分类器的性能,我们可以利用ROC曲线下的面积(AUC)。在图中,我们可以看到L2曲线下面的面积要大于L1曲线下的面积,因此,L2对应的分类器要好于L1对应的分类器。

Precision-Recall Curves

虽然ROC已经可以很好地比较不同分类器的性能,但是它只是提供一个总体的性能评价。但是,PR曲线可以提供更多的信息。PR曲线可以使用Precision和Recall确定,它和ROC有很强的相关性。一个曲线在ROC空间中是重要的当且仅当它在PR空间是重要的,但是一个算法可以优化ROC中的AUC并不能保证可以优化PR中的AUC。在ROC中,如果一个分类器性能越好,那么它就越接近左上方;但是在PR中,它会更接近右上。

在数据不平衡的情况下,PR可以提供更多的信息。例如,在这种情况下:负例的样本数量远远多于正例的样本数量。如果分类器的性能在FP上有很大的改变,那么FP_rate并不会发生太大的改变,因为也会改变很多。因此,ROC曲线并不能捕获到这种改变。但是如果考虑到Precision的定义,我们可以发现它可以捕获到这种改变。因此,PR曲线在数据极度不平衡时,可能会有很好的性能。

Cost Curves

ROC曲线的另一个缺点是对于分类器的性能不能提供一个置信区间,因此,我们不能推断它的统计的重要性。而且在类概率不同的情况和不同的误分类代价的情况下,它也不能很好的度量。代价曲线是一种代价敏感的评价技术,它可以用来解决上述问题。

代价曲线在不同的操作点(基于正确分类一个正例样本的概率代价函数)上形成,它和ROC曲线具有一定的对偶性,ROC空间中的每个点都可以在代价曲线中表示成一个曲线。例如,ROC曲线中的点(FP,TP),那么可以利用下面公式进行表示:,其中E[C]表示期望的代价,PCF(+)代表样本作为正类的概率。

在图中表示的是,对应于ROC曲线中的点在代价曲线中的表示。通过对每个可能的操作点,选择一个分类直线,可以用来创建代价曲线。例如,可以最小化所有操作点的标准期望代价。因此,这个曲线可能提供更直接的信息,因为它直接在操作点上比较不同的分类器的性能。

多分类不平衡学习上的评价指标

上述指标多用于二分类问题上,但是也可以应用在多分类问题上。对于ROC曲线来说,我们可以生成N个ROC曲线(对应于N个类)。把其中的一个类看成是正类,其他的类都当做是负类。但是,它会因此变得对于数据不平衡非常敏感,因为这时的负类对应于其他N-1个类的样本。

在二分类中,可以通过比较AUC来比较分类器之间的性能。这时产生的AUC会有很多对AUC,可以对于每一个ROC曲线赋予一个权重(按照分类器在数据集中的泛化能力),然后把AUC按照权重结合在一起。这种方法同样是对于数据分布比较敏感。另外,还有一些其他的评价指标做出一些改变,例如,对于代价敏感学习中,在G-mean中的Recall的几何平均数中增加误分类代价。

参考文献

  1. Haibo He,Edwardo A.Garcia    《Learning from Imbalanced Data》 TKDE 2009
  2. Xu-Xing Liu,Jianxin Wu,Zhi-Hua Zhou  《Exploratory Undersampling for Class-Imbalance Learning》 TSMCB 2008

不平衡学习(Imbalanced learning)相关推荐

  1. 深度学习分类类别不平衡_Github|类别不平衡学习资源(上)

    今天推荐的是一个 github 项目,项目地址如下,主要是类别不平衡学习的论文.代码.框架.库等资源 https://github.com/ZhiningLiu1998/awesome-imbalan ...

  2. Github|类别不平衡学习资源(上)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 138 篇文章,本文大约 5400 字,阅读大约需要 15 分钟 今天 ...

  3. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):基础知识

    分类目录:<深入理解机器学习>总目录 传统的分类技术通常存在一个致命缺陷,即当其在样本分布不均衡的数据上训练时(如:采用99个健康人和1个病人的体检指标创建疾病诊断模型或99990个正常数 ...

  4. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):影响因素

    从<类别不平衡分布对传统分类器性能的影响机理>文章可以看出,类别不平衡分布是会对各种传统分类算法的性能产生负面影响的.然而,这种负面影响的大小却与很多因素有关,本文和大家探讨这些影响因素. ...

  5. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):性能评价测度

    相关文章: · 机器学习模型的性能度量 性能评价测度是用于评价分类模型"好坏"的一种量度.对于绝大多数了解分类问题的读者来讲,可能接触最多的一种性能评价测度就是分类准确率(Accu ...

  6. 深入理解机器学习——类别不平衡学习(Imbalanced Learning):应用领域

    类别不平衡学习技术并不仅仅停留在理论上,在很多现实世界的应用领域中,都会用到此类技术.其应用领域包括但不限于以下几方面. 网络入侵检测 目前,随着互联网产业的快速发展,人类的日常生活和网络的联系也变得 ...

  7. RDKit | 化合物活性数据的不平衡学习

    不平衡学习(Imbalanced learning) 不平衡数据的定义 顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,数据集中的多数类 为Smax,少数类为Smin,通常情况下把多数类样本 ...

  8. RDKit | 化合物活性数据的不平衡学习

    不平衡学习(Imbalanced learning) 不平衡数据的定义 顾名思义即我们的数据集样本类别极不均衡,以二分类问题为例,数据集中的多数类 为Smax,少数类为Smin,通常情况下把多数类样本 ...

  9. Github|类别不平衡学习资源(下)

    点击上方"算法猿的成长",关注公众号,选择加"星标"或"置顶" 总第 139 篇文章,本文大约 3600 字,阅读大约需要 10 分钟 继续 ...

最新文章

  1. 在python中使用json格式存储数据
  2. 新东家要哭了,雅虎终于承认上亿用户数据被盗
  3. 无法启动此程序,因为计算机中丢失msvcrtd.dll,Win7打开剑灵提示“丢失d3dx10_43.dll、MSVCRTD.dll文件”怎么办?...
  4. 【Linux系统编程】 浅谈标准I/O缓冲区
  5. Python是一门什么样的语言
  6. 指的是什么意思_扈三娘的外号一丈青,到底指的是什么意思?
  7. Install OpenCV-Python in Ubuntu
  8. 卸载idea_IDEA 不为人知的 5 个骚技巧!真香!
  9. ECCV 2020 论文大盘点-人员重识别(ReID)篇
  10. SGU 325 Palindrome(贪心)
  11. 家里有古玩古董摆放在家中好吗?
  12. MySQL数据库(七)
  13. http2-frame-WINDOW_UPDATE
  14. 容器技术Docker K8s 28 容器服务ACK基础与进阶-弹性伸缩
  15. 用友nc java下载_用友nc的java插件下载
  16. 石乙己——孔乙己程序员版
  17. 《Windows核心编程》读书笔记四 进程
  18. C# DevExpress 皮肤控件记住设置
  19. layui下拉框联动
  20. 【Vue全家桶+SSR+Koa2全栈开发】项目搭建过程 整合 学习目录(持续更新中)

热门文章

  1. SOHO中国高管建“老鼠仓”吸钱 大企成空壳谁之责?
  2. 计算机视觉摔倒检测,有关摔倒检测数据集(fall detection databases)
  3. applewatch与服务器连接中断,千万不要买AppleWatch的5个原因!
  4. S参数的应用|从S参数看通道阻抗匹配 | 理解插入损耗
  5. Cesium入门(五):加载WMTS瓦片地图服务
  6. 人群密度检测matlab算法,基于视频的人员密度检测.doc
  7. 数据结构——二叉树总结
  8. Flutter网络请求方式总结
  9. 统计学常识笔记整理(二)
  10. Jquery 弹出对话框插件xcConfirm.js