样本不均衡问题

在分类问题中,经常会遇到训练数据类别不均衡的情况。比如在安防监测问题中,绝大部分的样本均为正常人群,可用的坏人样本相当稀少。如果拿全量样本去训练一个简单的高准确率的二分类模型,那结果毫无疑问会严重偏向于正常人群,从而导致模型的失效。

本文从改善采样方式、模型和评价指标等角度出发,来介绍适用于各种场景下的解决样本不均衡问题的方法。

一、 采样

采样的目的就是使得各类样本均衡。这里称数据充分的类为丰富类;而数据稀少的类为稀有类。

1. 下采样

对于海量样本,若即使以稀有类的数量也完全能够满足模型训练的要求。那完全可以从丰富类中下采样与稀有类等量的数据,来训练模型。
那么如何下采样,以使得采样得到的丰富类的样本能够反映丰富类的整体分布呢?
策略一:简单随机下采样
策略二:利用无监督的聚类算法,得到若干组聚类中心作为下采样样本(或其中心点)

2. 上采样

更普遍的情况是丰富类的数量重组,但稀有类的数量难以满足满足模型训练的要求。那就需要通过对稀有类进行上采样,以至稀有类样本数量扩充至与丰富类相匹配,这里介绍几种常见的上采样策略。
策略一:简单重复采样
策略二:合成采样,如SMOTE算法(Synthetic Minority Oversampling Technique)。这里简要介绍下这种算法的流程:
1)对少数类的每个样本点xix_i计算KNN;
2) 根据采样倍率N(可由多数类和少数类的比值得到,保证N<K),在K个近邻中选取N个点xix_i,据x=x+rand(0,1)(xixij)x'=x+rand(0,1)*(x_i-x_{ij})构造新的样本点。
一句话而言,就是寻找稀有类样本和近邻点之间的插值点。
样本不均衡问题
SMOTE算法虽然可以从数量上对稀有类样本进行补充,但有几个显而易见的缺点:
1)KNN算法作为一种基于sample的算法。其严重依赖于人为设定的K值,且较为敏感。
2)上采样希望得到的是介于分类边界线附近、但又偏向于稀有类的样本点。若KNN的中心点位于稀有类内部(即离分类边界线较远),则这种采样的效果并不明显;但若KNN的中心点位于边界线边缘,KNN中若干点也处于边缘附近,甚至为丰富类点,这样会导致插值结果一样的边缘化,从而影响后面的分类。

因此,在SMOTE算法上,仍有诸多的改造采样算法,如 ADASYN算法等。

3. 上采样和下采样

更常见的做法是同时采取上采样和下采样,让稀有类和丰富类的样本数接近一个中间的平衡值。

4. 合理的数据增强

在图像处理任务中,尝尝需要通过改变图片的尺寸、光线条件(亮度、对比度、饱和度),或者通过对图片进行翻转、旋转、平移、添加噪声等处理,实现对图片数据的增强。

二、 模型

通过对模型进行改善,同样可以提高模型对不均衡样本的适用性。

1. 修改损失函数

通过调整稀有类样本在损失函数中的权重,来使模型对丰富类和稀有类更加公平。

最简单的方法就是直接设置类样本权重反比于类样本数量,或者手动设置每个类的权重,甚至每个样本的权重。

2. bagging策略

前文提到,可以从丰富类中下采样与稀有类等量(当然也可以按照2:1,3:1等相近比例进行下采样)的数据,来训练模型。这为bagging提供了可能,即:
1)从丰富类中进行多组的下采样,利用每组下采样得到的丰富类数据和全量的稀有类进行训练,得到多个子模型;
2)多上述多个子模型进行bagging

3. 转化为异常检测问题或者单分类问题

若稀有类样本的数量过于稀少,那可以换个思路来解决这种严重不均衡的分类问题。
一种是转换为异常检测问题(outlier detection)进行解决。
另一种是转换为单分类问题(novelty detection),用OCSVM等算法处理。

三、 评价指标

在样本不均衡的分类问题中,还需要特别注意模型评价指标的选择。比如,在前文提及的安防监测,尽管我们看重正例(坏人),但单纯采用recall并无意义,而应该采用PR曲线或ROC曲线等复合指标对模型进行更合理的评价。