类别不平衡学习的常用策略

Posted by Lucius on November 4, 2021

在日常的分类任务中,「数据类别不平衡」是一个很常见的问题,如果对其不加关注,则可能会严重影响模型性能。

对于「类别不平衡」这一问题,通常可以从三个角度入手,即「数据」、「模型」以及「评价指标」,本文将对这三个角度进行介绍。

一、数据

1.1 扩大数据集

数据集类别不平衡,最直接的想法就是尽可能地增加数据(主要关注小样本数据),或许增加数据后分布就会变得平衡。

1.2 对大类欠采样

若数据集已经固定,则我们可以考虑随机去除大类中的一些数据,以此达到类别平衡的目的。

常见的算法有 Tomek links,如下图所示,该算法找到数据集中非常接近的一个不同类别的点对,并删除其中的大类样本。

另外,还有一种名为 EasyEnsemble 的算法,其在实际应用上表现良好。具体思路是:执行 $n$ 次,每次从大类中随机选出一部分,使其数量与小类总数一致,对其训练得到 $f_i$,最后将 $n$ 个模型集成起来得到最终模型。

1.3 对小类过采样

为使类别平衡,除了让多的变少,也可以让少的变多。在无法收集更多数据的情况下,我们可以考虑人为构造小类数据。

常见的算法有 SMOTE,如下图所示,该算法随机找到一个小类点 x,再在其最近的 k 个小类点中随机选出 y,在 x 和 y 的连线上随机生成一个人造小类数据。

二、模型

除了可以对数据集进行修正,我们也可以对模型训练或预测的过程进行更改,使其匹配类别不平衡的环境。

2.1 模型训练过程

首先很直接的想法是更换模型,例如采用决策树以及基于树集成的算法(Random Forest、Gradient Boosted Trees 等),这些算法不会对小类数据进行忽略,以此对类别不平衡的环境进行匹配。

其次我们可以考虑在训练过程中,对不同类别的数据赋予不同的权重,如对小类数据赋予更大的权重,以此迫使模型对小类数据加以关注。

最后我们也可以更换训练视角,从考虑分类任务转变为对异常数据进行检测,即将小类数据视为异常点。

2.2 模型预测过程

假设模型输出 $y\in[0,1]$,当类别平衡时,$\displaystyle\frac{y}{1-y}>1$ 即为正例;因此当类别不平衡时,可以根据

$$ \frac{y \cdot m^{-}}{(1-y) \cdot m^{+}}>1 $$

来进行正例判别,其中 $m^{+}$、$m^-$ 分别表示正例、反例样本的数量。

三、评价指标

最后,面对类别不平衡问题,常见的 Accuracy 衡量标准不再适用,可以考虑如下一些新的评价指标:

  • 混淆矩阵(Confusion Matrix)

  • 准确率(Precision)、召回率(Recall)、F1-Score

  • ROC 曲线面积

参考资料