今天我们聊一聊关于机器学习中数据不均衡的解决办法。
一、类别样本不均衡到底是啥?
类别数据不均衡是分类任务中一个典型的存在的问题。简而言之,即数据集中,每个类别下的样本数目相差很大。我们举一个极端的例子,在一个二分类问题中,共有10000个样本(10000行数据,每一行数据为一个样本的表征),其中9900个样本属于第一类,其余的100个样本属于第二类,类别1:类别2 => 9900:100=99:1,这便属于类别不均衡,且极端不均衡。
再比如,有三个类别,分别为A,B,C。在训练集中,A类的样本占70%,B类的样本占20%,C类的样本占10%。这也同样数据类别不均衡,只不过是多类别的不均衡。
二、真实世界中的样本不均衡都长什么样?
大部分分类任务中,各类别下的数据个数基本上不可能完全相等,但是差异不过大的话是不会产生任何影响与问题的。
在现实中有很多类别不均衡问题,它是常见的,并且也是合理的,符合人们期望的。例如,在欺诈交易识别中,属于欺诈交易的应该是很少部分,即绝大部分交易是正常的,只有极少部分的交易属于欺诈交易。这就是一个正常的类别不均衡问题。又如,在客户流失的数据集中,绝大部分的客户是会继续享受其服务的(非流失对象),只有极少数部分的客户不会再继续享受其服务(流失对象)。再比如,我们门诊的数据,不同危重等级的病人可能如下:1级危重:10,2级危重:100,3级危重:1000,4级危重:5000,5级危重:10000,对应占比为10:100:1000:5000:10000。出现多样本不均衡的情况。
一般而已,如果类别不平衡比例超过4:1,那么其分类器会大大地因为数据不平衡性而无法满足分类要求的。因此在构建分类模型之前,需要对分类不均衡性问题进行处理。
在前面,我们使用准确度这个指标来评价分类质量,可以看出,在类别不均衡时,准确度这个评价指标并不能work。因为分类器将所有的样本都分类到大类下面时,该指标值仍然会很高。即,该分类器偏向了大类这个类别的数据。
三、常用样本不均衡解决办法
1、增加数据样本量
该方法看起来很傻,难道把数据变多就能解决问题吗?答案是yes。当遇到类别不均衡问题时,首先应该想到,更多的数据往往战胜更好的算法。因为机器学习是使用现有数据进行整个数据的分布进行预估,因此更多的数据往往能够得到更多的分布信息,以及更好分布估计。即使再增加小类样本数据时,又增加了大类样本数据,也可以使用放弃一部分较多类别的数据来解决。
2、变换评估指标
从前面的分析可以看出,准确度这个评价指标在类别不均衡的分类任务中并不能很好的给到指导。甚至可能会起到误导(分类器无效,但是从这个指标来看,该分类器有着很好的准确度评价指标得分)。因此在类别不均衡分类任务中,需要使用更有说服力的评价指标来对分类器进行评价。例如:
1、混淆矩阵(Confusion Matrix)
2、召回率(Recall)
3、F1得分(F1 Score)
4、Kappa
5、ROC
3、对数据集进行采样
可以使用一些策略该减轻数据的不平衡程度。该策略便是采样(sampling),主要有两种采样方法来降低数据的不平衡性。
1、对小类的数据样本进行采样来增加小类的数据样本个数,即过采样(over-sampling ,采样的个数大于该类样本的个数)。
2、对大类的数据样本进行采样来减少该类数据样本的个数,即欠采样(under-sampling,采样的次数少于该类样本的个素)。
4、尝试产生人工数据样本
一种简单的人工样本数据产生的方法便是,对该类下的所有样本每个属性特征的取值空间中随机选取一个组成新的样本,即属性值随机采样。你可以使用基于经验对属性值进行随机采样而构造新的人工样本,或者使用类似朴素贝叶斯方法假设各属性之间互相独立进行采样,这样便可得到更多的数据,但是无法保证属性之前的线性关系(如果本身是存在的)。
5、尝试对模型进行惩罚
你可以使用相同的分类算法,但是使用一个不同的角度,比如你的分类任务是识别那些小类,那么可以对分类器的小类样本数据增加权值,降低大类样本的权值(这种方法其实是产生了新的数据分布,即产生了新的数据集),从而使得分类器将重点集中在小类样本身上。一个具体做法就是,在训练分类器时,若分类器将小类样本分错时额外增加分类器一个小类样本分错代价,这个额外的代价可以使得分类器更加“关心”小类样本。