干货|在机器学习中如何应对不均衡分类问题?
在处理机器学习等数据科学问题时,经常会碰到不均衡种类分布的情况,即在样本数据中一个或多个种类的观察值明显少于其他种类的观察值的现象。在我们更关心少数类的问题时这个现象会非常突出,例如窃电问题、银行诈骗性交易、罕见病鉴定等。在这种情况下,运用常规的机器学习算法的预测模型可能会无法准确预测。这是因为机器学习算法通常是通过减少错误来增加准确性,而不考虑种类的平衡。这篇文章讲了不同的方法来解决这个不均衡分类问题,同时说明了这些方法的好处和坏处。
不均衡数据集一般是指少数类所占比例少于5%的数据集,少数类通常是指稀有事件的发生。例如在一个公共欺诈检测数据集中,有如下数据:
总观测数据 = 1000 欺诈的观测数据 = 20 非欺诈的观测数据 = 980 事件发生率 = 2%
在分析这个数据集时最主要的问题是,如何通过合适的稀有事件的样本数目得到一个平衡的数据集?
传统的模型评估方法不能准确的评价不均衡数据集训练的模型的表现。显然,模型趋向于预测多数集,少数集可能会被当作噪点或被忽视。因此,相比于多数集,少数集被错分的可能性很大。当使用一个不均衡数据集训练模型时,准确率并不是一个合适的评价方式。假如一个分类器可以达到98%的准确率,我们会认为这个模型表现很好,而对于一个少数集占总体2%的数据集来说,如果分类器把全部都预测为多数集,准确率就能达到98%,可是这个分类器对于预测没有任何用处。
不均衡数据集解决方法
解决不均衡数据集带来的模型预测不准确的问题主要有两种方法,第一种方法是在数据层面将数据集转变为较为平衡的数据集,然后进行建模;第二种则是在算法层面改进算法模型的表现。
数据层面方法:重抽样
在将数据用于建模之前,先运用重抽样技术使数据变平衡。平衡数据主要通过两种方式达到:增加少数类的频率或减少多数类的频率。通过重抽样来改变两个种类所占的比例。
随机欠抽样
随机欠抽样技术通过随机删除多数类的实例来平衡种类分布。在之前的例子中,我们无放回的取10%非欺诈数据,结合所有的欺诈数据形成新数据集。这样,总观测数据变为20+980*10%=118,而欠抽样之后新数据集的事件发生率为20/118=17%。
当训练数据很多时,随机欠抽样通过减少训练数据的数量提高运行时间和解决存储问题。然而,这也会带来潜在有效信息被删除的问题。欠抽样选择的数据可能是偏差样本,无法准确代表总体。因此,会导致在测试集中表现欠佳。
随机过抽样
过抽样技术是通过随机复制少数类的实例来增加少数类的数量。在之前的例子中,复制20个少数实例20遍,使少数类数据变为400条,总观测数据变为980+400=1380,事件发生概率为400/1380=29%。与欠抽样不同,过抽样不会损失任何信息。一般来说,过抽样表现好于欠抽样。然而,由于过抽样复制了多遍少数类数据,导致过拟合(over-fitting)的可能性变大。
基于聚类的过抽样
基于聚类的过抽样是将k-means聚类算法分别应用在少数类和多数类中,识别出数据集中不同簇(cluster)。随后,通过对每个簇过抽样来确保多数类和少数类的簇中实例的数目相等。假设对于刚才的数据集做聚类结果如下:
多数类簇:
簇1: 150观测数据
簇2: 120观测数据
簇3: 230观测数据
簇4: 200观测数据
簇5: 150观测数据
簇6: 130观测数据
少数类簇:
簇1: 8观测数据
簇2: 12观测数据
对簇过抽样之后,每个相同种类的簇含有相同的数量的观测数据:
多数类簇:
簇1: 170观测数据
簇2: 170观测数据
簇3: 170观测数据
簇4: 170观测数据
簇5: 170观测数据
簇6: 170观测数据
少数类簇:
簇1: 250观测数据
簇2: 250观测数据
基于聚类的过抽样之后,事件发生率为 500/(1020+500)=33%。这种方法考虑了多数类少数类由不同的簇组成,解决了每个簇所包含的实例不同的问题。然而,由于这是一种过抽样技术,同样也可能会导致过拟合。
合成少数类过抽样(SMOTE)
SMOTE避免了复制少数类导致的过拟合问题。用少数类的子集来创造新的合成的相似少数类实例。将这些合成的实例加入原有数据集,丰富少数类的数据。下图展示了创造合成实例的方法。
图1:通过SMOTE创造合成实例
还是用之前的例子,在少数类中选取15个样本实例,合成20次新的数据。少数类数据变为为300条,事件发生率为300/1280=23.4%。
这种方法通过合成新数据缓解了由于复制少数类带来的过拟合问题,同时不会造成有效信息丢失。然而,当合成新实例时,没有考虑与其他类的相邻实例,这可能会导致种类重叠,并且可能会添入额外的噪点。
算法集合技术
上面所说的技术都是通过对原数据集进行重抽样来得到均衡数据集。在这一部分中,我们将对于现有分类算法进行改进,使其适用于不均衡数据集。算法合成的目的是提升单一分类器的表现,下图展示了合成算法的方法。
图2:算法集合技术的方法
基于bagging
Bagging是Bootstrap Aggregating的缩写。传统的bagging算法生成n个可以互相替换的bootstrap训练样本。基于每个样本,训练不同的模型,最后汇总这些模型的预测结果。Bagging可以减少过拟合,从而创造更精准的预测模型。与boosting不同的是,bagging允许对训练样本集进行替换。下图展示了bagging的流程。
图3: Bagging的方法
在之前的例子中,从总体中可替换的抽取10个bootstrap样本,每个样本包含200个观测值。每个样本都与原始数据不相同,但是与原始数据的分布和可变性相似。很多机器学习算法都可以用来训练这10个bootstrap样本,如逻辑回归、神经网络、决策树等,得到10个不同的分类器C1,C2…C10。将这10个分类器 集合成一个复合分类器。这种集合算法结合了多个单独的分类器的结果,可以得到一个更好的复合分类器。Bagging算法提升了机器学习算法的稳定性和准确性,并且解决了过拟合问题。在有噪点的数据环境中,bagging比boosting表现更加优异。
基于Boosting
Boosting也是一个算法集合技术,它将弱分类器结合起来,形成一个可以准确预测的强分类器。Boosting从一个为训练集准备的弱分类器开始。弱分类器是指预测准确率只比平均数高一点的分类器,如果数据发生一点变化就会导致分类模型发生很大变化。Boosting是一种提高任意给定学习算法精确度的方法。下图展示了Boosting的方法。
图4: Boosting的方法
下面介绍几种不同的boosting技术。
Ada Boost是Boosting算法家族中的代表算法,通过结合许多弱分类器形成一个准确的预测分类器。每个分类器的目的都是正确分类上一轮被分错的实例。每一轮之后,被分错的实例的权重增加,被正确分类的实例的权重降低。应用Ada Boost到刚才的不均衡数据集中,首先给每一个实例相同的权重,假设基础分类器只分对了400个实例,将这400个实例的权重减小为,剩下600个被错分的实例的权重增加到。每一轮中,弱分类器通过更新权重来提升它的表现。这个过程持续到错分率明显下降,分类器变成了强分类器为止。Ada Boost的好处在于它非常便于执行,而且非常普遍,适用于所有种类的分类算法,也不会导致过拟合。坏处是它对于噪点和异常值非常敏感。
Gradient Boosting 是一个最优化算法,每个模型都按顺序通过Gradient Descent方法最小化损失函数。在Gradient Boosting中,决策树被当作一个弱分类器。Ada Boost和Gradient Boosting都是将弱分类器变为强分类器的方法,但这两种方法有本质的不同。Ada Boost在学习过程开始之前要求用户设立弱分类器集或者随机生成弱分类器集,每一个弱分类器的权重会根据是否分类正确调整。Gradient Boosting则是在训练集上建立第一个分类器预测,接着计算损失值,然后运用损失值来改进分类器。每一步中,损失函数的残差都会通过Gradient Descent Method来计算。在随后的迭代中,新的残差变成了目标变量。Gradient Tree Boosting比随机森林更难以拟合。它有三个参数可以微调,Shrinkage参数,树的深度和树的数量。选择合适的参数才能得到好的拟合的Gradient boosted tree。如果参数调整的不正确,可能会导致过拟合。