类别不平衡(class-imbalance)问题非常普遍,比方说推荐系统中用户购买的商品(通常视作正例)和用户未购买的商品(通常视作反例)比例是极为悬殊的。如果直接用类别不平衡问题很严重的数据集进行训练,所得模型会严重偏向所占比例较大的类别。本节默认正类样例较少,负类样例较多。这里主要介绍三种做法:

欠采样

欠采样(undersampling)针对的是负类,也即移取训练集的部分反例,使得正类和负类的样例数目相当。由于丢掉了大量反例,所以时间开销也大大减少。但是带来一个问题就是,随机丢弃反例可能会丢失一些重要信息。书中提到一种解决方法是利用集成学习机制,将反例划分为多个集合,用于训练不同的模型,从而使得对每个模型来说都进行了欠采样,但全局上并无丢失重要信息

过采样

过采样(oversampling)针对的是正类,也即增加训练集的正例,使得正类和负类的样例数目相当。过采样的时间开销会增大很多,因为需要引入很多正例。注意!过采样不能简单地通过重复正例来增加正例的比例,这样会引起严重的过拟合问题。一种较为常见的做法是对已有正例进行插值来产生新的正例。

阈值移动

阈值移动(threshold-moving)利用的是再缩放思想。回想前面对数几率回归中,几率 类别不平衡问题 - 图1 表示正例的相对可能性,我们默认以1作为阈值,其实是假设了样本的真实分布为正例反例各一半。但这可能不是真相,假设我们有一个存在类别不平衡问题的训练集,正例数目为 类别不平衡问题 - 图2,反例数目为 类别不平衡问题 - 图3,可以重定义:

类别不平衡问题 - 图4

这就是再缩放(rescaling)。当几率大于 类别不平衡问题 - 图5 时就预测为正例。但必须注意,这种思想是基于观测几率近似真实几率这一假设的,现实任务中这一点未必成立。