样本不平衡的处理策略及评价指标选择

样本不平衡的处理策略及评价指标选择

引言

在对实际问题做有监督的训练时,我们通常会碰到样本类别不平衡的情况,这样的例子不胜枚举,如:厂家生产的灯泡合格与不合格的比例,涉恐人员与正常人员的比例等等。另一方面,机器学习中,除了本身就是分类问题的,如情感分析,垃圾邮件过滤等,还有很多问题的建模都可以转化为分类问题,如下个句子预测,句子匹配可转化成二分类问题,抽取式阅读理解可转化为N(N为句子长度)分类问题,语言模型、命名实体识别都可归为分类问题。不难看出分类问题的重要性,而在这些问题中,数据不平衡问题都普遍存在。因此,研究如何处理类别不平衡和选择合适的评价指标显得尤为重要。

处理策略

1 改变数据分布

常见的有过采样、下采样、综合采样。

过采样

过采样又叫重采样,这是一种保持多数样本不变的情况下,按一定比率增加少数样本的个数,使类别平衡的方法。

  • 最简单的过采样方法是随机过采样,即随机地复制少数样本。这种方法能够起到一定的效果,但是由于重复样本出现次数过多,容易发生过拟合。
  • SMOTE(Synthetic Minority Oversampling Technique)[1], 合成少数类过采样技术,实际上是一种插值的方法,是随机过采样的改进版本。算法流程如下:

设训练集的一个少数类的样本数为T, 那么SMOTE算法将为这个少数类合成NT个新样本,N是过采样倍率。考虑少数类的一个样本i, 其特征向量为xi

A. 首先从少数类的全部T个样本中找到样本xi的k个近邻(例如欧式距离)样本,记为xi_near, near=1, 2, 3, ..,k.

B. 然后从这k个近邻中随机选择一个样本xi_nn, 在生成一个0到1之间的随机数alpha, 从而合成一个新样本xj:
$$
x_j = x_i + alpha * (x_inn - x_i)
$$
C. 将步骤B重复N次, 从而合成N个新样本。

SMOTE一定程度上缓解了过拟合问题,但是引入了噪声,MSMOTE[2]是其改进版。算法流程和SMOTE基本相同。不同的是,它将少数样本分为3个不同的组:安全样本、边界样本和潜在噪声样本。一张图来说明一下:

下采样

  • 最简单的是从多数样本中随机抽取,从而减少多数样本的数量
  • 第二种,ENN,Edited Nearest Neighbor, 这是一种基于近邻的方法。做法是如果某个样本K近邻样本的类别都跟他本身不一样,我们就将他删除,一致重复,直到无法删除为止
  • 第三种,Tomek Link Removal, 如果有两个不同类别的样本,他们的最近邻都是对方,即A的最近邻是B, B的最近邻是A, 那么就说A和B是Tomek link。我们要做的就是把所有的Tomek link都删除掉。具体怎么删除呢,如果组成Tomek link的两个样本,如果有一个属于多数类样本,就将该多数类样本删除掉。

综合采样

即将下采样和过采样相结合。

上述方法一般都可以在不同程度上缓解数据不平衡的问题。对于图像和文本这类非结构化的数据,基于最近邻的SMOTE和方法似乎不能直接使用。这涉及到文本和图像的数据增强,将在以后单独写篇说明。

2 代价敏感

这种方法是通过改变不同类别损失函数的权重,例如,将少数类别的损失给一个较大的权重,如果少数类分错,那么就会得到一个大的损失,使模型更加关注少数类别。其实这种方法和上述的过采样和下采样有异曲同工之妙(类别下Adaboost)。

评价指标

  • Accuracy, 准确率, 即模型分对的个数占总个数的比例。准确率对于不平衡的数据集不是个好的评价指标。举个简单的例子。假设有100个样本,97个正例3个负例,模型将这100个样本全部判断为正样本,那么这时的准确率为97/100=0.97, 准确率很高,但是模型的效果其实很差,因为一个负例也没有识别出来。一般来说,要计算准确率,需要首先将模型分数或者说概率映射成类别,这时候需要确定一个阈值,默认为0.5,即大于0.5的为正例,小于0.5的为负例。
  • Recall, 召回率,每个类别预测对的占该类别总数的比例。还是以上面的例子说明,100个样本,正负样本比例为99:3, 假如还是全部预测称正例,那么正例的召回率为 97/97=1, 负例的召回率为 0/3 = 0, 平均召回率为(1+0)/2 =0.5。可以看出模型的召回并不是很好。
  • F1-Measure, 是综合Accuracy和Recall的一个评价指标。能够较好地反映模型的真实水平,就算是不平衡的数据集。但是需要确定类别的阈值。
  • AUC,Area under curve, 曲线下的面积,这个曲线说的是ROC曲线,我们后面说。AUC刻画的是模型按照概率把正例排在负例前面的概率。比如说有97个正例,3个负例,我们就能得到 97*3个正负样本对,拿模型来预测,如果正例的得分要高于负例,记为1, 如果正例和负例的得分相同,记为0.5, 如果负例高于正例,记为0, 将所有得分相加,对样本对数求平均,就是AUC了,可见AUC也是一个统计概率值。AUC很适合不平衡数据集的评价,而且不需要确定类别的阈值。现在来说说ROC曲线是怎么回事。首先明确几个概念:(1)TP,true positive,表示一个样本是正例,也被预测为正例,简称正确的肯定数目(2)FN, false negative, 表示一个样本是正例,但被预测称负例,简称漏报(3)FP, false positive, 表示一个样本是负例,但被预测称正例,简称误报(4)TN, true negative, 表示一个样本是负例,也被预测为负例。当然,我们希望TP和TN越大越好,FN和FP越小越好。进一步地,引出两个概念TPR, true positive rate, 真正例率, TP/(TP+FN),表示预测的正例中实际正例占所有正例的个数,FPR, false positive rate, 负正例率, FP/(FP+TN)表示预测的正例中实际负例占所有负例的个数。我们希望TPR越大越好,FPR越小越好。ROC曲线上的点就是由(FPR, TPR)二维点组成,理想的ROC是一条曲线,目标是图2中(0, 1)点,一般来说,ROC曲线越偏离45度对角线越好。但是实际中,由于阈值的个数总是离散的,所有ROC曲线是一个梯形折线,如图3所示。ROC和AUC有两大好处:(1)不用确定类别映射阈值(2)当数据分布(正负类别比例)发生变化时,Recall曲线和Precision曲线会发生明显变化,而AUC曲线基本能保持稳定。