2.4 类平衡
在使用大多数机器学习算法(特别是有监督的算法)时,使用每个类包含几乎相同数量的样本的数据集训练模型非常重要。请记住,我们的目标是训练模型,这些模型能够以最佳的方式推广到所有可能的类,假设我们有一个包含1000个样本的二进制数据集,两类样本的比例为(0.95,0.05)。在很多情况下,这个比例很常见。例如,垃圾邮件检测器可以收集大量垃圾邮件,但访问个人接收的电子邮件要困难得多。但是,我们可以假设某些用户(非常小的百分比)决定共享匿名的常规邮件,从而使我们的数据集包含5%的非垃圾邮件条目。
现在,让我们考虑一个输出标签始终为0(例如由于错误导致标签始终为0)的静态算法。哪个是最终准确度?在类似的情况下,我们会期望类似基于随机扔硬币的预测行为,但是,毫不奇怪,我们发现该算法达到了95%的准确度!这怎么可能?仅仅因为数据集是不平衡的,并且标签1的样本数量相对于总数据集大小可以忽略不计。因此,在进行任何训练过程之前,重要的是对数据进行基本的描述性分析,尝试纠正不平衡问题。
2.4.1 可置换的重采样
解决此问题的最常见方法是基于重采样过程。这种方法非常简单,但不幸的是,它有许多缺点。考虑到前面的示例,我们可以决定对类1进行上采样,以匹配属于类0的样本数。但是,我们只能使用现有数据,并且在每个采样步骤之后,从原始数据集重新开始(置换)。为了更好地理解这个过程,让我们假设使用scikit-learn的make_classification函数生成数据集(我们将在接下来的章节中多次使用它):
我们可以这样检查两个子数组的形状:
正如预期的那样(我们进行了类的权重设置),第一类占主导地位。在对置换进行上采样时,我们从仅限于次要类(1)的数据集中进行采样,直到达到所需的元素数量。当我们执行置换操作时,它可以被迭代任意次,但结果数据集将始终包含从54个可能值中采样的点。在scikit-learn中,可以使用内置的resample函数执行此操作:
函数样本来自子数组X[Y==1],生成通过n_samples参数选择的样本数(在例子中,我们选择创建两个具有相同样本数的类)。最后,有必要将包含带有标签0的样本的子集连接到上采样的子集(对标签也是如此)。如果我们检查新的数据形状,可得到以下结果:
正如期望的那样,现在这些类已经平衡。显然,可以通过对主要类进行采样来完成相同的过程,但是应该仔细分析这个过程,因为在这种情况下存在信息丢失。每当数据集包含许多冗余样本时,此操作就不那么危险,但是,正如经常发生的那样,删除有效样本会对最终准确性产生负面影响,因为在训练阶段可能永远不会覆盖某些特征值。即使重采样置换也不是很有效(因为它不能生成新样本),我通常建议将上采样作为默认选择。当样本的方差非常小(均值周围有许多样本)时,对主要的类别进行下采样是合理的,而对于均匀分布这不是太合适的选择。
2.4.2 合成少数类过采样
Chawla等人提出了一种更强大的算法(在SMOTE:Synthetic Minority Over-sampling Technique,Chawla N.V.,Bowyer K.W.,Hall L.O.,Kegelmeyer W.P.,Journal of Artificial Intelligence Research,16/2002)。该算法被称为合成少数类过采样技术(SMOTE),与前一个算法相反,它被设计用于生成与次要类分布一致的新样本。该算法的完整描述超出了本书的范围(可以在上述论文中找到),其主要思想是考虑样本之间存在的关系,并沿着已知点之间的连线创建新的合成点。考虑图2-8。
图2-8 包含三个点(x1,x2,x3)和两个合成点的邻域的示例
三个点(x1,x2,x3)属于次要类并且是同一邻域的成员(如果读者不熟悉这个概念,可以认为是相互距离低于固定阈值的一组点)。SMOTE可以通过生成样本x1u和x2u并将它们放置在连接原始样本的线段上,来对类进行采样。通过假设样本不在某个邻域半径以下变化,可以更好地理解该过程,因此可以创建属于相同原始分布的合成变体。然而,与可置换重采样相反,新数据集具有更大的方差,并且通用分类器可以更好地找到合适的分离超平面。
为了展示SMOTE的工作原理,我们将采用一种名为imbalanced-learn的scikit-learn扩展(参见本节最后的重要提示),该扩展实现了利用许多算法来实现这类问题。可以使用SMOTE类的实例获取平衡数据集(基于我们之前生成的数据集):
fit_sample方法分析原始数据集并从次要类自动生成合成样本。最重要的参数如下:
ratio(默认为'auto'):它确定哪个类必须重新采样(可接受的值是'minority','majority','all'和'not minority')。每个备选参数的含义都很直观,但总的来说,我们通过对整个数据集进行重新采样(和平衡)来对少数类进行上采样。
k_neighbors(默认为5):要考虑的邻居数。更密集的重采样会产生较大的值,因此请使用值为2、10和20的k_neighbors重复此过程,并比较结果。请记住,基础几何结构通常基于欧几里得距离,因而生成的是块状而不是线性分布的数据集。在生成过程中,根据SMOTE,值5通常是这种条件与自由度之间的良好折中。
可以通过观察图2-9来更好地理解这种行为(我们已经用5个邻居对少数类进行了上采样)。
图2-9 不平衡数据集和SMOTE平衡数据集
如图2-9所示,原始数据集只有几个属于类2的点,它们都位于图的上半部分。使用可置换重采样能够增加样本数量,但结果图形将完全相同,因为值总是取自现有集合。另一方面,SMOTE通过考虑邻域生成相同数量的样本(在这种情况下,原始数据集中也存在重叠)。最终结果显然是可接受的,并与数据生成过程一致。此外,它可以帮助分类器找出最佳分离曲线,该分离曲线可能更加居中(它可以是通过x1=0的水平线)而不是与不平衡数据集相关联的曲线。
可以使用pip install-U imbalanced-learn命令安装Imbalanced-learn(http://contrib.scikit-learn.org/imbalanced-learn/stable/index.html)。它需要scikit-learn 0.19版本或更高版本,并且这是一个不断变化的项目,因此建议读者检查网站以发现其所有功能和错误修复。