Data Imbalance

Posted on By Jason Hao

宏观理解

由于我们的模型数据来源于现实生活中,而现实生活中的数据又存在着一个潜在问题,就是数据不平衡。 数据不平衡指的是假设我们在一个信用卡欺诈识别的项目中,每秒有上千笔交易成功,但是也许在十万条交易中只有10条存在欺诈潜在可能。 但是这种情况下即使我们只有一行代码就是把所有交易预测为正常的,结果也有99%以上的正确率。但是毫无意义啊。 即使我们很认真的去按照标准的步骤把一个二分类问题训练出来,结果也是相当不好的。 那在这种情况下我们只能采取一些办法来让这些数据尽可能的平衡,来达到更理想的模型结果。

微观分析

我相信在谈到数据不平衡的时候最常听到的就是上采样和下采样。那么什么是上采样和下采样?

  • 上采样 很简单,我们就把少量的那一部分数据给复制很多份,比如复制到和多量的数据比例为1:1 。但是这样做有个问题,就是尽管怎么复制,你的数据内容翻来覆去还是那几条。所以在这个基础上我们可以添加一些额外的扰动,比如信用卡欺诈预测中我们可以把这笔交易的金额上下浮动1-10%来创建更多的新数据。

  • 下采样 和上采样相对,也就是把多量的数据减少到合理的数量也比如说1:1或者0.8:1什么的。但是也存在一个问题,就是一下子删除掉那么多的数据,这肯定会对模型的效果产生影响啊。我们都知道大数据时代什么最贵?数据啊。所以解决的办法可以用EasyEnsemble的方法,也就是把多量的数据有放回抽样到很多份,每份和少量的数据来训练一个模型,最后综合结果。这个方法类似于集成学习的bagging。所以我们还有一个类似于boosting的方法,就是BalanceCascade。我们多次下采样然后训练模型,然后把那些分类错误的样本有放回的继续下采样,这样循环下去直到达到停止条件。

  • SMOTE(Synthetic Minority Over-sampling Technique) 这是一种上采样的实现方法,在python、R里都有封装好的方法。它与上采样不同的是它所采样出来的样本不会和原本的数据集有任何重复,它会在距离上创建一些新的数据点和这些少量的数据点相似,然后再加上一些随机扰动。我曾经使用这种方法的时候一个简单的裸体模型还未加任何调参优化就已经可以排名前3了。算是一种效果很强的算法。

  • 对数据增设权重 想一想其实会造成数据不平衡的后果的就是因为模型无法重视那些少量的数据,从而我们才去想办法(比如上采样)让它们变得一样重要。但是还有一个方法可以改变,就是告诉模型,这些数据的重要度很高,你要重点学习这些数据点。所以我们增设数据点的权重,如果这些数据分类错误会造成更大的惩罚。比如penalized-SVM和penalized-LDA算法。

怎么处理这些数据没有一个确定的方法,也没有哪种方法更好。机器学习很重要的就是尝试,在尝试中积累经验,培养对预处理和模型选择上的嗅觉。所以除了以上说的最常用的几种方法还可以有很多,比如把一个二分类的问题改变成一个异常点检测的问题,把少量的数据点看待成异常点来检测。