很多分类学习方法针对都有一个共同的基本假设,即不同类别的训练数据数目相当,即使稍有差别,通常影响不大。但如果差别较大,就会对学习过程造成困扰。
在现实场景中,比如银行欺诈,异常登录,网络入侵等领域中,大多数数据通常有不到1%少量但异常数据。这就使得对于处理不平衡数据有着及其重要的意义。
1.使用正确的评估指标
例如对于有998个的反例,但正例只有2个,那么学习方法只要返回一个永远把样本预测为反例的学习器,那么就可以达到99.8的精度,可是这样的学习器没有任何
价值,因为它不能预测出任何正例。
在这种情况下,可以使用如下所示的其他指标:
精度/特异性:有多少个选定的相关实例
调用/灵敏度:选择了多少个相关实例
F1得分:精度和召回的谐波平均值
MCC:观察和预测的二进制分类之间的相关系数
AUC:正确率与误报率之间的关系
这几个指标的原理是一样的,就是要兼顾精准率和召回率,使得两者达到一个平衡。
2.重新采样训练集
欠采样通过减少冗余类的数量来平衡数据集。通过将所有样本保存在少数类中,并在多数类中随机选择相等数量的样本,可以检索平衡的新数据集以进一步建模。
即去除一些反例使得正负样本数目接近,任何再进行学习;欠采样法若采用随机丢弃反例,可能丢失一些重要信息:
欠采样法的代表性算法EasyEnsemble算法则是利用集成学习机制,将反例划分为若干个集合供不同学习器使用,这样对每个学习器来看都进行了 欠采样,但在全局来看却不会丢失重要信息。
EasyEnsemble算法原理:
从多数类中有放回的随机采样 n次,每次选取与少数类数目近似的样本,那么可以得到 n个样本集合记作 {S1,S2,…,Sn},然后其中的每一份与少数类样本结合组成 n训练样本 {D1,D2,…,Dn},然后再每一个训练集上得到一个模型,最后取这 n个模型的均值
相反,当数据量不足时应采用过采样,尝试通过增加稀有样本的数量来平衡数据集。不是去除样本的多样性,而是通过使用诸如重复、自举或SMOTE等方法生成新样本(合成少数过采样技术)
SMOTE算法
SMOTE全称是Synthetic Minority Oversampling Technique即合成少数类过采样技术,它是基于随机过采样算法的一种改进方案,由于随机过采样采取简单复制样本的策略来增加少数类样本,这样容易产 生模型过拟合的问题,即使得模型学习到的信息过于特别(Specific)而不够泛化(General),SMOTE算法的基本思想是对少数类样本进行分 析并根据少数类样本人工合成新样本添加到数据集中。
算法流程如下。
(1)对于少数类中每一个样本x,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其k近邻。
(2)根据样本不平衡比例设置一个采样比例以确定采样倍率N,对于每一个少数类样本x,从其k近邻中随机选择若干个样本,假设选择的近邻为xn。
(3)对于每一个随机选出的近邻xn,分别与原样本按照如下的公式构建新的样本。
请注意,一种重采样方法与另一种相比没有绝对的优势。这两种方法的应用取决于它适用的用例和数据集本身。
3.以正确的方式使用K-fold交叉验证
需要注意的是,使用过采样方法来解决不平衡问题时,应适当地应用交叉验证。过采样会观察到稀有的样本,并根据分布函数自举生成新的随机数据。如果在过采样之后应用交叉验证,那么我们所做的就是将模型过度适应于特定的人工引导结果。这就是为什么在过采样数据之前应该始终进行交叉验证,就像实现特征选择一样。只有对数据进行重复采样,可以将随机性引入到数据集中,以确保不会出现过拟合问题。
k-折交叉验证
k-折交叉验证将样本集随机划分为k份,k-1份作为训练集,1份作为验证集,依次轮换训练集和验证集k次,验证误差最小的模型为所求模型。具体方法如下:
随机将样本集S划分成k个不相交的子集,每个子集中样本数量为m/k个,这些子集分别记作;
for j=1 to k
4.组合不同的重采样数据集
生成通用模型的最简单方法是使用更多的数据。问题是,开箱即用的分类器,如逻辑回归或机森随林,倾向于通过丢弃稀有样例来推广。一个简单的最佳实现是建立n个模型,使用少数类的所有样本和数量充足类别的n个不同样本。假如您想要组合10个模型,需要少数类1000例,随机抽取10.000例多数类的样本。然后,只需将10000个样本分成10个块,训练出10个不同的模型。
如果有大量数据,那么这种方法很简单,完美地实现水平扩展,因此可以在不同的集群节点上训练和运行模型。集合模型也趋于一般化,使得该方法容易处理。
5.用不同比例重新采样
以前的方法可以通过少数类和多数类之间的比例进行微调。最好的比例在很大程度上取决于所使用的数据和模型。但是,不是在整体中以相同的比例训练所有模型,合并不同的比例值得尝试。 所以如果训练了10个模型,对一个模型比例为1:1(少数:多数),另一个1:3甚至是2:1的模型是有意义的。 根据使用的模型可以影响一个类获得的权重。
6.对多数类进行聚类
Sergey Quora提出了一种优雅的方法。他建议不要依赖随机样本来覆盖训练样本的种类,而是将r个分组中的多数类进行聚类,其中r为r中的样本数。对于每个组,只保留质心(样本的中心)。然后该模型仅保留了少数类和样本质心来训练。
7.设计自己的模型
以前的所有方法都集中在数据上,并将模型作为固定的组件。但事实上,如果模型适用于不平衡数据,则不需要对数据进行重新采样。如果数据样本没有太多的倾斜,著名的XGBoost已经是一个很好的起点,因为该模型内部对数据进行了很好的处理,它训练的数据并不是不平衡的。但是再次,如果数据被重新采样,它只是悄悄进行。
通过设计一个损失函数来惩罚少数类的错误分类,而不是多数类,可以设计出许多自然泛化为支持少数类的模型。例如,调整SVM以相同的比例惩罚未被充分代表的少数类的分类错误。