类别不平衡
Peter Norvig:"More data beats clever algorithms, but better data beats more data"
参考文章:类别不平衡问题的三种基础处理方案
更多的数据打败聪明的算法,更好的数据打败更多的数据,显示了在机器学习中数据规模和数据质量的重要性。在分类任务中,类别是否不平衡是评价数据集质量的重要指标,指分类任务中不同类别的训练样例数目差距很大的情况。如果不同类别的训练样例数目差距过大,例如998个正例、2个负例,学习方法只需返回一个永远预测为正例的分类器,就能达到99.8%的精度,这样的分类器没有任何价值。
因此了解若干处理类别不平衡的方法十分重要,本文介绍了再放缩(rescaling)与采样(sampling)两种策略,并在采样策略中,详细介绍加权处理、过采样(oversampling)、欠采样(undersampling)三种技术。
再放缩
再放缩是类别不平衡学习的一个基本策略:分类器一般预测样例属于各个类别的概率,即logits,分类时选择logit最大的类别。
在类别不平衡的情况下,我们可以对logits进行放缩,令logits为属于各个类别的概率除以训练集中该类别的数量,再进行比较选择logit最大的类别。
再放缩基于训练集是真实样本总体的无偏采样的假设,该假设要求训练集足够大,一般情况下不成立,即未必能基于训练集观测几率推出真实几率。
采样
采样策略尝试通过选取训练集的子集或者超集,在数据预处理时对类别不平衡的问题进行处理,此处我们介绍加权处理、过采样(oversampling)、欠采样(undersampling)三种技术。
加权处理
加权处理步骤如下:
- 根据类别信息,为各个类别设置其权重
- 遍历所有样本,为样本设置其类别所对应的权重
- 将样本权重带入模型进行训练
一般损失函数默认每个样例具有相同的权重,加权处理通过对少数类赋予较大的权重,使得少数类能在损失函数中具有较强的重要性,减轻了多数类对损失函数结果影响过大的问题。
过采样
过采样,即增加一些少数类,使得属于各个类别的样例数目接近,然后进行学习。
过采样的技术非常多,以下介绍两种:
- 随机过采样:
- 算法流程:对少数类进行随机采样,直接重复添加到训练集中
- 随机过采样一定程度上类似加权,可能会导致严重的过拟合
- SMOTE采样:
- 算法流程:
- 根据样本不平衡比例设置采样比例,确定采样倍率N
- 对少数类中每一个样本x,以某种距离度量计算其在少数类中的k近邻,随机选择N个样本{x_1, ... , x_N}
- 通过x与{x_1, ... , x_N}的插值,构造新的少数类样本
- SMOTE无法克服非平衡数据集的数据分布问题,容易产生分布边缘化,即如果少数类分布在各个类别的边缘,通过插值产生的新少数类样本也在边缘,模糊了各类别样本的边界,增大分类的难度(Borderline SMOTE算法对边缘化问题有所改善)
- 算法流程:
欠采样
欠采样,即通过某种策略去除一些多数类,使得各个类别样例数量接近,然后进行学习。
欠采样带来的优势有:
- 丢弃了部分多数类,因此时间、空间开销通常远小于过采样方法
- 通过集成学习的方式对每个学习器都进行欠采样,从全局来看,既学习到所有信息,又为每个分类起带来训练数据的差异
欠采样的一般技术如下:
- 随机欠采样:
- 算法流程:随机丢弃多数类部分样例
- 这是最为简单的欠采样方法,可能导致重要信息丢失,注意通过集成学习的方法使得全局信息不丢失
- Tomek links欠采样:
- 算法流程:
- 以某种度量方式计算少数类与多数类各个样本的距离
- 每个少数类与多数类中距离最小的样本称为Tomek link
- 删除Tomek link中的多数类样本,直到样本平衡
- 正如过采样中提到,类别间的边缘可能增大分类难度,通过去除边缘中的多数类样本可以使得类别间margin更大,便于分类
- 算法流程: