如果不同类别的训练样例数目稍有差别,通常影响不大,但若差别很大,则会对学习过程造成困扰。例如有998个反例,但正例只有2个,那么学习方法只需返回一个永远将新样本预测为反例的学习器,就能达到99.8%的精度;然而这样的学习器往往没有价值,因为它不能预测出任何正例。
类别不平衡(class-imbalance)就是值分类任务中不同类别的训练样例数目差别很大的情况。不是一般性,本节假定正类样例较少,反类样例较多。在现实的分类任务中,我们经常会遇到类别不平衡,例如在通过拆分法解多分类问题时,即使原始问题中不同类别的训练样例数目相当,因此有必要了解类别不平衡性处理的基本方法。
从线性分类器的角度讨论容易理解,在我们用y=w^{T} w b 对新样本x进行了分类时,事实上在用预测出的y值与一个阈值进行比较,例如通常在y>0.5时判别为正例。y实际上表达了正例的可能性,几率y/(1-y)则反映了正例可能性与反例可能性之比值,阈值设置为0.5恰表明分类器认为真实正、反例可能性相同,即分类器决策规划为:
若y/(1-y) > 1则,预测为正例 (1)
然而,当训练集中正、反例的数目不同时,令m^{ } 表示正例数目,m^{-} 表示反例数目,则观测几率是m^{ } / m^{-} ,由于我们通常假设训练集是真实样本总体的无偏估计,因此观测几率就代表了真实几率。于是只要分类器的预测几率高于观测几率就应判定为正例,即,若 frac{y}{1-y}>frac{m^{ }}{m^{-}} 则 预测为正例。
但是,我们的分类器是基于式(1)进行比较决策,因此,需对其预测值进行调整,使其基于式(1)决策时,实际上是在执行式(2),要做到这一点很容易,只需令frac{y^{prime}}{1-y^{prime}}=frac{y}{1-y} times frac{m^{-}}{m^{ }}
这就是类别不平衡学习的一个基本决策------"再缩放"(rescaling)。
再缩放的思想虽简单,但实际操作却不平凡,主要是因为“训练集是真实样本总体的无偏采样”这个假设往往并不成立,也就是说,我们未必能有效地基于训练集观测几率来推断出真实几率。现有技术大体有三类:
- 第一类是直接对训练集里的反类进行“欠采样(undersampling)",即去除一些反例使得正、反例数目接近,然后再进行学习;
- 第二类是对训练集里的正类样例进行“过采样(oversampling)”,即增加一些正例使得正、反例数目接近,然后再进行学习;
- 第三类则是直接基于原始训练集进行学习,但在用训练好的分类器进行预测时,将式(3)嵌入到其决策过程中,称为“阈值移动”(thresholding-moving)。
欠采样法的时间开销通常远小于过采样法,因为前者丢弃了很多反例,使得分类器训练集远小于初始训练集,而过采样法增加了很多正例,其训练集大于初始训练集。需注意的是,过采样法不能简单地对初始样本进行重复采样,否则会招致严重的过拟合;过采样法的代表性算法SMOTHE是通过对训练集里的正例进行插值来产生额外的正例。另一方面,欠采样法若随机丢弃反例,可能丢失一些重要信息;欠采样法的代表性算法EasyEnsemble则是利用集成学习机制,将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了欠采样,但在全局来看却不会丢失重要信息。值得一提的是,“再缩放”也是“代价敏感学习”(cost-sensitive learning)的基础,在代价敏感学习中将式(3)中的m^{-} / m^{ } 用operatorname{cost}^{ } / operatorname{cost}^{-} 代替即可,其中cos ^{ } 是将正例误分为反例的代价,operatorname{cost}^{-} 是将反例误分为正例的代价。