机器学习之类别不平衡问题 (1) —— 各种评估指标
机器学习之类别不平衡问题 (2) —— ROC和PR曲线
机器学习之类别不平衡问题 (3) —— 采样方法
前两篇主要谈类别不平衡问题的评估方法,重心放在各类评估指标以及ROC和PR曲线上,只有在明确了这些后,我们才能据此选择具体的处理类别不平衡问题的方法。本篇介绍的采样方法是其中比较常用的方法,其主要目的是通过改变原有的不平衡样本集,以期获得一个平衡的样本分布,进而学习出合适的模型。
采样方法大致可分为过采样 (oversampling) 和欠采样 (undersampling) ,虽然过采样和降采样主题思想简单,但这些年来研究出了很多变种,本篇挑一些来具体阐述。见下思维导图:
\(\scriptsize{\spadesuit}\) 过采样
1. 随机过采样
随机过采样顾名思义就是从样本少的类别中随机抽样,再将抽样得来的样本添加到数据集中。然而这种方法如今已经不大使用了,因为重复采样往往会导致严重的过拟合,因而现在的主流过采样方法是通过某种方式人工合成一些少数类样本,从而达到类别平衡的目的,而这其中的鼻祖就是SMOTE。
2. SMOTE
SMOTE (synthetic minority oversampling technique) 的思想概括起来就是在少数类样本之间进行插值来产生额外的样本。具体地,对于一个少数类样本\(\mathbf{x}_i\)使用K近邻法(k值需要提前指定),求出离\(\mathbf{x}_i\)距离最近的k个少数类样本,其中距离定义为样本之间n维特征空间的欧氏距离。然后从k个近邻点中随机选取一个,使用下列公式生成新样本:
\[ \mathbf{x}_{new}=\mathbf{x}_{i}+(\mathbf{\hat{x}}_{i}-\mathbf{x}_{i}) \times \delta \tag{1.1} \]
其中\(\mathbf{\hat{x}}\)为选出的k近邻点,\(\delta\in[0,1]\)是一个随机数。下图就是一个SMOTE生成样本的例子,使用的是3-近邻,可以看出SMOTE生成的样本一般就在\(\mathbf{x}_{i}\)和\(\mathbf{\hat{x}}_{i}\)相连的直线上:
SMOTE会随机选取少数类样本用以合成新样本,而不考虑周边样本的情况,这样容易带来两个问题:
- 如果选取的少数类样本周围也都是少数类样本,则新合成的样本不会提供太多有用信息。这就像支持向量机中远离margin的点对决策边界影响不大。
- 如果选取的少数类样本周围都是多数类样本,这类的样本可能是噪音,则新合成的样本会与周围的多数类样本产生大部分重叠,致使分类困难。
总的来说我们希望新合成的少数类样本能处于两个类别的边界附近,这样往往能提供足够的信息用以分类。而这就是下面的 Border-line SMOTE
算法要做的事情。
3. Border-line SMOTE
这个算法会先将所有的少数类样本分成三类,如下图所示:
- "noise" : 所有的k近邻个样本都属于多数类
- "danger" : 超过一半的k近邻样本属于多数类
- "safe": 超过一半的k近邻样本属于少数类
Border-line SMOTE
算法只会从处于”danger“状态的样本中随机选择,然后用SMOTE算法产生新的样本。处于”danger“状态的样本代表靠近”边界“附近的少数类样本,而处于边界附近的样本往往更容易被误分类。因而 Border-line SMOTE
只对那些靠近”边界“的少数类样本进行人工合成样本,而 SMOTE
则对所有少数类样本一视同仁。
Border-line SMOTE
分为两种: Borderline-1 SMOTE
和 Borderline-2 SMOTE
。 Borderline-1 SMOTE
在合成样本时\((1.1)\)式中的\(\mathbf{\hat{x}}\)是一个少数类样本,而 Borderline-2 SMOTE
中的\(\mathbf{\hat{x}}\)则是k近邻中的任意一个样本。
4. ADASYN
ADASYN名为自适应合成抽样(adaptive synthetic sampling),其最大的特点是采用某种机制自动决定每个少数类样本需要产生多少合成样本,而不是像SMOTE那样对每个少数类样本合成同数量的样本。具体流程如下:
首先计算需要合成的样本总量:
\[ G = (S_{maj} - S_{min}) \times \beta \]
其中\(S_{maj}\)为多数类样本数量,\(S_{min}\)为少数类样本数量,\(\beta \in [0,1]\)为系数。G即为总共想要合成的少数类样本数量,如果\(\beta=1\)则是合成后各类别数目相等。
对于每个少类别样本\(\mathbf{x}_i\),找出其K近邻个点,并计算:
\[ \Gamma_i = \frac{\Delta_i\,/\,K}{Z} \]
其中\(\Delta_i\)为K近邻个点中多数类样本的数量,Z为规范化因子以确保 \(\Gamma\) 构成一个分布。这样若一个少数类样本\(\mathbf{x}_i\)的周围多数类样本越多,则其 \(\Gamma_i\) 也就越高。
最后对每个少类别样本\(\mathbf{x}_i\)计算需要合成的样本数量\(g_i\),再用SMOTE算法合成新样本:
\[ g_i = \Gamma_i \times G \]
可以看到ADASYN利用分布