例如,假设你有两个类- A类和B类。A类在你的数据集中占了90%,B类占了10%,但是你最感兴趣是B类中的识别实例。只需每次预测A类,你可以达到90%的精确度,但是这为你预期的用例提供了一个无用的分类器。相反,一个适当校准的方法可能会降低精确度,但会有一个更高的真阳性率(召回率),这是你本应该优化的指标。这些场景通常发生在检测的环境中,比如在线的滥用内容,或者医疗数据中的疾病标记。
现在,我将讨论几种可以用来解决不平衡类问题的技术。一些技术适用于大多数分类问题,而另一些技术可能更适合于特定的不平衡级别。在本文中,我将以二进制分类的方式讨论这些问题,但在大多数情况下,相同的内容将用于多数类分类。我还假设目标用来识别少数类,否则,这些技术并不是必需的。
度量
一般来说,这个问题处理的是在召回率(被分类为正向实例的百分比)和精确率的(正向分类的百分比)之间的权衡。在我们想要检测少数类的实例的情况下,我们通常更关心的是召回率而不是精确率,因为在检测的环境中,错过一个正向的实例通常比错误地标记一个负面的实例要昂贵得多。例如,如果我们试图检测滥用内容,那么让一个人工审阅人员发现内容实际上并没有滥用这个过程不是重要的,但是要识别那些从来没有标记过的滥用内容就困难得多了。因此,当将方法与不平衡的分类问题进行比较时,考虑使用超出准确性的度量,如召回率、精确率和AUROC。可能在参数选择或模型选择中切换你优化的度量标准,足以提供令人满意的性能检测少数类。
代价敏感学习
在常规学习中,我们平等地对待所有的错误分类,这导致了分类中的不平衡问题,因为在大多数类中识别少数类没有额外的奖励(extra reward)。代价敏感学习改变了这种情况,并使用一个函数C(p, t)(通常表示为一个矩阵),其中指定将t类实例错误分类成p类实例。这让我们惩罚少数类的错误分类多于多数类的错误分类,希望以此增加真阳性率。一个常见的方案是让代价等于这个类所组成的数据集的比例的倒数。当类的大小减少时,就增加了惩罚。
成本函数矩阵样本
采样
解决不平衡的数据集的一种简单方法就是通过对少数类的实例进行采样,或者对大多数类的实例进行采样。这只允许我们创建一个平衡的数据集,从理论上来说,它不应该导致分类器偏向于一个类或另一个类。然而,在实践中,这些简单的采样方法有缺陷。对少数类进行过度采样会导致模型的过度拟合,因为它会引入重复的实例,从已经很小的实例池中抽取。类似地,对大多数类进行采样调查可能会遗漏重要的实例,这些实例提供了两个类之间的重要差异。
还有一些更强大的采样方法,不仅仅是简单的过采样或欠采样。最著名的例子是SMOTE算法,通过形成相邻实例的凸组合,从而创建了少数类的新实例。就像下面的图表显示的那样,它有效地画出了特征空间中的少数点,以及沿着这些线的样本。这使我们能够在不太合适的情况下平衡我们的数据集,因为我们创建了新的合成(synthetic)示例而不是使用重复项(duplicates)。然而,这并不能防止所有的过度拟合,因为这些仍然是由现有的数据点创建的。
SMOTE算法的可视化
异常检测
在更极端的情况下,在异常检测的背景下考虑分类可能会更好。在异常检测中,我们假设有一个数据点的“正态”分布,任何与该分布完全偏离的东西都是异常的。当我们将分类问题重新定义为一个异常检测问题时,我们将多数类视为“正常”的点分布,少数则为异常。有许多用于异常检测的算法,如聚类方法、一类支持向量机(One-class SVM)和Isolation Forests。
对于异常检测的聚类方法的可视化
结论
希望这些方法的组合能让你创建更好的分类器。就像我之前说过的,这些技术中的其中一些可以更好地适应不同程度的不平衡。例如,简单的采样技术可以使你克服轻微的不平衡,而极端的不平衡可能需要异常检测方法。最终,对于这个问题,没有一种万能的方法,你只需尝试每个方法,看看它们如何成功地应用于你的特定用例和度量。