当前位置: 首页 > 科技观察

机器学习中如何处理不平衡数据?_0

时间:2023-03-16 22:40:32 科技观察

假设你的老板要求你创建一个模型,根据可用的各种测量结果预测产品是否有缺陷。你用数据训练了你最喜欢的分类器,它达到了96.2%的准确率!您的老板很惊讶,并决定在不进行测试的情况下使用您的模型。几个星期后,他来到你的办公室,拍了拍桌子告诉你,你的模型完全没用了,没有发现任何有缺陷的产品。经过一番调查后,您发现虽然贵公司大约3.8%的产品存在缺陷,但您的模型总是回答“无缺陷”,因此准确率为96.2%。你得到这个“天真的”结果的原因很可能是因为你使用的训练数据是一个不平衡的数据集。本文将介绍几种解决不平衡数据分类问题的方法。首先,我们将概述用于检测“幼稚行为”的不同评估指标;然后我们将讨论重新处理数据集的各种方法,并展示这些方法的误导性;***,我们将证明大部分时间重新处理数据集是继续建模的好方法。注:带有(∞)符号的章节包含较多的数学细节,可以跳过,不影响对本文的整体理解。此外,本文的大部分内容都考虑了二分类问题,但推理可以很容易地扩展到多类情况。1.检测“幼稚行为”让我们首先看一下评估分类器以确保检测到“幼稚行为”的几种方法。如前所述,准确性虽然是一个重要且不可忽视的指标,但可能会产生误导,因此应谨慎使用,最好与其他指标结合使用。让我们来看看其他指标。1.混淆矩阵、precision、recall和F1在处理分类问题的时候,一个好的简单的指标就是混淆矩阵。该指标很好地概述了模型的运行情况。因此,它是任何分类模型评估的良好起点。下图总结了大部分可以从混淆矩阵中推导出来的指标:混淆矩阵和可以从中推导出的指标我们简单解释一下:所谓准确率(accuracy)就是正确预测的数量除以预测总数;类别精度(precision)表示模型判断一个点属于该类时判断结果的可信度。类召回率(recall)表示模型能够检测到类的速率。一个类的F1分数是precision和recall的调和平均值(F1=2×precision×recall/(precision+recall)),F1可以将一个类的precision和recall结合在同一个metric中。对于给定的类,precision和recall的不同组合如下:highprecision+highrecall:模型可以很好地检测到该类;highprecision+lowrecall:模型不能很好的检测到这个类,但是当检测到这个类时,判断结果是高可靠的;lowprecision+highrecall:模型可以很好的检测出这一类,但是检测结果中也包含了其他类的点;低精度+低召回率:模型无法很好地检测到类别。我们举个例子,如下图,我们有一个10000个产品的混淆矩阵:文章开头例子的混淆矩阵。请注意,无法计算“无缺陷”精度。根据上图,准确率为96.2%,良品类精度为96.2%,不良类精度不可计算;无缺陷类的召回率为1.0(这是好的,将检测到所有无缺陷的产品),缺陷类的召回率为0(这是坏的,没有检测到缺陷产品)。因此我们可以得出结论,该模型对缺陷类不友好。次品的F1分数不可计算,无次品的F1分数为0.981。在这个例子中,如果我们查看了混淆矩阵,我们就会重新考虑我们的模型或目标,并且我们不会有以前无用的模型。2.ROC和AUROC另一个有趣的指标是ROC曲线(ReceiverOperatingCharacteristic),它的定义与给定的类别有关(下面用C表示类别)。假设对于给定的点x,我们的模型输出该点属于C类的概率为:P(C|x)。基于这个概率,我们定义了一个决策规则,当且仅当P(C|x)≥T时,x属于C类,其中T是定义决策规则的给定阈值。如果T=1,仅当模型100%可信时,才将该点标记为C类。如果T=0,则每个点都被标记为C类。阈值T从0到1的每个值生成一个点(假阳性,真阳性),ROC曲线是T时生成的点集描述的曲线从1变为0。曲线从点(0,0)开始,到点(1,1)结束,并单调增加。一个好的模型的ROC曲线会从0快速增加到1(意味着必须牺牲一点精度才能获得高召回率)。具有不同有效性的模型的ROC曲线图示。左边的模型必须牺牲很多精度才能获得高召回率;右边的模型非常高效,可以在保持高精度的同时实现高召回率。基于ROC曲线,我们可以构造另一个更容易用来评估模型的指标:AUROC(AreaUndertheROC),即ROC曲线下的面积。可以看出,AUROC在最好的情况下会趋向于1.0,在最坏的情况下会趋向于0.5。同样,良好的AUROC分数意味着我们评估的模型没有牺牲很多精度来实现特定类别(通常是少数类别)的高召回率。2.出了什么问题?1.不平衡的情况在解决问题之前,我们需要更好地理解问题。为此,我们考虑一个非常简单的例子。假设我们有两个类:C0和C1,其中C0的点服从均值为0方差为4的一维高斯分布;C1的点服从一维高斯分布,均值为2,方差为1。假设数据集中90%的点来自C0,其余10%来自C1。下图显示了根据上述假设的50个点的数据集的理论分布:不平衡情况的说明。虚线表示每个类的概率密度,实线增加了数据比例的考虑。在这个例子中,我们可以看到C0的曲线总是在C1的曲线上方,因此对于任何给定的点,它属于C0类的概率总是大于属于C1类的概率。用贝叶斯术语表达,即:在这里我们可以清楚地看到先验概率的影响,以及它如何导致一类比另一类更有可能发生的情况。这意味着,即使从理论上讲,只有分类器判断结果每次都是C0时,准确率才会最好。所以如果分类器的目标是获得最高的准确率,那么我们根本不需要训练,直接判断为C0即可。2.关于可分离性在前面的例子中,我们可以观察到这两个类似乎并没有很好地分离(相距不远)。然而,数据不平衡并不意味着这两个类不能很好地分离。例如,我们仍然假设数据集中C0和C1的比例分别为90%和10%;但C0服从均值为0方差为4的一维高斯分布,而C1服从均值为10方差为1的一维高斯分布。如下图所示:在这个例子中,如果均值差足够大,即使是不平衡的类也可以分离。这里我们看到,与前面的情况相反,C0曲线并不总是高于C1曲线,因此某些点来自C1类的概率高于来自C0类的概率。在两个类之间的距离足以补偿不平衡的情况下,分类器可能不会总是得到C0结果。3.理论最小错误概率(∞)这个我们应该理解,分类器有理论最小错误概率。对于本文所讨论的单特征二元分类器,理论最小错误概率由两条曲线的最小值下的面积给出:不同分离度的两个类的理论最小错误可以用公式形式表示。事实上,从理论上讲,最好的分类器会从两个类中选择点x最有可能属于的类。这自然意味着对于给定的点x,最好的理论错误概率由这两个类中可能性较小的给出,也就是我们接下来可以对整体进行积分,得到总的错误概率:也就是上图中的面积在中两条曲线的最小值下。3.重新处理数据集并不总是解决方案面对不平衡的数据集,我们的第一反应可能是认为数据不代表现实。如果这是正确的,即实际数据应该(或接近)平衡,但由于我们收集数据的方式存在问题,数据存在比例偏差。因此,我们必须尝试收集更具代表性的数据。在接下来的两个小节中,我们将简要介绍一些常用的解决不平衡类和处理数据集本身的方法。特别是,我们将讨论欠采样、过采样和生成合成数据的风险。和好处。1.欠采样、过采样和生成合成数据这三种方法通常用于在训练分类器之前平衡数据集。简单来说:欠采样:从样本较多的类中重新采样,只保留一部分样本点;过采样:复制少数类中的一些点以增加其基数;生成合成数据:从少数类的合成点中创建一个新类,增加其基数。所有这些方法都有一个目的:重新平衡(部分或全部)数据集。但是我们是否应该重新平衡数据集以获得具有相同数据量的两个类?还是样本较多的类别应该保持最具代表性?如果是这样,我们应该以什么比例重新平衡?不同程度的多数类欠采样对模型决策的影响当使用重采样方法时(例如,从C0获得的数据多于从C1获得的数据),我们向分类器显示训练期间两个类的误差比例。以这种方式学习的分类器在未来的真实测试数据上的准确性甚至低于在未更改的数据集上训练的分类器。事实上,类别的真实比例对于分类新点非常重要,并且在对数据集重新采样时会丢失此信息。因此,即使没有完全拒绝这些方法,我们也应该谨慎使用它们:有目的的选择新的比例可以导致一些相关的方法(在下一节中讨论),但如果不考虑问题的本质进一步重新平衡,那么这个过程可能毫无意义。总而言之,当我们通过重采样修改数据集时,我们正在改变事实,因此我们需要小心并记住这对分类器的输出意味着什么。2.添加额外的特征来重新采样数据集(修改类别比例)是好是坏取决于分类器的目的。如果两个类是不平衡的,不可分离的,而我们的目标是获得最好的准确率,那么我们得到的分类器只会将数据点归为一类;但这不是问题,只是一个事实:对于这些变量,没有其他更好的选择。除了重采样之外,我们还可以在数据集中加入一个或多个其他特征,使数据集更加丰富,从而可能获得更准确的结果。回到前面的例子(两个类不能很好的分离),我们附上一个新的特征来帮助分离两个类,如下图:寻找额外的特征可以将原本不可分离的类与之前的类进行比较使用小节中提到的重采样方法,该方法用更多来自现实的信息丰富了数据,而不是改变数据的真实性。四、最好重新解决问题到目前为止,结论似乎是令人失望的:如果要求数据集代表真实数据,而我们无法获得任何额外的特征,那么如果我们以最高准确率来判断分类器,那么我们得到的是一个“幼稚的行为”(判断结果总是同一个类),这时候我们不得不接受它作为事实。但是,如果我们对这样的结果不满意怎么办?这意味着,实际上我们的问题没有得到很好的表征(否则我们应该能够接受模型结果),所以我们应该重新解决我们的问题以获得想要的结果。让我们看一个例子。1.基于成本的分类结果不佳的根本原因是目标函数没有明确定义。到目前为止,我们一直假设分类器具有很高的准确性,并且两种类型的错误(“误报”和“漏报”)具有相同的成本。在我们的例子中,这意味着真实标签C1和预测C0与真实标签C0和预测C1一样糟糕,并且误差是对称的。然而,实际情况往往并非如此。让我们考虑本文的第一个示例,关于有缺陷的(C1)和无缺陷的(C0)产品。可以想象,对于一个企业来说,不检测缺陷产品的成本远大于将无缺陷的产品标记为缺陷的成本(如客户服务成本、法律审判成本等)。所以在实际案例中,犯错的代价是不对称的。让我们更具体地考虑一下,假设:真实标签为C1且预测为C0时的成本为P01真实标签为C0且预测为C1时的成本为P10其中P01和P10满足:0接下来,我们可以重新定义目标函数:与其追求最高精度,不如寻找更低的预测成本。2.理论最小成本(∞)从理论上讲,我们要最小化的不是上面定义的错误概率,而是预期的预测成本:其中C(.)定义了分类器函数。因此,如果我们想要最小化预期的预测成本,理论上的***分类器C(.)最小化,或者等效地,除以x的密度,C(.)最小化。有了这个目标函数,从理论上讲,最好的分类器应该是这样的:注意:当成本相等时,我们恢复“经典”分类器的表达(仅精度)。3.ProbabilityThreshold分类器中考虑成本的第一种可能方式是训练后,即按基本方式训练分类器,输出以下概率:这里不考虑成本。然后,如果满足以下条件,则预测类别为C0,否则为C1。在这里,使用哪个分类器并不重要,只要它输出给定点的每个类别的概率即可。在我们的例子中,我们可以在数据上拟合一个贝叶斯分类器,然后根据成本误差重新加权获得的概率来调整分类器。概率阈值方法:对输出概率进行重新加权,以便在最终决策规则中考虑成本。4.Classreweighting类重加权(classreweighting),即分类器训练时直接考虑成本误差的不对称性,使得每个类的输出概率嵌入成本误差信息。然后,该概率将用于定义阈值为0.5的分类规则。对于某些模型(如神经网络分类器),我们可以通过调整目标函数在训练时将成本考虑在内。我们仍然想要分类器输出,但这次训练将最小化输入成本错误信息的成本函数。如果考虑P01和P10的成本(比如P01>P10),我们可以:根据P01/P10的比例对少数类进行过采样(少数类的基数乘以P01/P10);对于多数类,根据P10/P01欠采样的比率(将多数类的基数乘以P10/P01)。ClassReweighting方法:多数类按比例欠采样,可以直接在类比例中引入成本信息。五、总结本文的核心思想是:当我们使用机器学习算法时,我们必须谨慎选择模型的评估指标:我们必须使用那些能够帮助更好地了解模型在实现目标方面的表现的指标;在处理不平衡数据集时,如果类与给定的变量没有很好地分离,而我们的目标是获得最高的准确率,那么得到的分类器可能只是一个预测多数类的朴素分类器;可以使用重采样方法,但必须仔细考虑:这不应该作为一个独立的解决方案,而必须与问题结合起来以达到特定的目标;返工问题本身通常是解决不平衡类别问题的最佳方法:必须根据目标设置分类器和决策规则。需要注意的是,本文并未讨论所有技术,例如通常用于批量训练分类器的“分层抽样”技术。这种技术(通过消除批次内的比例差异)可以使训练过程在面对不平衡类时更加稳定。***,我需要强调一下,本文的主要关键词是“目标”。获得正确的目标将有助于克服不平衡的数据集并确保最佳结果。准确定义目标是首要任务,也是创建机器学习模型所需选择的起点。原文链接:https://towardsdatascience.com/handling-imbalanced-datasets-in-machine-learning-7a0e84220f28【本文为专栏组织《机器之心》原文翻译,微信公众号《机器之心》Machine(id:almosthuman2014)》]点此阅读更多本作者好文