为什么训练数据不平衡时会出现问题?

  数据不平衡问题主要存在于有监督机器学习任务中。当遇到不平衡数据时,以总体分类准确率为学习目标的传统分类算法会过多地关注多数类,从而使得少数类样本的分类性能下降,所以绝大多数常见的机器学习算法对于不平衡数据集都不能很好地工作。

  总结来说,出现样本不平衡问题的本质原因是模型在训练时优化的目标函数和在测试时使用的评价标准不一致。这种“不一致”可能是由于:

1、 训练数据的样本分布与测试时期望的不一样。

例如,训练时优化的是整个训练集(正负样本比例可能是1:99)的正确率,而测试时可能想要模型在正样本和负样本上的平均正确率尽可能大(实际上期望正负样本比例是1:1)。

2、 训练阶段不同类别的权重与测试阶段不一致。

例如,训练时认为所有样本的贡献是相等的,而测试时假阳性样本和假阴性样本有着不同的代价。

样本不平衡的处理方式

  一般可以从以下角度来处理样本不平衡问题:数据采样、算法模型。

A. 数据采样

  采样分为过采样和欠采样,过采样是把小众类复制多份,欠采样是从大众类中剔除一些样本,或者说只从大众类中选取部分样本。

1.欠采样

1.1 随机欠采样

  欠采样是从多数类样本中随机选择(有放回或无放回)少量样本,再合并原有少数类样本作为新的训练数据集。

通过设置RandomUnderSampler中的replacement=True参数, 可以实现自助法(boostrap)抽样。

优点:

  • 平衡数据的同时减小了数据量,可加速训练,尤其是当样本集规模很大的时候。

缺点:

  • 数据减少会影响模型的特征学习能力和泛化能力:丢弃一些样本,可能会损失部分有用的信息,造成模型只学到了整体模式的一部分。
1.2 Informed Undersampling

  对于欠采样,可以采用 Informed Undersampling 来解决由于随机欠采样带来的数据丢失问题。常见的Informed Undersampling 算法有:Easy Ensemble、Balanced Cascade、NearMiss、One-sided Selection等算法。

1.2-1 Easy Ensemble

样本不平衡的loss解决方法python 样本数据不平衡_样本集 中随机抽取一个子集 样本不平衡的loss解决方法python 样本数据不平衡_数据集_02样本不平衡的loss解决方法python 样本数据不平衡_样本集_03),然后用数据集 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_04

样本不平衡的loss解决方法python 样本数据不平衡_数据集_05

from imblearn.ensemble import EasyEnsemble
1.2-2 Balanced Cascade

样本不平衡的loss解决方法python 样本数据不平衡_样本集 中随机抽取子集 样本不平衡的loss解决方法python 样本数据不平衡_数据集_02,用 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_04 训练该级的分类器,然后将 样本不平衡的loss解决方法python 样本数据不平衡_样本集 中能被当前分类器正确判别的样本剔掉,继续下一级的操作,重复若干次得到级联结构,最终的输出结果也是各级分类器结果的融合。

样本不平衡的loss解决方法python 样本数据不平衡_样本集_10

from imblearn.ensemble import BalanceCascade
1.2-3 NearMiss

  NearMiss本质上是一种原型选择(prototype selection)方法,即从多数类样本中选取最具代表性的样本用于训练,主要是为了缓解随机欠采样中的信息丢失问题。NearMiss采用一些启发式的规则来选择样本,根据规则的不同可分为3类:

  • NearMiss-1:选择到最近的K个少数类样本平均距离最近的多数类样本
  • NearMiss-2:选择到最远的K个少数类样本平均距离最近的多数类样本
  • NearMiss-3:对于每个少数类样本选择K个最近的多数类样本,目的是保证每个少数类样本都被多数类样本包围

缺点:

  • NearMiss-1和NearMiss-2的计算开销很大,因为需要计算每个多类别样本的K近邻点。
  • NearMiss-1易受离群点的影响,相比之下NearMiss-2和NearMiss-3不易产生这方面的问题。
from imblearn.under_sampling import NearMiss

2. 过采样

