如何解决样本不均衡的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何解决样本不均衡的问题相关的知识,希望对你有一定的参考价值。

参考技术A

机器学习面试题中有这么一道题:如果正样本有10000,负样本有1000,该怎么训练? 这个问题属于机器学习样本训练中的样本不均衡问题。经过资料的查找,大概分为如下几类:

1. 产生新数据型:过采样小样本(SMOTE),欠采样大样本。
过采样是通过增加样本中小类样本的数据量来实现样本均衡。其中较为简单的方式是直接复制小类样本,形成数量上的均衡。这种方法实现简单,但会由于数据较为单一而容易造成过拟合。 SMOTE过采样算法: 针对少数类样本的xi,求出其k近邻。随机选取k紧邻中一个样本记为xn。生成一个0到1之间的随机数r,然后根据Xnew = xi + r * (xn - xi)生成新数据。也可通过经过改进的抽样的方法,在少数类中加入随机噪声等生成数据。

欠采样大样本是通过减少多数类样本的样本数量来实现样本均衡。其中比较简单直接的方法就是随机去掉一些数据来减少多数类样本的规模,但这种方法可能会丢失一些重要的信息。还有一种方法就是,假设少数类样本数量为N,那就将多数类样本分为N个簇,取每个簇的中心点作为多数类的新样本,再加上少数类的所有样本进行训练。这样就可以保证了多数类样本在特征空间的分布特性。

2. 对原数据的权值进行改变
通过改变多数类样本和少数类样本数据在训练时的权重来解决样本不均衡的问题,是指在训练分类器时,为少数类样本赋予更大的权值,为多数类样本赋予较小的权值。例如scikit-learn中的SVM算法,也称作penalized-SVM,可以手动设置权重。若选择balanced,则算法会设定样本权重与其对应的样本数量成反比。

3. 通过组合集成方法解决
通过训练多个模型的方式解决数据不均衡的问题,是指将多数类数据随机分成少数类数据的量N份,每一份与全部的少数类数据一起训练成为一个分类器,这样反复训练会生成很多的分类器。最后再用组合的方式(bagging或者boosting)对分类器进行组合,得到更好的预测效果。简单来说若是分类问题可采用投票法,预测问题可以采用平均值。这个解决方式需要很强的计算能力以及时间,但效果较好,相当于结合了组合分类器的优势。

4. 通过特征选择
在样本数据较为不均衡,某一类别数据较少的情况下,通常会出现特征分布很不均衡的情况。例如文本分类中,有大量的特征可以选择。因此我们可以选择具有显著区分能力的特征进行训练,也能在一定程度上提高模型的泛化效果。

如何解决样本不均衡问题

解决样本不均衡的问题很多,主流的几个如下:

1.样本的过采样和欠采样。

2..使用多个分类器进行分类。

3.将二分类问题转换成其他问题。

4.改变正负类别样本在模型中的权重。

 

 

一、样本的过采样和欠采样。

1.过采样:将稀有类别的样本进行复制,通过增加此稀有类样本的数量来平衡数据集。该方法适用于数据量较小的情况。

2.欠抽样:从丰富类别的样本中随机选取和稀有类别相同数目的样本,通过减少丰富类的样本量啦平衡数据集。该方法适用于数据量较大的情况。

3.也可以将过采样和欠采样结合在一起使用。

4.使用SMOTE方法来构造样本。

  SMOTE算法是一种过采样的算法。这个算法不是简单的复制已有的数据,而是在原有数据基础上,通过算法产生新生数据。

  算法思想:基于距离度量的方式计算两个或多个稀有类样本之间的相似性。

       然后选择其中的一个样本作为基础样本,

       再在邻居样本中随机选取一定数量的样本对那个基础样本的一个属性进行噪声。每次处理一个属性,通过这样的方式产生新生数据。

二、使用多个分类器进行分类。

  方法一中介绍的过采样,欠采样,都存在相应的问题。

  过采样:可能会存在过拟合问题。(可以使用SMOTE算法,增加随机的噪声的方式来改善这个问题)

  欠采样:可能会存在信息减少的问题。因为只是利用了一部分数据,所以模型只是学习到了一部分模型。

  有以下两种方法可以解决欠采样所带来的问题。

  方法一:模型融合 (bagging的思想 )

  思路:从丰富类样本中随机的选取(有放回的选取)和稀有类等量样本的数据。和稀有类样本组合成新的训练集。这样我们就产生了多个训练集,并且是互相独立的,然后训练得到多个分类器。

     若是分类问题,就把多个分类器投票的结果(少数服从多数)作为分类结果。

     若是回归问题,就将均值作为最后结果。

  方法二:增量模型 (boosting的思想)

  思路:使用全部的样本作为训练集,得到分类器L1

     从L1正确分类的样本中和错误分类的样本中各抽取50%的数据,即循环的一边采样一个。此时训练样本是平衡的。训练得到的分类器作为L2.

     从L1和L2分类结果中,选取结果不一致的样本作为训练集得到分类器L3.

     最后投票L1,L2,L3结果得到最后的分类结果。

三、将二分类问题转换成其他问题。

  可以将不平衡的二分类问题转换成异常点检测,或者一分类问题(可使用one-class svm建模)

四、改变正负类别样本在模型中的权重。

  使用代价函数学习得到每个类的权值,大类的权值小,小类的权值大。刚开始,可以设置每个类别的权值与样本个数比例的倒数,然后可以使用过采样进行调优。

五、注意点:

  1.不平衡问题的评价指标

  准确度这个评价指标在类别不均衡的分类任务中并不能work。几个比传统的准确度更有效的评价指标:

  混淆矩阵(Confusion Matrix):使用一个表格对分类器所预测的类别与其真实的类别的样本统计,分别为:TP、FN、FP与TN。
  精确度(Precision)
  召回率(Recall)
  F1得分(F1 Score):精确度与找召回率的加权平均。
??特别是:

  Kappa (Cohen kappa)
  ROC曲线(ROC Curves):见Assessing and Comparing Classifier Performance with ROC Curves

  2.交叉验证

  在K-Fold 校验中,每一份数据集中原则上应该保持类别样本比例一样或者近似,如果每份数据集中小类样本数目过少,那么应该降低K的值,知道小类样本的个数足够。

以上是关于如何解决样本不均衡的问题的主要内容,如果未能解决你的问题,请参考以下文章

解决样本类别分布不均衡的问题

[1] 样本不均衡问题及其解决办法

[2] 样本不均衡问题及其解决办法

[一起面试AI]NO.10 什么是数据不平衡问题,应该如何解决

一文解决样本不均衡(全)

机器学习sklearn----支持向量机SVC中的样本不均衡问题