数据不平衡问题

来源:互联网 发布:centos macaddr 编辑:程序博客网 时间:2024/04/30 00:24

数据不平衡问题

数据不平衡问题实际上指的就是y的分布相差很大的问题,又称为类别不平衡问题。出现这种问题的原因是在实际取样中,有可能会出现一类的y数量远远大于另一类的例子。

一个很明显的例子就是在做信用卡还款预测的时候,一定是按时还款的人占据绝大多数,不按时还款的人占一小部分,那如果机器无脑预测新客户一定会还款,正确率是很高的,但是这样的预测显然不是我们想要的。那么如何解决这种类型的问题呢?不仅从样本取样的方式要变,最终模型评价的方式也有可能有所不同:

样本取样

欠采样

欠采样(undersampling),顾名思义,就是将数量大的那一个类别做一些删除的操作,使得样本数多的类别来迎合样本数少的那一类。具体方法有以下几种:

随机欠采样

我们可以随机地删除样本数多的那一类中的数据,但是这样就显得很不专业了,因为很明显,我们不知道我们删除的那些例子是不是一些很重要的例子,要是真的随机删除它们的话,模型的效果就可想而知了。于是就有了一些改进的算法。

EasyEnsamble算法

具体思路为:
1. 从样本多的类别中抽取和样本少的类别一样的样本数;
2. 不重复地从样本多的类别中取多次,并和样本少的类别一起组成一对对的训练集的组合;
3. 针对每个组合进行模型训练,这样能使多样本类别的所有数据都有机会参与建模;
4. 将得到的分类器做模型的集成或者融合。

BalanceCascade算法

  1. 先通过一次随机的欠采样产生一个基分类器;
  2. 放弃分类器正确的样本,从总样本中继续抽取新样本数据进入训练数据;
  3. 继续进行训练并重复。

*这种方式的思路其实就是增加分类错误样本的权重,和AdaBoost的思路十分相似

过采样

既然有样本数多的类别来迎合样本数少的类别,那么就一定有相反的方法,我们称之为过采样(oversampling)。其目的是增加少样本类别的数据而达到平衡的状态。

简单的复制粘贴

这种方法是不可能被采用的,因为这种简单复制的方法会导致过拟合的发生。我们必须寻找其他的算法来解决这个问题。

SMOTE

总体思路是利用少样本类别在其特征空间有相似性,那么我们就可以在其周围合成新的样本数据。
1. 针对少样本类别的每一个样本,找到其K个近邻,这里的K值由人工确定;
2. K近邻的个数由两种样本的差别而定;
3. 计算少样本和其近邻在特征空间中的差值,然后将这个差值乘以一个(0,1)之间的随机数后,与当前样本特征值相加,作为新的合成样本。

*最后一步的数学表达式为:xnew=x+random(0,1)(x^x)

当然SMOTE算法也有其自身的问题,一个是会有同类之间数据重叠的情况出现,因为样本数据空间本来就很小,在这些狭小的空间另外生成新的数据点的话很难避免数据重叠;另一个是生成的一些新的合成样本有可能不包含任何有用的信息。于是针对这些情况,还有下面的改进算法:

Borderline-SMOTE

Borderline-SMOTE算法相比SMOTE算法就是多了一个边界确认的步骤,针对SMOTE数据重叠的情况,Borderline-SMOTE算法对需要拓展的少数类样本进行了筛选,筛选条件就是是否是处于多数类样本和少数类样本空间的边界上(borderline)。

具体步骤为:
1. 计算少数类样本中每一个样本的在整个训练集中和其他所有样本的距离,并获得其K个近邻;
2. 对其K近邻进行归类,确定其是否处于边界(通过k中两种样本的个数多少来确定);
3. 对确定为边界的样本使用SMOTE算法进行拓展。

转化为一分类问题或者异常点检测问题

这是完全另一套思路,不把原先二分类的问题看作是二分类的问题,把它当做一分类问题(经典如one class SVM)或者异常点检测问题(把少样本的数据点当做异常点进行识别)。

One Class SVM

正常的二分类SVM主要思想都是确定样本点是A类还是B类,而一分类主要思路是确定样本点是A类和不是A类。虽然对某一个样本点来说是B类就意味着不是A类,但是对于分类器来说,它并没有学习B类,只学习了A类。

模型评价

在数据不平衡的情况下,模型评价的方式也有所不同。

根据最开始举的例子,正确率是不能够准确评价模型好坏的。

但是准确率(P)和召回率(R),一起F1值还是可以准确评价的。

原创粉丝点击