2.1 随机过采样

  过采样是从少数类样本集中随机重复抽取样本(有放回)以得到更多样本。

from imblearn.over_sampling import RandomOverSampler

优点:

  • 没有导致数据信息损失,实际操作中一般效果也好于欠采样。

缺点:

  • 扩大了数据规模,增加了模型训练的复杂度,容易造成过拟合。
2.2 数据扩充

  对少数类样本进行一些噪声扰动或换边以构造出新的样本。

2.3-1 SMOTE(Synthetic Minority Oversampling Technique,合成少数类过采样技术)

样本不平衡的loss解决方法python 样本数据不平衡_数据集_11

a. 对少数类中每一个样本 样本不平衡的loss解决方法python 样本数据不平衡_数据_12,以欧氏距离为标准计算它到少数类样本集中所有样本的距离,得到其 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_13 个近邻:样本不平衡的loss解决方法python 样本数据不平衡_样本集_14

b. 根据样本不平衡比例设置一个采样比例以确定采样倍率 样本不平衡的loss解决方法python 样本数据不平衡_样本集_15,对于每一个少数类样本 样本不平衡的loss解决方法python 样本数据不平衡_数据_12,从其 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_13

c. 对于每一个随机选择出来的近邻 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_18,分别与原样本按照公式 样本不平衡的loss解决方法python 样本数据不平衡_数据集_19生成新样本。

from imblearn.over_sampling import SMOTE

优点:

  • 通过人工构造相似样本取代直接复制的方法减弱了过拟合,也没有丢失有用的信息。

缺点:

  • 在数据维度很高时,效率很低;
  • 人工合成样本时没有考虑近邻样本可能来自不同类别,导致增大类别间重叠;
  • 为每一个少数类样本合成相同数量的新样本,可能会增大类间重叠率,并且会生成一些不能提供有益信息的样本。
2.3-2 Borderline-SMOTE

  Borderline-SMOTE对SMOTE作了改进,只给那些处在分类边界上的少数类样本合成新样本。具体地:将少数类样本分为三类,

  • safe:选取的少数类样本周围也都是少数类样本,新合成的样本不会提供太多有用信息。
  • noise:选取的少数类样本周围都是多数类样本,这类的样本可能是噪音,新合成的样本会与周围的多数类样本产生大部分重叠,致使分类困难。
  • danger:近邻样本中超过一半为多数类样本。

  处于”danger“状态的样本代表靠近”边界“附近的少数类样本,而处于边界附近的样本往往更容易被误分类。Border-line SMOTE算法只会从处于”danger“状态的样本中随机选择,然后用SMOTE算法产生新的样本。

样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_20


Border-line SMOTE 分为两种:

  • Borderline-1 SMOTE:在合成样本时选出的 k 近邻样本 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_21
  • Borderline-2 SMOTE:在合成样本时选出的 k 近邻样本 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_21
2.4 ADASYN,自适应合成抽样

a. 计算需要合成的样本数量:
样本不平衡的loss解决方法python 样本数据不平衡_样本集_23

其中,样本不平衡的loss解决方法python 样本数据不平衡_样本集_24 是多数类样本数量,样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_25 是少数类样本数量,样本不平衡的loss解决方法python 样本数据不平衡_数据_26 为随机数,若 样本不平衡的loss解决方法python 样本数据不平衡_数据_27,采样后正负比例为 1:1。

b. 对每个少数类样本 样本不平衡的loss解决方法python 样本数据不平衡_样本集_28,计算 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_13 近邻中多数类占比:样本不平衡的loss解决方法python 样本数据不平衡_样本集_30。其中 样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_31样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_13

c. 对 样本不平衡的loss解决方法python 样本数据不平衡_数据_33 标准化:
样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_34

d. 根据样本权重,计算每个少数类样本需生成的样本数:样本不平衡的loss解决方法python 样本数据不平衡_数据集_35

e. 对每个少数类样本 样本不平衡的loss解决方法python 样本数据不平衡_数据_12,根据SMOTE算法生成样本:样本不平衡的loss解决方法python 样本数据不平衡_样本集_37。其中,样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_38样本不平衡的loss解决方法python 样本数据不平衡_数据_12样本不平衡的loss解决方法python 样本数据不平衡_1024程序员节_13

