Python机器学习算法与实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

3.5 数据平衡方法

大多数情况下,使用的数据集是不完美的,会出现各种各样的问题,尤其针对分类问题时,可能会出现类别不平衡的问题。例如,在垃圾邮件分类时,垃圾邮件数据会有较少的样本量,从而导致两种类型的邮件数据量差别很大;在欺诈监测数据集中,往往包含的欺诈样本并没有那么多。在处理这类数据集的分类时,需要对数据集的类不平衡问题进行处理。解决数据不平衡问题常用的方法如下。

(1)过采样:针对稀有类样本数据进行复制,如原始训练集中包含100个正样本,1000个负样本,可采用某种方式对正样本进行复制,以达到1000个正样本。

(2)欠采样:随机剔除数量多的样本,如原始训练集中包含100个正样本,1000个负样本,可采用某种方式对负样本进行随机剔除,只保留100个负样本。

(3)欠采样和过采样的综合方法:针对稀有类样本数据进行复制,剔除数量多的样本,最终保持两类数据的样本量基本一致。

(4)阈值移动:该方法不涉及采样,而是根据输出值返回决策分类,如朴素贝叶斯方法,可以通过调整判别正负类的阈值来调整分类结果。如原始结果输出概率>0.5,则分类为1,可以将阈值从0.5提高到0.6,只有当预测概率>0.6时,才判定类别为1。

前面的4种数据平衡方法,都不涉及对分类模型的改变,其中过采样和欠采样只改变训练集中数据样本的分布;阈值移动只对新数据分类时模型如何做出决策有影响。使用采样技术平衡数据时,也会存在多种变形,可能会因为增加或者减少数据的不同方式而存在差异。如SMOTE算法使用过采样的方式平衡数据,当原始训练集中包含100个正样本和1 000个负样本,算法会把靠近给定的正元组的部分生成新的数据添加到训练集中。

Python的imblearn库是专门用来处理数据不平衡问题的库。下面通过imblearn库使用上述前3种方式,处理数据中的不平衡问题。首先准备不平衡的数据,这些数据是前面使用的酒数据的主成分特征,使用make_imbalance()函数,分别从数据中每类抽取30、70和20个样本,从而获得一个各类数据较不平衡的新数据。

3.5.1 基于过采样算法

针对数据平衡方法——过采样,主要介绍KMeansSMOTE、SMOTE和SVMSMOTE这3种方式的使用,这些方法都是使用特定的方式增加样本数量较少类别的数据量,从而使3种数据的样本比例接近1:1:1。3种方法的使用程序如下:

从上面的输出结果可以发现,3种数据的类别比例接近1:1:1,但是只有SMOTE方式的比例是1:1:1。下面将3种方式获得的数据在二维空间中进行可视化,分析3种方式的数据分布和原始数据分布之间的差异,程序如下,程序运行后的结果如图3-23所示。

图3-23 不同的过采样算法得到的数据分布

从图3-23中可以发现,3种过采样算法都是在少样本的数据类周围生成新的样本数量,但是不同的算法生成的样本位置有些差异。

3.5.2 基于欠采样算法

针对数据平衡方法——欠采样,主要介绍CondensedNearestNeighbour、AllKNN和NearMiss共3种方式的使用,这些方式都是使用特定的方法减少样本数量较多类别的样本量,从而使3种数据的样本比例接近1:1:1。3种方式的使用程序如下:

从上面的输出结果可以发现,3种数据的样本比例接近1:1:1,但是只有NearMiss方法的比例是1:1:1。下面将3种方式获得的数据在二维空间中进行可视化,分析3种方式的数据分布和原始数据分布之间的差异,程序如下,程序运行后的结果如图3-24所示。

图3-24 不同欠采样算法得到的数据分布

从图3-24中可以发现,3种欠采样算法都是减少样本量较多的数据样本,但是不同的算法减去的样本位置和数量有差异。

3.5.3 基于过采样和欠采样的综合算法

针对数据平衡方法——过采样和欠采样的综合,这里主要介绍SMOTEENN和SMOTETomek两种方式的使用,这两种方式都是使用特定的方法减少样本数量较多类别的数据量,增加样本数量较少类别的数据量,从而使3种数据的类别比例接近1:1:1。两种方式的使用程序如下:

从上面的输出结果可以发现,3种数据的类别比例接近1:1:1,但是只有SMOTETomek方式的比例是1:1:1。下面将两种方式获得的数据在二维空间中进行可视化,分析两种方式的数据分布和原始数据分布之间的差异,程序如下,程序运行后的结果如图3-25所示。

图3-25 不同综合采样算法得到的数据分布