做者:无影随想
时间:2016年1月。
出处:https://zhaokv.com/machine_learning/2016/01/learning-from-imbalanced-data.html
声明:版权全部,转载请注明出处html
这几年来,机器学习和数据挖掘很是火热,它们逐渐为世界带来实际价值。与此同时,愈来愈多的机器学习算法从学术界走向工业界,而在这个过程当中会有不少困难。数据不平衡问题虽然不是最难的,但绝对是最重要的问题之一。算法
在学术研究与教学中,不少算法都有一个基本假设,那就是数据分布是均匀的。当咱们把这些算法直接应用于实际数据时,大多数状况下都没法取得理想的结果。由于实际数据每每分布得很不均匀,都会存在“长尾现象”,也就是所谓的“二八原理”。下图是新浪微博交互分布状况:dom
能够看到大部分微博的总互动数(被转发、评论与点赞数量)在0-5之间,交互数多的微博(多于100)很是之少。若是咱们去预测一条微博交互数所在档位,预测器只须要把全部微博预测为第一档(0-5)就能得到很是高的准确率,而这样的预测器没有任何价值。那如何来解决机器学习中数据不平衡问题呢?这即是这篇文章要讨论的主要内容。机器学习
严格地讲,任何数据集上都有数据不平衡现象,这每每由问题自己决定的,但咱们只关注那些分布差异比较悬殊的;另外,虽然不少数据集都包含多个类别,但这里着重考虑二分类,由于解决了二分类中的数据不平衡问题后,推而广之就能获得多分类状况下的解决方案。综上,这篇文章主要讨论如何解决二分类中正负样本差两个及以上数量级状况下的数据不平衡问题。学习
不平衡程度相同(即正负样本比例相似)的两个问题,解决的难易程度也可能不一样,由于问题难易程度还取决于咱们所拥有数据有多大。好比在预测微博互动数的问题中,虽然数据不平衡,但每一个档位的数据量都很大——最少的类别也有几万个样本,这样的问题一般比较容易解决;而在癌症诊断的场景中,由于患癌症的人原本就不多,因此数据不但不平衡,样本数还很是少,这样的问题就很是棘手。综上,能够把问题根据难度从小到大排个序:大数据+分布均衡<大数据+分布不均衡<小数据+数据均衡<小数据+数据不均衡。对于须要解决的问题,拿到数据后,首先统计可用训练数据有多大,而后再观察数据分布状况。经验代表,训练数据中每一个类别有5000个以上样本,数据量是足够的,正负样本差一个数量级之内是能够接受的,不太须要考虑数据不平衡问题(彻底是经验,没有理论依据,仅供参考)。大数据
解决这一问题的基本思路是让正负样本在训练过程当中拥有相同的话语权,好比利用采样与加权等方法。为了方便起见,咱们把数据集中样本较多的那一类称为“大众类”,样本较少的那一类称为“小众类”。rest
采样方法是经过对训练集进行处理使其从不平衡的数据集变成平衡的数据集,在大部分状况下会对最终的结果带来提高。htm
采样分为上采样(Oversampling)和下采样(Undersampling),上采样是把小种类复制多份,下采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。图片
随机采样最大的优势是简单,但缺点也很明显。上采样后的数据集中会反复出现一些样本,训练出来的模型会有必定的过拟合;而下采样的缺点显而易见,那就是最终的训练集丢失了数据,模型只学到了整体模式的一部分。资源
上采样会把小众样本复制多份,一个点会在高维空间中反复出现,这会致使一个问题,那就是运气好就能分对不少点,不然分错不少点。为了解决这一问题,能够在每次生成新数据点时加入轻微的随机扰动,经验代表这种作法很是有效。
由于下采样会丢失信息,如何减小信息的损失呢?第一种方法叫作EasyEnsemble,利用模型融合的方法(Ensemble):屡次下采样(放回采样,这样产生的训练集才相互独立)产生多个不一样的训练集,进而训练多个不一样的分类器,经过组合多个分类器的结果获得最终的结果。第二种方法叫作BalanceCascade,利用增量训练的思想(Boosting):先经过一次下采样产生训练集,训练一个分类器,对于那些分类正确的大众样本不放回,而后对这个更小的大众样本下采样产生训练集,训练第二个分类器,以此类推,最终组合全部分类器的结果获得最终结果。第三种方法是利用KNN试图挑选那些最具表明性的大众样本,叫作NearMiss,这类方法计算量很大,感兴趣的能够参考“Learning from Imbalanced Data”这篇综述的3.2.1节。
数据合成方法是利用已有样本生成更多样本,这类方法在小数据场景下有不少成功案例,好比医学图像分析等。
其中最多见的一种方法叫作SMOTE,它利用小众样本在特征空间的类似性来生成新样本。对于小众样本$x_i\in S_{\min}$,从它属于小众类的K近邻中随机选取一个样本点$\hat{x}_i$,生成一个新的小众样本$x_{new}$:$x_{new}=x_i+(\hat{x}-x_i)\times\delta$,其中$\delta\in[0,1]$是随机数。
上图是SMOTE方法在$K=6$近邻下的示意图,黑色方格是生成的新样本。
SMOTE为每一个小众样本合成相同数量的新样本,这带来一些潜在的问题:一方面是增长了类之间重叠的可能性,另外一方面是生成一些没有提供有益信息的样本。为了解决这个问题,出现两种方法:Borderline-SMOTE与ADASYN。
Borderline-SMOTE的解决思路是寻找那些应该为之合成新样本的小众样本。即为每一个小众样本计算K近邻,只为那些K近邻中有一半以上大众样本的小众样本生成新样本。直观地讲,只为那些周围大部分是大众样本的小众样本生成新样本,由于这些样本每每是边界样本。肯定了为哪些小众样本生成新样本后再利用SMOTE生成新样本。
ADASYN的解决思路是根据数据分布状况为不一样小众样本生成不一样数量的新样本。首先根据最终的平衡程度设定总共须要生成的新小众样本数量$G$,而后为每一个小众样本$x_i$计算分布比例$\Gamma_i$:$\Gamma_i=\frac{\Delta_i/K}{Z}$,其中$\Gamma_i$是$x_i$K近邻中大众样本的数量,$Z$用来归一化使得$\sum\Gamma_i=1$,最后为小众样本$x_i$生成新样本的个数为$g_i=\Gamma_i\times G$,肯定个数后再利用SMOTE生成新样本。
除了采样和生成新数据等方法,咱们还能够经过加权的方式来解决数据不平衡问题,即对不一样类别分错的代价不一样,以下图:
k | C(k,1) | C(k,2) | ... | 0 |
1 | 2 | ... | k | |
1 | 0 | C(1,2) | ... | C(1,k) |
2 | C(2,1) | 0 | ... | ... |
... | ... | ... | ... | ... |
横向是真实分类状况,纵向是预测分类状况,C(i,j)是把真实类别为j的样本预测为i时的损失,咱们须要根据实际状况来设定它的值。
这种方法的难点在于设置合理的权重,实际应用中通常让各个分类间的加权损失值近似相等。固然这并非通用法则,仍是须要具体问题具体分析。
对于正负样本极不平衡的场景,咱们能够换一个彻底不一样的角度来看待问题:把它看作一分类(One Class Learning)或异常检测(Novelty Detection)问题。这类方法的重点不在于捕捉类间的差异,而是为其中一类进行建模,经典的工做包括One-class SVM等。
解决数据不平衡问题的方法有不少,上面只是一些最经常使用的方法,而最经常使用的方法也有这么多种,如何根据实际问题选择合适的方法呢?接下来谈谈一些个人经验。
在正负样本都很是之少的状况下,应该采用数据合成的方式;在负样本足够多,正样本很是之少且比例及其悬殊的状况下,应该考虑一分类方法;在正负样本都足够多且比例不是特别悬殊的状况下,应该考虑采样或者加权的方法。
采样和加权在数学上是等价的,但实际应用中效果却有差异。尤为是采样了诸如Random Forest等分类方法,训练过程会对训练集进行随机采样。在这种状况下,若是计算资源容许上采样每每要比加权好一些。
另外,虽然上采样和下采样均可以使数据集变得平衡,而且在数据足够多的状况下等价,但二者也是有区别的。实际应用中,个人经验是若是计算资源足够且小众类样本足够多的状况下使用上采样,不然使用下采样,由于上采样会增长训练集的大小进而增长训练时间,同时小的训练集很是容易产生过拟合。对于下采样,若是计算资源相对较多且有良好的并行环境,应该选择Ensemble方法。
更多细节与更多方法能够参考TKDE上的这篇综述:“Learning from Imbalanced Data”。