前言

非均衡问题(Imbalanced Problem)是指在一个数据集中,不同类别之间的样本数量差异较大的情况。例如,一个二分类问题中,其中一类的样本数比另一类多很多,通常会被认为是一个非均衡问题。这部分是讨论机器学习算法在应用方面的评价问题。

在前面,我们构建了一个用于检测患疝病的马匹是否存活的系统。在那里,我们构建了分类器,但是并没有对分类后的情形加以讨论。假如某人给我们牵来一匹马,他希望我们能预测这匹马能否生存。我们说马会死,那么他们就可能会对马实施安乐死,而不是通过给马喂药来延缓其不可避免的死亡过程。我们的预测也许是错误的,马本来是可以继续活着的。毕竟,我们的分类器只有80%的精确率(accuracy)。如果我们预测错误,那么我们将会错杀了一个如此昂贵的动物,更不要说人对马还存在情感上的依恋。

本文内容学习来源感谢:

  • 《Machine Learning in Action》
  • 《智能之门》
  • 哔哩哔哩,维基百科等网络

前排说明

  • 本文所有代码基于 Python 3.10 版本,理论上你的版本为 3.X 皆可运行。
  • 在代码的注释中看到符号:❓,则表示注释的代码部分函数解释说明可以在最后的相关函数中查阅。

其他分类性能度量指标

正确率、召回率

到现在为止,本文所有机器学习内容的都是基于错误率来衡量分类器任务的成功程度的。错误率指的是在所有测试样例中错分的样例比例。实际上,这样的度量错误掩盖了样例如何被分错的事实。在机器学习中,有一个普遍适用的称为混淆矩阵(confusion matrix)的工具,它可以帮助人们更好地了解分类中的错误。有这样一个关于在房子周围可能发现的动物类型的预测,这个预测的三类问题的混淆矩阵如下所示。

image-20230828224701523

利用混淆矩阵就可以更好地理解分类中的错误了。如果矩阵中的非对角元素均为0,就会得到一个完美的分类器

接下来,我们考虑另外一个混淆矩阵,这次的矩阵只针对一个简单的二类问题。在上图中中,给出了该混淆矩阵。在这个二类问题中,如果将一个正例判为正例,那么就可以认为产生了一个真正例(True Positive,TP,也称真阳);如果对一个反例正确地判为反例,则认为产生了一个真反例(True Negative,TN,也称真阴)。相应地,另外两种情况则分别称为伪反例(False Negative,FN,也称假阴)和伪正例(False Positive,FP,也称假阳)。这 4 种情况如下图所示。

image-20230828225151852

在分类中,当某个类别的重要性高于其他类别时,我们就可以利用上述定义来定义出多个比错误率更好的新指标。第一个指标是正确率(Precision),它等于 $正确率 =\Large \frac{真正例}{真正例+伪正例}$,给出的是预测为正例的样本中的真正正例的比例。第二个指标是召回率(Recall) ,它等于 $\Large 召回率 = \frac{真正例}{真正例 + 伪反例}$,给出的是预测为正例的真实正例占所有真实正例的比例在召回率很大的分类器中,真正判错的正例的数目并不多

我们可以很容易构造一个高正确率或高召回率的分类器,但是很难同时保证两者成立。如果将任何样本都判为正例,那么召回率达到百分之百而此时正确率很低。构建一个同时使正确率和召回率最大的分类器是具有挑战性的。

ROC曲线

另一个用于度量分类中的非均衡性的工具是ROC曲线(ROC curve),ROC代表接收者操作特征(receiver operating characteristic),它最早在二战期间由电气工程师构建雷达系统时使用过。下图给出了一条ROC曲线的例子。

image-20230828230126645

在上图的 ROC 曲线中,给出了两条线,一条虚线一条实线。图中的横轴是伪正例的比例($伪正例比例 =\Large \frac{伪正例}{真反例+伪正例}$)),而纵轴是真正例的比例($真正例比例 =\Large \frac{真正例}{真正例+伪反例}$)。ROC曲线给出的是当阈值变化时假阳率和真阳率的变化情况。左下角的点所对应的是将所有样例判为反例的情况,而右上角的点对应的则是将所有样例判为正例的情况。虚线给出的是随机猜测的结果曲线。

ROC曲线不但可以用于比较分类器,还可以基于成本效益(cost-versus-benefit)分析来做出决策。由于在不同的阈值下,不同的分类器的表现情况可能各不相同,因此以某种方式将它们组合起来或许会更有意义。如果只是简单地观察分类器的错误率,那么我们就难以得到这种更深入的洞察效果了。

在理想的情况下,最佳的分类器应该尽可能地处于左上角,这就意味着分类器在假阳率很低的同时获得了很高的真阳率。例如在垃圾邮件的过滤中,这就相当于过滤了所有的垃圾邮件,但没有将任何合法邮件误识为垃圾邮件而放入垃圾邮件的文件夹中。

对不同的ROC曲线进行比较的一个指标是曲线下的面积(Area Unser the Curve,AUC)。AUC 给出的是分类器的平均性能值,当然它并不能完全代替对整条曲线的观察。一个完美分类器的AUC为 1.0,而随机猜测的AUC则为 0.5。

基于代价函数的分类器决策控制

除了调节分类器的阈值之外,我们还有一些其他可以用于处理非均衡分类的代价的方法,其中的一种称为代价敏感的学习(cost-sensitive learning)。考虑下图中的代价矩阵,第一张表给出的是到目前为止分类器的代价矩阵(代价不是0就是1)。我们可以基于该代价矩阵计算其总代价:TP*0+FN*1+FP*1+TN*0。接下来我们考虑下面的第二张表,基于该代价矩阵的分类代价的计算公式为:TP*(-5)+FN*1+FP*50+TN*0。采用第二张表作为代价矩阵时,两种分类错误的代价是不一样的。类似地,这两种正确分类所得到的收益也不一样。如果在构建分类器时,知道了这些代价值,那么就可以选择付出最小代价的分类器。

image-20230828232028089

处理非均衡问题的数据抽样方法

另外一种针对非均衡问题调节分类器的方法,就是对分类器的训练数据进行改造。这可以通过欠抽样(undersampling)或者过抽样(oversampling)来实现。过抽样意味着复制样例,而欠抽样意味着删除样例。不管采用哪种方式,数据都会从原始形式改造为新形式。抽样过程则可以通过随机方式或者某个预定方式来实现。

通常也会存在某个罕见的类别需要我们来识别,比如在信用卡欺诈当中。如前所述,正例类别属于罕见类别。我们希望对于这种罕见类别能尽可能保留更多的信息,因此,我们应该保留正例类别中的所有样例,而对反例类别进行欠抽样或者样例删除处理。这种方法的一个缺点就在于要确定哪些样例需要进行剔除。但是,在选择剔除的样例中可能携带了剩余样例中并不包含的有价值信息。

上述问题的一种解决办法,就是选择那些离决策边界较远的样例进行删除。假定我们有一个数据集,其中有50例信用卡欺诈交易和5000例合法交易。如果我们想要对合法交易样例进行欠抽样处理,使得这两类数据比较均衡的话,那么我们就需要去掉4950个样例,而这些样例中可能包含很多有价值的信息。这看上去有些极端,因此有一种替代的策略就是使用反例类别的欠抽样和正例类别的过抽样相混合的方法。

要对正例类别进行过抽样,我们可以复制已有样例或者加入与已有样例相似的点。一种方法是加入已有数据点的插值点,但是这种做法可能会导致过拟合的问题。

End

细枝末节的内容,但是有有些重要。

image-20230828232455777