机器学习正负不均衡问题

参考文章:

[1] https://blog.****.net/lovejay7/article/details/81077847

[2] https://www.jianshu.com/p/71eea3555dbf

1、数据不均衡

数据不平衡问题主要存在于有监督的机器学习任务中。

当数据不平衡时,以总体分类准确率为学习目标的传统分类算法回过多的关注多数类,从而使得少数样本的性能下降,也就是说,如果数据样本中正样本的数目远远大于负样本,那么在预测过程中只要把预测结果都预测为正,就会获得很高的准确率,但这样的预测毫无价值。

2、解决方法

1.采样

采样方法是通过对训练集进行处理使其从不平衡数据集变成平衡的数据集。

采样分为上采样(过采样)和下采样(欠采样)。

上采样(过采样)是增加稀有样本(少的那一类样本)的数量来平衡数据集。

下采样(欠采样)是减少丰富样本(多的那一类样本)的数量来平衡数据集。

随机采样的最大优点是简单,但是随机采样的缺点也很明显。

上采样后的数据集中会反复出现一些样本,训练出来的模型会有一定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了总体的一部分。

两种方法相对而言都没有绝对的优势,上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会导致一个问题,那就是运气好就能分对很多点,否则分错很多点。为了解决这一问题,可以在每次生成新数据点时加入轻微的随机扰动,经验表明这种做法非常有效。

因为下采样会丢失信息,如何减少信息的损失呢?第一种方法叫做EasyEnsemble,利用模型融合的方法(Ensemble):多次下采样(放回采样,这样产生的训练集才相互独立)产生多个不同的训练集,进而训练多个不同的分类器,通过组合多个分类器的结果得到最终的结果。第二种方法叫做BalanceCascade,利用增量训练的思想(Boosting):先通过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,然后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合所有分类器的结果得到最终结果。第三种方法是利用KNN试图挑选那些最具代表性的大众样本,叫做NearMiss,这类方法计算量很大,感兴趣的可以参考“Learning from Imbalanced Data”这篇综述的3.2.1节。

2.数据合成

利用已有样本生成更多样本,这类方法在小数据场景下有很多成功案例,比如医学图像分析等。

机器学习正负不均衡问题 

SMOTE为每个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增加了类之间重叠的可能性,另一方面是生成一些没有提供有益信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。

Borderline-SMOTE的解决思路是寻找那些应该为之合成新样本的小众样本。即为每个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。直观地讲,只为那些周围大部分是大众样本的小众样本生成新样本,因为这些样本往往是边界样本。确定了为哪些小众样本生成新样本后再利用SMOTE生成新样本。 
机器学习正负不均衡问题 
横向是真实分类情况,纵向是预测分类情况,C(i,j)是把真实类别为j的样本预测为i时的损失,我们需要根据实际情况来设定它的值。

这种方法的难点在于设置合理的权重,实际应用中一般让各个分类间的加权损失值近似相等。当然这并不是通用法则,还是需要具体问题具体分析。

4.一分类

对于正负样本极不平衡的场景,我们可以换一个完全不同的角度来看待问题:把它看做一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等。这类方法的重点不在于捕捉类间的差别,而是为其中一类进行建模,经典的工作包括One-class SVM等,如下图所示:

机器学习正负不均衡问题

One Class SVM 是指你的训练数据只有一类正(或者负)样本的数据, 而没有另外的一类。

说明:对于正负样本极不均匀的问题,使用异常检测,或者一分类问题,也是一个思路。

5.组合不同的重采样数据集

成功泛化模型的最简单方法是使用更多的数据,问题是像逻辑回归或随机森林这样开箱即用的分类器,倾向于通过舍去稀有类来泛化模型。一个简单的最佳实践是建立n个模型,每个模型使用稀有类别的所有样本和丰富类别的n个不同样本。假设想要合并10个模型,那么将保留例如1000例稀有类别,并随机抽取10000例丰富类别。然后,只需将10000个案例分成10块,并训练10个不同的模型。

机器学习正负不均衡问题

如果拥有大量数据,这种方法是简单并且是可横向扩展的,这是因为可以在不同的集群节点上训练和运行模型。集合模型也趋于泛化,这使得该方法易于处理。

6.用不同比例重新采样

如果10个模型被训练,有一个模型比例为1:1(稀有:丰富)和另一个1:3甚至是2:1的模型都是有意义的。一个类别获得的权重依赖于使用的模型。

机器学习正负不均衡问题

7.多模型Bagging

方法6 虽然能够选出最好的样本数据比例。但是它的鲁棒性不能够保证:它的鲁棒性取决于测试集样本的选取

为了解决上述方法的缺陷,增加模型鲁棒性。为此,参考文章2在 随机森林算法 思想的启发下,想出了在上述方法的基础上,将不同比例下训练出来的模型进行** 多模型Bagging** 操作,具体的步骤如下:

1. 对两类样本选取 N 组不同比例的数据进行训练并测试,得出模型预测的准确率:

P={ Pi | i=1,2,...N }

2. 对上述各模型的准确率进行归一化处理,得到新的权重分布:

Ω={ ωi | i=1,2,...N }

其中:

机器学习正负不均衡问题

3. 按权重分布 Ω 组合多个模型,作为最终的训练器:

对于分类任务:

机器学习正负不均衡问题

对于回归任务:

机器学习正负不均衡问题

8、集群丰富类

Sergey Quora提出了一种优雅的方法,他建议不要依赖随机样本来覆盖训练样本的种类,而是将r个群体中丰富类(样本数量多的类)进行聚类。然后,基于稀有类和仅保留的类别对该模型进行训练。

8.1. 对丰富类进行聚类操作

首先,我们可以对具有大量样本的丰富类进行聚类操作。假设我们使用的方法是 K-Means聚类算法 。此时,我们可以选择K值为稀有类中的数据样本的个数,并将聚类后的中心点以及相应的聚类中心当做富类样本的代表样例,类标与富类类标一致。

机器学习正负不均衡问题

8.2. 聚类后的样本进行有监督学习

经过上述步骤的聚类操作,我们对富类训练样本进行了筛选,接下来我们就可以将相等样本数的K个正负样本进行有监督训练。如下图所示:

机器学习正负不均衡问题

8、设计适用于不平衡数据集的模型

所有之前的方法都集中在数据上,并将模型保持为固定的组件。但事实上,如果设计的模型适用于不平衡数据,则不需要重新采样数据,著名的XGBoost已经是一个很好的起点,因此设计一个适用于不平衡数据集的模型也是很有意义的。