大家从两个层面和维度来看解决数据类别不平衡问题的方案:
1.数据层面解决方案
2.算法层面解决方案
从数据层面解决类别不平衡问题
数据层面的方法主要包括过样本、数据动态采样、数据合成:
(1)过样本(oversampling)和欠采样(undersampling)
过抽样
过抽样(也叫上采样、over-sampling)方法通过增加分类中少数类样本的数量来实现样本均衡,最直接的方法是简单复制少数类样本形成多条记录,这种方法的缺点是如果样本特征少而可能导致过拟合的问题;经过改进的过抽样方法通过在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本,例如SMOTE算法。
欠抽样
欠抽样(也叫下采样、under-sampling)方法通过减少分类中多数类样本的样本数量来实现样本均衡,最直接的方法是随机地去掉一些多数类样本来减小多数类的规模,缺点是会丢失多数类样本中的一些重要信息。
(2)动态采样(dynamicsampling)
动态采样就是将根据训练结果对数据集进行动态调整,对结果较好的类别进行随机删除样本操作,对结果较差的类别进行随机复制操作,以保证分类模型每次学习都能学到相关的信息。
注意:当使用重采样方法(例如从C0获得的数据多于从C1获得的数据)时,大家在训练过程向分类器显示了两个类的错误比例。以这种方式学得的分类器在未来实际测试数据上得到的准确率甚至比在未改变数据集上训练的分类器准确率还低。实际上,类的真实比例对于分类新的点非常重要,而这一信息在重新采样数据集时被丢失了。
当大家采用重采样的方法修改数据集时,大家正在改变事实,因此需要小心并记住这对分类器输出结果意味着什么。
(3)数据合成
生成合成数据是从少数类创建新的合成点,以增加其基数。合成方法指的是在每次生成训练集时使用所有分类中的小样本量,同时从分类中的大样本量中随机抽取数据来与小样本量合并构成训练集,这样反复多次会得到很多训练集和训练模型。最后在应用时,使用组合方法(例如投票、加权投票等)产生分类预测结果。
例如,在数据集中的正、负例的样本分别为100和10000条,比例为1:100。此时可以将负例样本(类别中的大量样本集)随机分为100份(当然也可以分更多),每份100条数据;然后每次形成训练集时使用所有的正样本(100条)和随机抽取的负样本(100条)形成新的数据集。如此反复可以得到100个训练集和对应的训练模型。
这种解决问题的思路类似于随机森林。在随机森林中,虽然每个小决策树的分类能力很弱,但是通过大量的“小树”组合形成的“森林”具有良好的模型预测能力。
SMOTE算法的基本思想是对少数类样本进行分析并根据少数类样本人工合成新样本添加到数据集中,具体下图所示,算法流程如下:
1、对于少数类中每一个样本x,计算该点与少数类中其他样本点的距离,得到最近的k个近邻(即对少数类点进行KNN算法)。
2、根据样本不平衡比例设置一个采样比例以确定采样倍率,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为x’。
3、对于每一个随机选出的近邻x’,分别与原样本按照如下的公式构建新的样本:
xnew=x+rand(0,1)∗(x′−x)
但是SMOTE算法缺点也十分明显:一方面是增加了类之间重叠的可能性(由于对每个少数类样本都生成新样本,因此容易发生生成样本重叠(Overlapping)的问题),
另一方面是生成一些没有提供有益信息的样本。
(4)添加额外特征
除了重采样的方法外,还可以在数据集中添加多个其他特征来丰富数据集,这样可能获得更好的准确率结果。针对两个类无法很好地分离开来,大家附加一个新的特征帮助分离两个类:
基于算法层面解决类别不平衡问题
在介绍之前,大家首先要理解两个概念精度和召回率:
高精度+高召回率:模型能够很好地检测该类;高精度+低召回率:模型不能很好地检测该类,但是在它检测到这个类时,判断结果是高度可信的;低精度+高召回率:模型能够很好地检测该类,但检测结果中也包含其他类的点;低精度+低召回率:模型不能很好地检测该类。
但是这种评估并不符合现实的情况,而结果不好的根本原因在于目标函数没有得到很好的定义。截至此时,大家一直假设分类器具备高准确率,同时假设两类错误(「假阳性」和「假阴性」)具有相同的成本(cost)。在大家的例子中,这意味着真实标签为C1、预测结果为C0与真实标签为C0、预测结果为C1一样糟糕,错误是对称的。然而实际情况往往不是这样。
让大家考虑本文第一个例子,关于有缺陷(C1)和无缺陷(C0)产品。可以想象,对公司而言,没有检测到有缺陷的产品的代价远远大于将无缺陷的产品标注为有缺陷产品(如客户服务成本、法律审判成本等)。因此在真实案例中,错误的代价是不对称的。
因此,大家需要重新指定目标评估函数:
基于算法层面的方法主要对现有的深度学习算法进行改进,通过修改损失函数或学习方式的方法来消除类别不平衡带来的影响。
MSFE(meansquaredfalseerrorloss)
输出阈值(outputthresholding)
通过调整网络结果的输出阈值来改善类别不平衡的问题。模型设计者根据数据集的构成和输出的概率值,人工设计一个合理的阈值,以降低样本数目较少的类别的输出要求,使得其预测结果更加合理。
在分类器中考虑成本的第一种可行方法是在训练后进行,也即按照基本的方法训练分类器,输出如下概率:
这里没有考虑任何成本。然后,如果满足下述条件
则预测类为C0,否则为C1。
这里,只要输出给定点的每个类的概率,使用哪个分类器并不重要。在大家的例子中,大家可以在数据上拟合贝叶斯分类器,然后对获得的概率重新加权,根据成本误差来调整分类器。
类重新加权
类重新加权(classreweight),即在分类器训练期间直接考虑成本误差的不对称性,这使每个类的输出概率都嵌入成本误差信息。然后这个概率将用于定义具有0.5阈值的分类规则。
对于某些模型(例如神经网络分类器),大家可以在训练期间通过调整目标函数来考虑成本。大家仍然希望分类器输出
但是这次的训练将使以下的成本函数最小化
对于一些其他模型(例如贝叶斯分类器),大家可以使用重采样方法来偏置类的比例,以便在类比例内输入成本误差信息。如果考虑成本P01和P10(如P01>P10),大家可以:
对少数类按照P01/P10的比例进行过采样(少数类的基数乘以P01/P10);对多数类按照P10/P01的比例进行欠采样(多数类的基数乘以P10/P01)。
类重新加权方法:多数类按比例进行欠采样,这样可以直接在类比例中引入成本信息总结