样本不平衡的loss解决方法python 样本数据不平衡_样本集_41

from imblearn.over_sampling import ADASYN

缺点:

  • 易受离群点的影响。

3. 基于聚类的采样

a. 对不同的类别分别进行聚类,一般样本较多的类聚类中心数目较多;

b. 对每个分别类进行过采样或欠采样,使得原始类别中所有cluster有相同数目的样本。

优点:

  • 缓解类间、类内不平衡问题;

缺点:

  • 容易使模型对训练数据过拟合。

B. 算法

1. 改变模型训练时的目标函数

  改变模型训练时的目标函数来矫正这种不平衡性。例如代价敏感学习中不同类别不同权重。模型上选对样本不均衡问题不敏感的模型,如决策树;或者调整分类阈值,使得更倾向与类别少的数据。

2. 问题转化

  样本数目极不平衡时,将问题转化为单类学习(One Class Learning)、异常检测(Novelty Detection)。

  异常点检测的目的是找出数据集中和大多数数据不同的数据。常见的异常点检测算法有三种情况:一是在做特征工程的时候需要对异常的数据做过滤,防止对归一化等处理的结果产生影响;二是对没有标记输出的特征数据做筛选,找出异常的数据;三是对有标记输出的特征数据做二分类时,由于某些类别的训练样本非常少,类别严重不平衡,此时也可以考虑用非监督的异常点检测算法来做。

one-class SVM

样本不平衡的loss解决方法python 样本数据不平衡_数据_42

  One Class SVM 是指你的训练数据只有一类正(或者负)样本的数据, 而没有另外的一类。在这时,你需要学习的实际上你训练数据的边界,此时不能使用最大化软边缘了,因为没有两类的数据。假设最好的边缘要远离特征空间中的原点。左边是在原始空间中的边界,可以看到有很多的边界都符合要求,但是比较靠谱的是找一个比较紧的边界(红色的)。这个目标转换到特征空间就是找一个离原点比较远的边界,同样是红色的直线。当然这些约束条件都是人为加上去的,你可以按照你自己的需要采取相应的约束条件,比如让你data 的中心离原点最远。

  利用One-Class SVM,它有能力捕获数据集的形状,因此对于强非高斯数据有更加优秀的效果,例如两个截然分开的数据集。严格来说,一分类的SVM并不是一个异常点监测算法,而是一个奇异点检测算法:它的训练集不能包含异常样本,否则的话,可能在训练时影响边界的选取。但是,对于高维空间中的样本数据集,如果它们做不出有关分布特点的假设,One-class SVM将是一大利器。

样本不平衡时算法的评价指标

样本不平衡的loss解决方法python 样本数据不平衡_数据_43

  ROC曲线和PR(Precision - Recall)曲线皆为类别不平衡问题中常用的评估方法。

ROC

优点:

  • 兼顾正例和负例的权衡。因为TPR聚焦于正例,FPR聚焦于与负例,使其成为一个比较均衡的评估方法。
  • ROC曲线选用的两个指标都不依赖于具体的类别分布。TPR用到的TP和FN同属P列,FPR用到的FP和TN同属N列,所以即使P或N的整体数量发生了改变,也不会影响到另一列。

缺点:
在类别不平衡的背景下,负例的数目众多致使FPR的增长不明显,导致ROC曲线呈现一个过分乐观的效果估计。ROC曲线的横轴采用FPR,根据FPR = FP/N = FP/(FP+TN),当负例N的数量远超正例P时,FP的大幅增长只能换来FPR的微小改变。结果是虽然大量负例被错判成正例,在ROC曲线上却无法直观地看出来。

PR

  • Precision使用的TP和FP就分属两列,则易受类别分布改变的影响。负例的大幅增长将带来PR曲线的大幅下降。
  • PR曲线的两个指标都聚焦于正例。类别不平衡问题中由于主要关心正例,所以在此情况下PR曲线被广泛认为优于ROC曲线。